Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于python的统一代价搜索算法_Python_Algorithm_Search - Fatal编程技术网

基于python的统一代价搜索算法

基于python的统一代价搜索算法,python,algorithm,search,Python,Algorithm,Search,考虑一个状态空间,其中开始状态为2,每个状态k有三个后继状态:数字2k,2k+1,2k+2。从状态k到每个相应子级的成本为k、地面(k/2)、k+2 我想用python实现一个统一的成本搜索算法。目标状态是数字85。取一个数组,最初0表示每个状态(0..85) 从开始状态(2)迭代到目标/2(85/2) 在每个状态下,计算可能的后继者,以及从当前状态移动到那里的成本(当前状态的成本在数组中) 如果您刚才计算的成本低于之前的成本,或者之前的成本为0,请在possions compute更新成本 从

考虑一个状态空间,其中开始状态为2,每个状态
k
有三个后继状态:数字
2k,2k+1,2k+2
。从状态k到每个相应子级的成本为
k、地面(k/2)、k+2


我想用python实现一个统一的成本搜索算法。目标状态是数字85。

取一个数组,最初0表示每个状态(0..85)

从开始状态(2)迭代到目标/2(85/2)

在每个状态下,计算可能的后继者,以及从当前状态移动到那里的成本(当前状态的成本在数组中)

如果您刚才计算的成本低于之前的成本,或者之前的成本为0,请在possions compute更新成本

从目标状态对应的数组中获取成本。如果是0,就不可能到达

代码应该是这样的

import math
goal = 85
state = [-1] * (goal + 1)
state[2] = 0
for k in range(2 , goal/2 + 1):
  if state[k] < 0: continue
  for pos, cost in [
        (k*2, k),
        (k*2 + 1, math.floor(k/2)),
        (k*2+2, k+2)]:
    if pos > goal: continue
    if state[pos] == -1 or state[pos] > state[k] + cost:
      state[pos] = state[k] + cost
      # Possibly store k somewhere to build the solution.
print state[goal]
导入数学
目标=85
状态=[-1]*(目标+1)
状态[2]=0
对于范围内的k(2,目标/2+1):
如果状态[k]<0:继续
对于pos,成本为[
(k*2,k),
(k*2+1,数学层(k/2)),
(k*2+2,k+2)]:
如果位置>目标:继续
如果状态[pos]==-1或状态[pos]>状态[k]+成本:
状态[pos]=状态[k]+成本
#可能将k存储在某个地方以构建解决方案。
打印状态[目标]

要理解从2到85,一种可能性是以下状态转换:2[2k+1]->5[2k]->10[2k+1]->21[2k]->42[2k+1]->85,成本为1+5+5+21+21=51。我对这个问题的理解正确吗?@SaiBot-right,它是正确的。但是我需要python代码,因为手动计算需要花费大量时间!谢谢你的帮助。你能提供python代码吗?我在实施过程中遇到了一些问题。不应列出节点,因为它们是关联的路径成本和节点成本。这对我来说有点复杂。再次发送thx。@Cina已添加,但下次您应该发布代码。