问题标签 [river-crossing-puzzle]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
866 浏览

algorithm - 可能的“船载”

你知道过河的问题。以下是排序说明:

曾几何时,三个食人族正带领三个传教士穿过丛林。他们正在前往最近的宣教站的路上。过了一会儿,他们来到了一条宽阔的河流,那里满是致命的蛇和鱼。没有船就没有办法过河。幸运的是,经过短暂的搜索,他们找到了一艘带有两支桨的划艇。不幸的是,这艘船太小了,无法承载所有人。它一次几乎不能承载两个人。更糟糕的是,由于河流的宽度,没有办法把船拉回来,只能把它划回去。由于传教士无法信任食人族,他们不得不想出一个计划,让他们六个人安全过河。问题是,一旦某个地方的食人族比传教士多,这些食人族就会杀死并吃掉传教士。因此,我们的传教士程序员必须制定一个计划,确保在河的两岸永远不会有少数传教士。然而,可以信任食人族会以其他方式进行合作。具体来说,他们不会放弃任何潜在的食物,就像传教士不会放弃任何潜在的皈依者一样。

我的问题是这个问题的一部分。我正在尝试设计一个返回可能船载列表的函数(例如,如果boat_capacity 为 3,则[(3mis, 0can), (2mis, 1can), (1mis, 1can), ...])。我有num(传教士或食人者的人数)和船容量作为我的职能的输入。

你是如何设计你的函数和算法的?

0 投票
1 回答
582 浏览

java - 过河者的一般 DFS

我正在尝试编写一个 DFS 来解决多个过河问题(Fox Goat Cabbage、Jealous Husbands、Mercenaries and Cannibals 等)。我已经编写了拼图类,但是在构建求解器时遇到了麻烦。我了解 DFS 的工作原理,但我不知道从哪里开始使其适应这种设计。

每个谜题都有一个 move() 方法,如果它是有效的移动,则返回 true,如果它违反规则集,则返回 false。乘客在代表河流每一侧的一对列表中被跟踪。求解器可以访问这些列表,但我不确定如何使用它来生成可能的移动集,因为每次乘客过河时可能的移动都会改变。

0 投票
1 回答
2179 浏览

prolog - 食人者和传教士

我是prolog的新手并开始学习prolog。我发现在序言中解决传教士和食人者的谜题很有趣。我研究了很多论坛,并找到了我认为是一个非常好的解决方案的链接。但是有些我没有得到实际结果。输出的动作似乎是错误的。我试图跟踪程序,在分配值期间一切似乎都很完美,但不知何故,解决方案是错误的。

我需要专家帮助才能知道逻辑错误到底在哪里。

资料来源:http ://www.enrico-franchi.org/2008/12/missionaries-cannibals-and-prolog.html

0 投票
1 回答
494 浏览

haskell - 在我的 Haskell 代码中找不到错误

我试图将卷心菜-山羊-狼难题的(工作!)解决方案从 Scala 转换为 Haskell,但是由于解决方案列表为空,因此调用时代码会抛出并出错headfindSolutions因此问题似乎在循环中的某个地方。findMoves似乎工作正常。

当然,我也会感谢有关与实际错误无关的改进的提示。

[更新]

只是为了记录,我按照建议使用Set. 这是工作代码:

调用headinfindSolution可以更安全,并且应该使用打印出解决方案的更好方法,但除此之外我对它非常满意。

[更新 2]

我认为以前的位置表示对于这类问题不是最理想的。我切换到以下数据模型,这使得移动等更加冗长,但更具可读性:

0 投票
1 回答
920 浏览

java - 作业帮助,抽象/接口类

我是处理 Java 的新手,我正在学习的课程是向我展示一些代码,但是当我尝试运行它时。由于从未设置父级,它返回一个空指针异常。

那么在抽象类中我如何传递父类?这是基于人工智能搜索!谢谢!!

继承人的代码:

这是基于农民狼山羊白菜问题。

抽象状态:

状态

FarmerWolfGoatCabbage:

主要试图解决..

堆栈跟踪:

我也得到了一个求解器,我应该使用它吗?

0 投票
2 回答
1697 浏览

optimization - 狐山羊白菜运输

