Algorithm 这个益智游戏的Mahattan函数
我正在为这种游戏寻找一个优化的解决方案: 给出一个大小为3 x 5的棋盘游戏。在这个棋盘游戏中。有14个棋子和一个空位(作为15个益智游戏),空位周围的所有棋子都可以移动到这个位置。每件作品将分配一种颜色(可在多件作品上复制) 当最后一行和第一行相同时,游戏结束 例如: 初始状态为:Algorithm 这个益智游戏的Mahattan函数,algorithm,Algorithm,我正在为这种游戏寻找一个优化的解决方案: 给出一个大小为3 x 5的棋盘游戏。在这个棋盘游戏中。有14个棋子和一个空位(作为15个益智游戏),空位周围的所有棋子都可以移动到这个位置。每件作品将分配一种颜色(可在多件作品上复制) 当最后一行和第一行相同时,游戏结束 例如: 初始状态为: | red | red | red | red red | blue | white | blue| blue white| yellow| blue | red | yellow
| red | red | red | red
red | blue | white | blue| blue
white| yellow| blue | red | yellow
有很多方法可以实现这个目标。这是一种方式,需要23步:
red | white | yellow | red | blue
red | blue | red | blue|
red | white | yellow | red | blue
还有其他,只需要16步:
red | blue | red | red | blue
yellow| white | white | | yellow
red | blue | red | red | blue
所以,我需要找到如何使用最小移动来实现最终目标
我尝试(并且认为)使用马哈坦距离来解决这个问题。但我不知道,如何为这个问题定义一个Mahattan函数。有什么想法吗
谢谢:)在每一列中都有一对颜色相同的瓷砖。估计移动次数以使一对特定颜色(如红色)的一种启发式方法是,从顶部瓷砖到最近的红色瓷砖的曼哈顿距离加上从底部瓷砖到最近的红色瓷砖的曼哈顿距离
| red | RED * | red | red
red | blue | white | blue| blue
white| yellow| blue * | RED | yellow
对于第三列中的一对瓷砖(用*
标记),最近的红色瓷砖(大写)的距离为0和1,因此估计值为0+1=1
其他颜色也可以这样做。因为任何颜色都可以,所以对这一对的最终估计是所有颜色的最小值
对于上面黑板的第三列,其他估计值是白色的1+1=2,黄色的2+1=3,蓝色的2+0=2。最小值为1
整个电路板的总估算值是所有对的估算值之和
这是一个相当粗糙的启发。首先,它没有考虑到需要两块颜色相同的不同瓷砖这一事实
一个可能的改进是对这对瓷砖进行双源宽度优先搜索,以找到最接近的两块特定颜色的瓷砖。可以将搜索转换为一个简单的循环,并且可以同时搜索所有颜色。假设我们有此
当前状态
:
| white
red | blue
white | red
blue |
而这个目标状态
:
| white
red | blue
white | red
blue |
然后我们有以下启发:
h = SUM { Manhattan_Distance(x) | x is a unique cell }
例如,在这里,我们有:
xxxx | white
xxxx | xxxx
white | xxxx
xxxx | xxxx
所以曼哈顿距离(白色)=1
xxxx | xxxx
red | xxxx
xxxx | red
xxxx | xxxx
和Manhattan_距离(红色)=2
xxxx | xxxx
xxxx | blue
xxxx | xxxx
blue | xxxx
和Manhattan_距离(蓝色)=1
xxxx | xxxx
red | xxxx
xxxx | red
xxxx | xxxx
所以,h=SUM{1,2,1}=3
相邻州是一个我们可以通过1次合法移动获得的州 我们可以使用
g=min(h)
或者是一个深度为g(x)=h(x)+depth(x)的BFS老实说,我不认为曼哈顿距离与此有多大关系。也许你可以先用宽度search@NiklasB. 你能告诉我更多吗。因为我需要一个成本函数来确定“这个状态有多好”。当我尝试解决
15益智游戏时,我使用Mahattan距离
来查找从当前状态到结束状态的距离(我们可以知道)。所以,我想我也可以通过定义Mahattan距离来解决这个难题。如何使用BFS查找成本函数?谢谢:)你要找的是一个可接受的启发式。这里有一个简单的方法:计算顶行中的磁贴与底行中的磁贴不一致的列数。这是一个有效的移动数下限,因为两行中至少有一行需要更改该列中的平铺才能解决此难题,并且此更改将至少需要一个移动。@j_random_hacker是的,我目前正在将该函数用于我的算法。将上述函数定义为A。状态X值将是:A()+movetogethere()
,但我认为这将使算法“缓慢”进入优化状态。(因为一行只有5个部分,所以值的范围仅为0->5,太小)所以,我认为还有一个更好的函数:)@Havertmous:如果你已经有了一些东西需要改进,那么请在开始时告诉人们,这样他们就不会浪费时间做你已经做过的工作。