穷举法
A*算法
每一步只走最好走的路。
优点:计算快,而且这种贪心或者说启发式的算法,通常情况下,效果还是不错的
缺点:不一定能算出最优解
beam search
每一步只走最好走的前N条路。这里的N也叫Beam Width。
Viterbi算法
从后续计算中推导出前一步最优选择
import decimal
a = [[decimal.Decimal('0.5'), decimal.Decimal('0.4'), decimal.Decimal('0.1')],
[decimal.Decimal('0.2'), decimal.Decimal('0.2'), decimal.Decimal('0.6')],
[decimal.Decimal('0.2'), decimal.Decimal('0.5'), decimal.Decimal('0.3')]]
b = [[decimal.Decimal('0.4'), decimal.Decimal('0.6')],
[decimal.Decimal('0.8'), decimal.Decimal('0.2')],
[decimal.Decimal('0.5'), decimal.Decimal('0.5')]]
p = [decimal.Decimal('0.2'), decimal.Decimal('0.5'), decimal.Decimal('0.3')]
white = 0
black = 1
status_list = [0, 1, 0, 0, 1]
count = 1
start = []
for i in status_list:
if count == 1:
for b_son in range(len(b)):
start.append(p[b_son] * b[b_son][i])
else:
tmp_start = []
index = []
for a_son in range(len(a)):
tmp = []
for a_son_son in range(len(a[a_son])):
# print(a[a_son_son][a_son], b[a_son][i], start[a_son_son])
tmp.append(a[a_son_son][a_son] * b[a_son][i] * start[a_son_son])
tmp_max = max(tmp)
# print(tmp.index(tmp_max))
index.append(tmp.index(tmp_max))
tmp_start.append(tmp_max)
start = tmp_start
print(index)
last = i
count -= 1
print(start)