<p>对于你所遇到的逻辑难题,使用置换的方法有一个基本问题。问题不在于它们太多,以至于你的解算器不可能在合理的时间内完成。问题是你没有一种自动的方法来检查规则是否存在问题:除非你有一种方法来验证它们,否则把所有的可能性摆在面前是毫无意义的。在</p>
<p>为了解决这些问题,我创建了一个名为谜题求解器的项目:</p>
<ul>
<li><a href="https://github.com/madphysicist/puzzle-solvers" rel="nofollow noreferrer">https://github.com/madphysicist/puzzle-solvers</a></li>
<li><a href="https://pypi.org/project/puzzle-solvers/" rel="nofollow noreferrer">https://pypi.org/project/puzzle-solvers/</a></li>
<li><a href="https://puzzle-solvers.readthedocs.io/en/latest/" rel="nofollow noreferrer">https://puzzle-solvers.readthedocs.io/en/latest/</a></li>
</ul>
<p>这是一个小项目,目前只包含一个感兴趣的类:<a href="https://puzzle-solvers.readthedocs.io/en/latest/elimination.html#puzzle_solvers.elimination.Solver" rel="nofollow noreferrer">^{<cd1>}</a>。这个类实现了解决问题中出现的消除型问题所需的大多数操作。所有的逻辑都是<a href="https://puzzle-solvers.readthedocs.io/en/latest/elimination.html#logic" rel="nofollow noreferrer">documented</a>,而<a href="https://puzzle-solvers.readthedocs.io/en/latest/elimination.html#tutorial" rel="nofollow noreferrer">tutorial</a>则是您确切问题的演练。我将在这里解释基础知识,这样你就可以理解我做了什么,也许还能改进它。在</p>
<p>步骤1是识别队列中的位置是一个属性,就像年龄、姓名等一样,这意味着顺序不再相关。在</p>
<p>第二步是认识到这是一个伪装的图形问题。你有30个节点:5个个体的所有可能属性(其中6个)。这张图一开始几乎完成了。只缺少给定类型属性之间的边,因此从375个边开始,而不是435个完整的边。在</p>
<p>最终目标是在图中五个连接的组件中的每个属性类之间有一条边。因此,最终的边数为5*15=75。在</p>
<p>那么如何去除边缘呢?简单的规则,比如“T恤衫”不是“red”,很简单:只要去掉那个边。像“最后一个排队的人是30岁”这样的规则也很简单,而且从边缘去除的角度来看更有利可图。将删除年龄不在30岁和位置5之间的所有边,以及不在5岁和30岁之间的所有边。我添加了两个半生不熟的实用程序包装器来检查大于和小于条件,并删除表示不可能组合的边。在</p>
<p>解算器最重要的方面是,任何时候移除一条边,它都会完全遵循该操作的逻辑含义。想象一下你有“马球衫是红色、黄色或绿色”,并且你已经在你的谜题中找到了一个与30岁年龄无关的点。这意味着穿马球衫的人不可能是30岁。事实上,这三种颜色都不能与任何颜色的衬衫共享。如果你递归地遵循这些推论,你会得到一个完整的解决方案。在</p>
<p>我为无耻地出售我的包裹感到抱歉,但为了辩护,我写这封信只是为了回答这个问题。在</p>