Python 马尔可夫链:找到从A点到B点的最可能路径

Python 马尔可夫链:找到从A点到B点的最可能路径,python,python-3.7,markov-chains,Python,Python 3.7,Markov Chains,我有一个使用字典的转移矩阵 {'hex1':{'hex2':1.0}, 'hex2':{'hex4':0.4,'hex7':0.2,'hex6':0.2,'hex1':0.2}, 'hex4':{'hex3':1.0}, ‘hex3’:{‘hex6’:0.3333333,‘hex2’:0.666666}, ‘hex6’:{‘hex1’:0.3333, “hex4”:0.3333, “hex5”:0.3333}, 'hex7':{'hex6':1.0}, 'hex5':{'hex3':1.0}

我有一个使用字典的转移矩阵

{'hex1':{'hex2':1.0},
'hex2':{'hex4':0.4,'hex7':0.2,'hex6':0.2,'hex1':0.2},
'hex4':{'hex3':1.0},
‘hex3’:{‘hex6’:0.3333333,‘hex2’:0.666666},
‘hex6’:{‘hex1’:0.3333,
“hex4”:0.3333,
“hex5”:0.3333},
'hex7':{'hex6':1.0},
'hex5':{'hex3':1.0}
显示从某个十六进制到另一个十六进制的概率(例如,
hex1
的概率为1到
hex2
hex2
的概率为0.4到
hex4

以起点和终点为例,我想找到概率最高的路径

代码的结构如下所示

def find_most_probability_path(开始_hex、结束_hex、最大路径):
路径=计算从开始到结束的最大概率路径
返回路径
其中max_path是要遍历的最大十六进制数。如果max_路径中没有路径,则返回空/null。此外,如果在到达结束十六进制之前返回到起始十六进制,则删除路径

例如

查找最可能路径(hex2、hex3、5)
>>“hex2,hex4,hex3”

输出可以是一个十六进制列表,也可以只是串联的字符串。

您可以将马尔可夫链视为一个有向加权图,并使用概率作为图边权重

从这一点出发,您可以使用Dijkstra算法从加权图上的两点获得最短路径


我开发了一种算法,但我不知道它的效率,但效果很好

table={'hex1': {'hex2': 1.0},
 'hex2': {'hex4': 0.4, 'hex7': 0.2, 'hex6': 0.2, 'hex1': 0.2},
 'hex4': {'hex3': 1.0},
 'hex3': {'hex6': 0.3333333333333333, 'hex2': 0.6666666666666666},
 'hex6': {'hex1': 0.3333333333333333,
  'hex4': 0.3333333333333333,
  'hex5': 0.3333333333333333},
 'hex7': {'hex6': 1.0},
 'hex5': {'hex3': 1.0}}

def find_most_probable_path(start_hex, end_hex, max_path=0):
    assigned=[start_hex]
    foundTrue=False
    prob=[{"nodes":[start_hex],"prob":1,"length":1}]
    if max_path==0:
        status=False
    else:
        status=True
    while status==True:
        chn=[]
        status=False
        for i in prob:
            if i["length"]<max_path:
                lastElement=i["nodes"][-1]
                for j in table[lastElement]:
                    if j not in assigned:
                        temp=i.copy()
                        js=temp["nodes"].copy()
                        js.append(j)
                        temp["nodes"]=js
                        temp["prob"]=temp["prob"]*table[lastElement][j]
                        temp["length"]+=1
                        #print(temp)
                        chn.append(temp)
                        status=True
        maxv=0
        for i in chn:
            if i["prob"]>=maxv:
                maxv=i["prob"]
                added=i
        if added["nodes"][-1]==end_hex:
            foundTrue=True
            status=False
        assigned.append(added["nodes"][-1])
        prob.append(added)
    if foundTrue==True:
        return prob[-1]["nodes"]
    else:
        return None


print(find_most_probable_path("hex2", "hex3",5))
如果要查看路径的概率,可以更改零件:

if foundTrue==True:
    return prob[-1]["nodes"]
致:

然后程序给出如下输出:

{'nodes': ['hex2', 'hex4', 'hex3'], 'prob': 0.4, 'length': 3}

谢谢你。为了澄清,这是一种蛮力方法,通过迭代所有可能的路径组合来找到最有可能的路径,纠正最短路径中的错误,并创建了类似的算法。这并不是检查所有可能的路径,其主要思想是找到与节点列表相邻的最可能的节点。因此,本质上,你将问题视为图形,类似于另一个答案中提到的Dijkstra?确切地说,它与Dijkstra算法非常相似,但不是最短路径,而是最可能的路径。
if foundTrue==True:
    return prob[-1]
{'nodes': ['hex2', 'hex4', 'hex3'], 'prob': 0.4, 'length': 3}