Algorithm 在2D网格中收集最大数量硬币的*搜索启发式算法?
给定NxM网格(起始单元格、目标单元格、无法访问的单元格、有硬币的单元格)的描述,使用a*路径查找算法从起始单元格遍历网格到目标单元格,同时收集与以下约束相关的硬币的最大可能数:Algorithm 在2D网格中收集最大数量硬币的*搜索启发式算法?,algorithm,graph-theory,path-finding,a-star,heuristics,Algorithm,Graph Theory,Path Finding,A Star,Heuristics,给定NxM网格(起始单元格、目标单元格、无法访问的单元格、有硬币的单元格)的描述,使用a*路径查找算法从起始单元格遍历网格到目标单元格,同时收集与以下约束相关的硬币的最大可能数: 1- Use only horizontal and vertical movement, diagonal movement is not allowed. 2- Each cell can be visited at most once. 3- Each cell can have at most 1 coin.
1- Use only horizontal and vertical movement, diagonal movement is not allowed.
2- Each cell can be visited at most once.
3- Each cell can have at most 1 coin.
下面是一个示例(0表示空单元格,1表示带硬币的单元格,X表示无法访问的单元格,S表示开始单元格,D表示目标单元格):
S,X,X,X,X,X,X,X,X
1,X,X,X,X,X,X,X,X
0,X,X,X,X,X,X,X,X
1,1,1,X,X,0,1,0
0,X,0,X,X,0,X,0
0,X,0,1,1,1,X,1
0,1,0,0,0,0,0,0,D
最佳路径单元格为粗体
请注意,我对解决方案的实际实现不感兴趣,我只想得到帮助,找到合适的启发式函数来正确建模此问题。tldr;A*和最大化一个数:可能,但没有好处 第一个问题是定义适当的距离 让状态为网格中的一个位置+拾取的位置数 邻域是不在
X
我们可以摆姿势保持距离
d(a,b) = -(b.ones - a.ones)
- 对于邻居b,如果我们选择a 1,距离是-1
- 如果没有,则选择0
h
可容许,我们可以通过以下方式定义h
h(s)=-56
(您的网格是7x8),h(s)=56-s.ones
甚至h(s)=网格中的数字-s.ones
(尽管后者意味着我们事先知道有多少个1
)
但是这不适用于*因为:
- 当A*的目标是避免以下情况时,我们希望探索所有路径/状态:
- 我们将自己暴露在循环中(我们会贪婪地吃到……很久)。这是一种症状,在最短路径问题(具有正加权边)中不会发生,因为循环总是导致较长的路径被丢弃
- 我们想要的本质上是一个最长路径问题,而不是最短路径问题(例如到D的欧几里德距离vs最大化1的数量(或条件为1的访问状态的数量))
0 , 1 , 0
0 , X , 0
S , X , 1
0 , 0 , D
上面的路径较长(就访问的方块而言),但是最佳路径
通过将访问的路径/状态存储到每个状态(以避免循环),您始终可以强制使用*,但您也可以使用dfs,该dfs具有先取1的邻域的启发性注意,在您的示例中,只有一条路径。您可能希望将最下面一行的X替换为0(因此您的粗体路径仍然比另一条路径更受欢迎,该路径较短,但小于1)。如果您注意到第一列的底部和第三列之间存在连接,则还有另一条路径,不过为了简化起见,我将按照说明执行,谢谢。