Optimization 查看状态是否可到达的快速算法

Optimization 查看状态是否可到达的快速算法,optimization,artificial-intelligence,Optimization,Artificial Intelligence,我有一个问题,我有一个二维地图,一个初始状态和一个目标状态(典型的空间状态问题)。我用A*解决了这个问题,我对此没有问题,但我似乎找不到好的算法,用初始状态,目标状态来判断它是否可解(如果目标状态可以从初始状态到达)。更详细地说,这是我用*解决的问题: 0120000000 0111101111 0000100001 0101111101 0101100001 0101101111 0111100111 0000000000 0111010110 0000000110 0120000000 0

我有一个问题,我有一个二维地图,一个初始状态和一个目标状态(典型的空间状态问题)。我用A*解决了这个问题,我对此没有问题,但我似乎找不到好的算法,用初始状态,目标状态来判断它是否可解(如果目标状态可以从初始状态到达)。更详细地说,这是我用*解决的问题:

0120000000 0111101111 0000100001 0101111101 0101100001 0101101111 0111100111 0000000000 0111010110 0000000110 0120000000 0111101111 0000100001 0101111101 0101100001 0101101111 0111100111 0000000000 0111010110 0000000110 其中0=空磁贴,1=阻塞磁贴,2=宝藏,机器人可以位于任何空磁贴中


有什么算法可以做到这一点吗?(最好比A*快)

您可以预处理地图,标记所有连接的组件。然后可达性测试只需要比较标签

void LabelConnectedComponents(常量字符**映射,整数w,整数h)
{
char组件='a';
对于(int y=0;y!=h;++y)
对于(int x=0;x!=w;++x)
{
如果(映射[y][x]=“0”)
洪水填充(地图、w、h、x、y、组件++);
}
}

您可以在此处使用简单的bfs或dfs,从起始节点开始,并保留其邻居,我们可以在其中移动。然后选择一个保留的节点并将其尚未保存的邻居保留在同一集合中,当我们遍历每个节点时,将它们标记为已访问的节点。当我们完成时,我们只检查目标节点是否被标记,就这样。

A*的效率取决于使用的启发式函数。