游戏链接在这里: http://floodit.appspot.com/
规则很简单,你必须从邻居中选择一种颜色,起点是左上角,然后是颜色变化,你已经淹没了更多的区域。目标是淹没整个网格。
关于此游戏的stackoverflow有一些主题,但我找不到我的问题的答案。我的目标是获得充分利用整个网格的最佳方式。现在我在这个位置上:
我正试图通过A *来解决这个问题。我的启发式是选择颜色,最小化到最远组件的距离(在这种情况下2,4,1,3在图像上有红色,是最远的),如果几种颜色最小化到最远组件之一的距离,那么我选择颜色,其中有大多数点(在这种情况下,我的算法选择“0”,因为它最小化到所有最远节点的距离并且在其中有更多的点,然后是“2”)。
我的老师给了我们最佳解决方案,在这种情况下,他最好的方法是:2,0,1,4,3,2,5;这是另外7个单位。 但根据我的启发式,我选择“0”,最好的方法是:0,2,4,5,3,1,0,2,4;其中9个单位。 任何人都可以回答我,我必须在这个位置选择“2”,而不是“0”吗? 提前谢谢你。
答案 0 :(得分:0)
我认为你将A *算法与一个简单的greedy best-first search混淆,你只需计算启发式h(n)
,它在某种程度上应估算当前状态的成本(或距离)进入目标状态。
在A *中,您正在扩展最小化函数f(n) = g(n) + h(n)
的节点,其中g(n)提供从起始点到当前状态的(路径)成本(并提醒A *可以探索多个方向在状态图before finding the optimal one)上。
在你的情况下,我可以想象g(n)
可以等于从根状态开始的路径长度,因为你对最短路径感兴趣(并且每个新状态的成本为1)。为了找到最佳路径,A *的h(n)永远不会超出最优解。出于这个原因,一个想法可以是用表中残留颜色的数量计算它(实际上你总是需要至少许多移动到达完全着色的最终状态)。
请注意,这种启发式方法的信息量不大,即在融合到解决方案之前,它会扩展许多状态。