最も効率的な道を旅する


7

私の友人が実際に私に非常に興味深いコンピューターサイエンス関連の質問をしてきました。

問題は、旅行する必要があることです。 1000キロ。唯一のガソリンスタンドは出発点にあります。燃料タンクの最大容量は kmの走行に十分であり、途中で燃料を「埋め」、後で使用するために保存することができます。50

たとえば、最初に km 走行し、そこに km相当の燃料を埋め込んでから、給油に戻ると、次に、残った kmの燃料を取り出して、それを使ってさらに到達することができます。201010

あなたは目的地に到達するための最も効率的な方法を見つける必要があります。

私が考えたのは動的プログラミングの使用ですが、給油を行う前に移動する距離はキロメートル単位の整数であると想定する必要があります。そうでなければ、DPでそれを行うのは難しいので、まだ線形プログラミングを試していません、それは可能だと思います。

それを行う方法について何か考えがありますか?または何かヒントはありますか?

最も重要なのは、どのタイプのcs問題ですか?NPは難しいですか?機械で解けるのか、それとも数学的な問題なのか?

さらにいくつかの考え:

  • それは継続的なパスなので、NPかどうかを尋ねるのは少しばかげているかもしれませんが、私はまだ非常に興味があります。
  • 1000複雑な計算を回避するために、とが意図的に選択される場合があります。50
  • 貪欲な解決策はありますか?まだ考えられません。
  • 私の友人はそれがcs問題であると主張しているのですが、今は数学的なパターンを見つける問題のほうが多いと思うので、この投稿を続けることにします。

そして、これに関連する科学記事や教科書があれば教えてください、そもそもどこから始めればよいのかわかりません。


3
私の最初の考えは、A *検索がこの問題でおそらくかなりうまくいくということです。
仮名

回答:


5

基本的な考え方は n旅行、最初に戻り、最後の旅行を除いてすべての給油。毎回、ただし最後の旅行では、新しいダンプに燃料を残します。あなたは最後の旅行でどこまで行けるか知りたいのです。計算を簡単にするために、満タンのタンクには1(ユニット)の燃料が含まれており、その量では1(他のユニット)の距離がかかります。

例1n=1トリップ)。ささいなこと:燃料がなくなるまで運転します。走行距離D(1)=1

例2n=2)。最初の旅行で、旅行x 距離なので、 1x残りの燃料。ダンプ1に十分な燃料を残して、最初に戻ることができるようにします。去る12xダンプ1でトリックを実行します。2回目の旅行では、満タンから始めて、最初のダンプに行きます(x あなたの燃料の)、あなたのタンクを満タンにして(取る x ゴミ捨て場から 13x)そして燃料がなくなるまで運転します。距離を最大化するには、ダンプを空にする必要があります。13x=0、 そう x=1/3。カバーする総距離はD(2)=1+1/

一般的なケース。とn 旅行、あなたはダンプをヒットします1 2n1 回、ダンプ2 2n3 回、ダンプ3 2n5時間など。最後の旅行でダンプを空にするために、距離を置いてダンプ1を配置します1/(2n1)、さらに距離を置いて2をダンプ 1/(2n3)、 等々。その後、最後の旅行はカバーします

D(n)=1+13+15++12n1
を定義すると m- 次の調和数
Hm=1+12+13+14+15++1m
それはよく知られています Hmlnm 距離を書けます
D(n)=1+13+15++12n1=(1+12+13++12n1)(12+14++12n2)=H2n112Hn1
This will take an amount of trips (and fuel) that are exponential in the desired distance. For example, to go a distance of 2, it will take n=8 trips and to go a distance of 5 will take 3093 trips.

これ(および変種)はジープ問題と呼ばれ、ここで詳しく説明します


1
これを実行する単純なJavaプログラムを作成しました。5の距離を移動するには、3093回のトリップが必要です。そして、1000 kmの旅を完了するには、1048旅行。
HenryHey 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.