我的问题是关于一个古老的运输问题——用一艘船一次只能运送一件物品,带着三件物品过河。一个约束是某些项目不能放在一起,例如卷心菜和山羊,狼和山羊等。这个问题应该可以使用整数规划或其他优化方法来解决。成本函数是河对岸的所有项目,到达那里所需的行程可能是 Simplex (?) 的输出,它尝试了不同的可行解决方案。我想知道是否有人有这个问题的整数规划(或线性规划)公式,和/或基于 Matlab、Octave、Python 的代码可以以编程方式提供解决方案,包括尝试所有路径的 Simplex 的踪迹——我们的乘船游览.

这里有一些有趣的东西

http://www.zib.de/Publications/Reports/SC-95-27.pdf

谢谢,

0 投票
2 回答
167 浏览

java - 如何将我的一个函数转换为 Iterable功能?

我正在编写代码来实现不同的搜索功能来解决 Farmer Wolf Goat Cabbage 问题。我们获得了几个由我们的 main 和 FarmerWolfGoatCabbage 类实现的类。类之一,AbstractSolver 包括该行

这是我的FarmerWolfGoatCabbage类。我基本上想翻译以下功能

进入一个类似的函数,但返回类型为 Iterable

0 投票
1 回答
430 浏览

list - 从 Prolog 中的列表中选择所有可能的选项

所以我必须编写不同的程序来帮助我解决农民-狼-山羊-卷心菜-肥料的难题。对于那些不知道的人,它涉及到一个农民必须带着所有其他物品从一条河流的北岸穿越到南岸。银行在 3 种情况下变得安全:农夫在场,或者狼没有和山羊在一起,或者,山羊没有和卷心菜一起留下。出于练习的目的,变量将是 [f,b,g,w,c]。

我坚持的程序(选择(银行,项目))涉及找到一个包含 1 或 2 个元素的列表(始终包括农民 - f),这可能是银行运输的一部分,而不会使其不安全。

如果确实选择([g,f,b], Items),则 Items 的可能返回值可以是 [f]、[f,g]、[f,b]。但是,如果我们选择([g,f,c], Items),则返回的唯一可能值是 [f,c] 或 [f,g],因为山羊和卷心菜不能放在一起。

因此,谁能给我一个提示,如何获得项目的所有可能选项,但列表中不超过 2 个项目?

0 投票
2 回答
2918 浏览

java - 食人族和传教士使用 IDDFS 和 GreedyBFS

三个食人者和三个传教士必须过河。他们的船只能载两个人。如果食人族的人数超过传教士,在河的两边,传教士就有麻烦了(我不会描述结果)。每个传教士和每个食人者都可以划船。六个人怎么能过河?

我找不到使用 IDDFS(迭代加深深度优先搜索)和 GreedyBFS(贪婪最佳优先搜索)解决此问题的算法。关于如何解决这个问题的想法也会让我很高兴。

编辑:

我在 wiki 上找到了 IDDFS 的算法:

但我无法弄清楚 DLS() 中的 expand(node) 应该在我的问题中完成什么。这是我的节点类:

我将不胜感激任何帮助。

0 投票
6 回答
14842 浏览

prolog - 在 Prolog 中使用广度优先搜索 (BFS) 解决食人族/传教士问题?

我正在解决经典的 Missionaries(M) 和 Cannibals(C) 问题,起始状态是左岸的 3M 和 3C,目标状态是右岸的 3M、3C。我已经完成了程序中的基本功能,我需要实现搜索策略,例如 BFS 和 DFS。

基本上我的代码是从网上学习的。到目前为止,我可以使用 DFS 方法成功运行程序,但我尝试使用 BFS 运行它总是返回 false。这是我的第一个 SWI-Prolog 程序,我找不到我的代码的问题所在。

这是我的代码的一部分,希望你能帮我找到它的问题

在进入下一个级别之前,我使用 findall 找到所有可能的路径。只有通过 safe() 的一次才会被视为可能的下一个状态。如果它已经存在,该状态将不会使用。由于我的程序可以使用 DFS 运行,所以我认为 move() 和 safe() 谓词没有任何问题。我的 BFS 谓词正在根据我的 DFS 代码进行更改,但它不起作用。