我最近一直在玩《Zoombinis的逻辑之旅》的重发行,并尝试实现一些可以解决各种难题的计算机算法。我被卡在如何解决卡琼船长的渡船难题上。
对于那些不熟悉的人,Zoombini是一种具有4种属性的生物:头发,眼睛,鼻子和脚。这些属性中的每一个都有5个可能的值。例如,Zoombini的脚可以是轮子,溜冰鞋,运动鞋,弹簧或螺旋桨。这是Zoombini的例子,头发凌乱,眼镜,鼻子绿色和运动鞋凌乱:
在渡船难题中,任务是在渡船的16个座位上安排16个Zoombinis集合。该布置必须遵守以下规则:任何两个正交相邻的座椅必须由共享至少一个特征的Zoombinis占用。如果两个Zoombinis有不同的发型,不同的眼睛,不同的鼻子,和不同的脚从彼此,他们可能不会坐在旁边给对方。
座位的安排会随着级别的变化而变化;为了具体起见,让我们集中讨论“非常困难”级别,其中16个座位以4×4网格排列。这是合法放置15个Zoombinis的示例,但最终站在码头上的Zoombini不能放在最后一个空座位上,因为她不会与右侧的Zoombini分享任何功能:
有16个!≈21万亿可能的Zoombinis分配给座位。因此,简单地遍历所有可能的任务以查看其是否合法是不现实的。我可以采用哪些启发式方法明智地解决此问题?
Subgraph Isomorphism Problem
。问题是要在另一个图中找到一个图。在您的情况下,子图将是座位(边缘是邻接),而父图将是zoombinis,其中连接将是共享特征的存在。请注意,通常该问题是NP完全的,通常也通过回溯来解决,但是对于某些特殊情况(您的图形很可能是这种情况),多项式甚至线性解都是可能的。