問題タブ [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 - 可能性のある「ボート負荷」

あなたは川を渡る問題を知っています。並べ替えの説明は次のとおりです。

むかしむかし、3 人の人食い人種が 3 人の宣教師をジャングルに案内していました。彼らは最寄りの伝道所に向かう途中でした。しばらくすると、彼らは恐ろしいヘビや魚でいっぱいの広い川に到着しました。船がなければ川を渡ることができませんでした。幸いなことに、彼らは短い捜索の後、2 つのオールを備えた手漕ぎボートを見つけました。残念ながら、ボートは小さすぎて全員を運ぶことができませんでした。一度に 2 人を運ぶことはほとんどできませんでした。さらに悪いことに、川幅が広いため、漕ぐ以外にボートを戻す方法がありませんでした。宣教師たちは人食い人種を信頼できなかったので、6人全員を安全に川を渡らせる計画を立てなければなりませんでした。問題は、ある場所で宣教師よりも人食い人種の方が多いとすぐに、これらの人食い人種が宣教師を殺して食べてしまうことでした。したがって、私たちの宣教師兼プログラマーは、川の両側に少数派の宣教師が決していないことを保証する計画を考案する必要がありました。ただし、人食い人種は、それ以外の場合は協力すると信頼できます。具体的には、宣教師が潜在的な改宗者を捨てないのと同じように、彼らは潜在的な食べ物を捨てません。

私の質問はこの問題の一部です。可能なボート負荷のリストを返す関数を設計しようとしています (たとえば、boat_capacity が 3 の場合[(3mis, 0can), (2mis, 1can), (1mis, 1can), ...] )。関数の入力として num (宣教師または人食い人種の数) とボートの収容人数があります。

関数とアルゴリズムをどのように設計しますか?

0 投票する
1 に答える
582 参照

java - River Crossers の一般的な DFS

複数の川を渡る問題 (Fox Goat Cabbage、Jealous Husbands、Mercenaries and Cannibals など) を解決する DFS を作成しようとしています。パズル クラスを作成しましたが、ソルバーの構造化に問題があります。DFS がどのように機能するかは理解していますが、この設計に適応させるためにどこから始めればよいかわかりません。

各パズルには move() メソッドがあり、有効な手であれば true を返し、ルールセットに違反している場合は false を返します。乗客は、川のそれぞれの側を表す一対のリストで追跡されます。ソルバーはこれらのリストにアクセスできますが、乗客が川を渡るたびに可能な動きが変わるため、これを使用して可能な動きセットを生成する方法がわかりません。

0 投票する
1 に答える
2179 参照

prolog - 人食い人と宣教師

私はプロローグの初心者であり、プロローグを学び始めました。私は宣教師と人食い人種のパズルがプロローグで解くのに面白いと思いました。私は多くのフォーラムを調査し、非常に良い解決策だと思うリンクを見つけました。しかし、どういうわけか私は実際の結果を得ていません。出力の動きが間違っているようです。プログラムをトレースしようとしましたが、値の割り当て中にすべてが完璧に見えますが、どういうわけか解決策が間違っています。

論理エラーが正確にどこにあるかを知るために専門家の助けが必要です。

出典:http ://www.enrico-franchi.org/2008/12/missionaries-cannibals-and-prolog.html

0 投票する
1 に答える
494 参照

haskell - Haskellコードでエラーが見つかりません

cabbage-goat-wolfパズルの(動作中の!)ソリューションをScalaからHaskellに変換しようとしましたが、ソリューションリストが空であるため、呼び出し時にコードがスローされてエラーが発生するheadためfindSolutions、問題はループのどこかにあるようです。findMovesうまくいくようです。

もちろん、実際のエラーとは関係のない改善に関するヒントもいただければ幸いです。

[アップデート]

念のため、私は。を使用するという提案に従いましたSet。動作するコードは次のとおりです。

headinの呼び出しfindSolutionはより安全になり、ソリューションを印刷するためのより良い方法を使用する必要がありますが、それを除けば、私は非常に満足しています。

【アップデート2】

以前の立場の表現は、この種の問題には最適ではなかったと思います。次のデータモデルに切り替えました。これにより、移動などが少し冗長になりましたが、はるかに読みやすくなりました。

0 投票する
1 に答える
920 参照

java - 宿題のヘルプ、抽象/インターフェイス クラス

私はJavaを扱うのが初めてで、私が取っているコースはコードを示していますが、それを実行しようとしているときです。親が設定されていないため、null ポインター例外が返されます。

では、抽象クラスで親を渡すにはどうすればよいでしょうか? これはAI検索に基づいています!ありがとう!!

コードは次のとおりです。

これは、農夫オオカミ山羊のキャベツ問題に基づいています。

抽象状態:

FarmerWolfヤギキャベツ:

主に解決しようとしています..

スタックトレース:

ソルバーも与えられましたが、それを使用する必要がありますか?

0 投票する
2 に答える
1697 参照

optimization - キツネ-ヤギ-キャベツの輸送

私の質問は、古い輸送の問題についてです。一度に1つのアイテムしか転送できないボートで、川を渡って3つのアイテムを運ぶことです。制約は、ヤギとキャベツ、ヤギとオオカミなど、特定のアイテムを一緒に残すことができないことです。この問題は、整数計画法または別の最適化アプローチを使用して解決できるはずです。コスト関数は、川の反対側にあるすべてのアイテムであり、そこに到達するために必要な旅行は、さまざまな実行可能なソリューションを試すシンプレックス(?)からの出力である可能性があります。誰かがこの問題の整数計画法(または線形計画法)の定式化、および/またはすべてのパスを試しているシンプレックスのトレースを含む、プログラムでソリューションを提供できるMatlab、Octave、Pythonベースのコードを持っているかどうか疑問に思いました-私たちのボート乗り。

ここには面白いものがいくつかありました

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

ありがとう、

0 投票する
2 に答える
167 参照

java - 関数の 1 つを Iterable に変換するにはどうすればよいですか関数?

Farmer Wolf Goat Cabbage の問題を解決するために、さまざまな検索機能を実装するコードに取り組んでいます。main クラスと FarmerWolfGoatCabbage クラスが実装するいくつかのクラスが与えられました。クラスの 1 つである AbstractSolver には、次の行が含まれています。

これが私のFarmerWolfGoatCabbageクラスです。基本的に次の関数を翻訳したいと思います

同様の関数に変換しますが、戻り値の型は Iterable です

0 投票する
1 に答える
430 参照

list - Prologのリストから可能なすべてのオプションを選択する

だから私は農夫-オオカミ-ヤギ-キャベツ-肥料のパズルを解くのに役立つさまざまな手順を書かなければなりません。それを知らない人のために、それは農民が川の北岸から他のすべての物で南岸に渡らなければならないことを含みます。銀行は3つの状況で安全になります:農民がいる、またはオオカミが山羊と一緒に残されていない、または山羊がキャベツと一緒に残されていない。演習では、変数は[f、b、g、w、c]になります。

私が立ち往生している手順(choose(Bank、Items))には、銀行からの輸送の一部であり、安全でないままにすることができる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 を使用する人食い人種と宣教師

3 人の人食い人種と 3 人の宣教師が川を渡らなければなりません。彼らのボートは二人しか乗れません。人食い人種の数が宣​​教師の数を上回っている場合、川のどちらかの側で、宣教師は困っています (結果については説明しません)。各宣教師と各人食い人種がボートを漕ぐことができます。6 人全員が川を渡るにはどうすればよいでしょうか。

IDDFS (反復深化深さ優先検索) と GreedyBFS (貪欲な最良優先検索) を使用してこの問題を解決するためのアルゴリズムが見つかりません。これを解決する方法についてのアイデアも私を幸せにします。

編集:

ウィキでIDDFSのアルゴリズムを見つけました:

しかし、私の問題で DLS() の expand(node) が何を達成することになっているのかわかりません。これは私のノードクラスです:

助けていただければ幸いです。

0 投票する
6 に答える
14842 参照

prolog - Prologで幅優先探索(BFS)を使用して人食い人種/宣教師を解決しますか?

私は古典的な宣教師(M)と人食い人種(C)の問題の解決に取り組んでいます。開始状態は左岸で3Mと3Cで、目標状態は右岸で3Mと3Cです。プログラムの基本機能を完了しました。BFSやDFSなどの検索戦略を実装する必要があります。

基本的に私のコードはインターネットから学ぶものです。これまでのところ、DFSメソッドを使用してプログラムを正常に実行できますが、BFSを使用して実行しようとすると、常にfalseが返されます。これは私の最初のSWI-Prologプログラムであり、コードの問題がどこにあるのかわかりません。

これが私のコードの一部です、あなたが私がそれの問題を見つけるのを手伝ってくれることを願っています

次のレベルに進む前に、findallを使用してすべての可能なパスを見つけます。safe()を通過した1つだけが、可能な限り次の状態と見なされます。状態がすでに存在する場合、その状態は使用されません。私のプログラムはDFSで実行できるので、move()およびsafe()述語に問題はないと思います。BFS述語がDFSコードに基づいて変更されていますが、機能しません。