You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用networkx和numpy高效模拟马尔可夫链并追踪状态序列?

马尔可夫链模拟拳手对战的最优方法

你已经基于NetworkX和Numpy定义了拳手对战的马尔可夫链状态与转移矩阵,要实现最快的对战模拟并追踪状态序列,最优方案是直接利用Numpy的随机抽样能力,跳过NetworkX图结构的额外开销——因为转移矩阵已经包含了所有状态转移的概率信息,无需通过图来中转。

核心实现思路

从初始状态开始,每次根据当前状态对应的转移概率行,用np.random.choice抽样得到下一个状态,重复这个过程直到进入吸收状态knockout,同时记录每一步的状态。

最优模拟代码

import numpy as np

# 沿用你定义的状态与转移矩阵
states = ['distance', 'strike', 'knockout']
transition_matrix = np.array([
    [0.85, 0.15, 0],
    [0.98, 0, 0.02],
    [0, 0, 1]
])
# 建立状态到索引的映射,方便快速定位转移概率行
state_to_idx = {state: idx for idx, state in enumerate(states)}

def simulate_fight(start_state='distance'):
    state_sequence = [start_state]
    current_state = start_state
    # 直到进入吸收状态才停止模拟
    while current_state != 'knockout':
        current_idx = state_to_idx[current_state]
        # 根据当前状态的转移概率抽样下一个状态
        next_state = np.random.choice(states, p=transition_matrix[current_idx])
        state_sequence.append(next_state)
        current_state = next_state
    return state_sequence

# 示例运行
fight_sequence = simulate_fight()
print(fight_sequence)

为什么这是最优方案

  • 速度最快:直接操作Numpy数组,避免了NetworkX图结构的构建、遍历等额外开销,尤其是需要多次模拟时,效率优势会非常明显。
  • 逻辑简洁:完全贴合马尔可夫链的核心规则,没有冗余步骤,代码易读易维护。
  • 扩展性强:后续调整状态或转移概率时,只需修改states列表和transition_matrix即可,无需改动模拟逻辑。

若需保留NetworkX图的兼容方案

如果你的场景需要同时用到NetworkX的图分析功能,也可以基于已构建的图来实现模拟,只是效率略低于直接操作矩阵:

import numpy as np
import networkx as nx

# 沿用你已有的状态、转移矩阵和create_graph函数
states = ['distance', 'strike', 'knockout']
transition_matrix = np.array([
    [0.85, 0.15, 0],
    [0.98, 0, 0.02],
    [0, 0, 1]
])

def create_graph(T: np.ndarray) -> nx.DiGraph:
    G = nx.DiGraph()
    G.add_nodes_from(states)
    for i, u in enumerate(states):
        for j, v in enumerate(states):
            p = T[i][j]
            if p > 0:
                G.add_edge(u, v, p=p)
    return G

G = create_graph(transition_matrix)

def simulate_with_graph(start_state='distance'):
    state_sequence = [start_state]
    current_state = start_state
    while current_state != 'knockout':
        # 从图中提取当前状态的邻居节点及对应转移概率
        neighbors = list(G.neighbors(current_state))
        probs = [G[current_state][n]['p'] for n in neighbors]
        next_state = np.random.choice(neighbors, p=probs)
        state_sequence.append(next_state)
        current_state = next_state
    return state_sequence

# 示例运行
fight_sequence_graph = simulate_with_graph()
print(fight_sequence_graph)

内容的提问来源于stack exchange,提问作者HJA24

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 04:02:23