设计算法寻找最优路径

穷举法

计算所有可能路径
缺点:计算量太大。

A*算法

每一步只走最好走的路。
优点:计算快,而且这种贪心或者说启发式的算法,通常情况下,效果还是不错的
缺点:不一定能算出最优解

beam search

每一步只走最好走的前N条路。这里的N也叫Beam Width。
image.png

Viterbi算法

从后续计算中推导出前一步最优选择

  1. import decimal
  2. a = [[decimal.Decimal('0.5'), decimal.Decimal('0.4'), decimal.Decimal('0.1')],
  3. [decimal.Decimal('0.2'), decimal.Decimal('0.2'), decimal.Decimal('0.6')],
  4. [decimal.Decimal('0.2'), decimal.Decimal('0.5'), decimal.Decimal('0.3')]]
  5. b = [[decimal.Decimal('0.4'), decimal.Decimal('0.6')],
  6. [decimal.Decimal('0.8'), decimal.Decimal('0.2')],
  7. [decimal.Decimal('0.5'), decimal.Decimal('0.5')]]
  8. p = [decimal.Decimal('0.2'), decimal.Decimal('0.5'), decimal.Decimal('0.3')]
  9. white = 0
  10. black = 1
  11. status_list = [0, 1, 0, 0, 1]
  12. count = 1
  13. start = []
  14. for i in status_list:
  15. if count == 1:
  16. for b_son in range(len(b)):
  17. start.append(p[b_son] * b[b_son][i])
  18. else:
  19. tmp_start = []
  20. index = []
  21. for a_son in range(len(a)):
  22. tmp = []
  23. for a_son_son in range(len(a[a_son])):
  24. # print(a[a_son_son][a_son], b[a_son][i], start[a_son_son])
  25. tmp.append(a[a_son_son][a_son] * b[a_son][i] * start[a_son_son])
  26. tmp_max = max(tmp)
  27. # print(tmp.index(tmp_max))
  28. index.append(tmp.index(tmp_max))
  29. tmp_start.append(tmp_max)
  30. start = tmp_start
  31. print(index)
  32. last = i
  33. count -= 1
  34. print(start)