Algorithm 在2D网格中收集最大数量硬币的*搜索启发式算法?

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.

给定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. 
下面是一个示例(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

111,X,X,010

0,X,0,X,X,0,X,0

0,X,0111,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
最小化d将产生最大数量的1

关于启发式,为了确保最优解,我们需要
h
可容许,我们可以通过以下方式定义
h
h(s)=-56
(您的网格是7x8),
h(s)=56-s.ones
甚至
h(s)=网格中的数字-s.ones
(尽管后者意味着我们事先知道有多少个
1

但是这不适用于*因为:

  • 当A*的目标是避免以下情况时,我们希望探索所有路径/状态:
  • 我们将自己暴露在循环中(我们会贪婪地吃到……很久)。这是一种症状,在最短路径问题(具有正加权边)中不会发生,因为循环总是导致较长的路径被丢弃
  • 我们想要的本质上是一个最长路径问题,而不是最短路径问题(例如到D的欧几里德距离vs最大化1的数量(或条件为1的访问状态的数量))
恐怕A*不会产生令人满意的结果。 一个更简单的网格(从您的示例中提取)显示问题:

0 , 1 , 0
0 , X , 0
S , X , 1
0 , 0 , D 
上面的路径较长(就访问的方块而言),但是最佳路径


通过将访问的路径/状态存储到每个状态(以避免循环),您始终可以强制使用*,但您也可以使用dfs,该dfs具有先取1的邻域的启发性

注意,在您的示例中,只有一条路径。您可能希望将最下面一行的X替换为0(因此您的粗体路径仍然比另一条路径更受欢迎,该路径较短,但小于1)。如果您注意到第一列的底部和第三列之间存在连接,则还有另一条路径,不过为了简化起见,我将按照说明执行,谢谢。