再帰的なアルゴリズムと海賊金副問題 - アルゴリズムについて話します

個々の公共の番号でこの記事の発信元:TechFlow


最近では、共有への皆のために、非常に興味深い質問を見ました。

または古いルール、我々はアルゴリズムの問​​題、物語の最初のを見て話をする前に。


伝説によると、ある5人の海賊海賊艦隊無敵を形成は、彼らが見つけることが宝探しの最後の間にある100枚の貴重な金貨を。だから、当然、これらの著作権侵害の問題は、戦利品に直面します。内紛の海賊を防ぐために、冷酷な海賊は奇妙なルールを開発しました:


彼らは、5人が最初の配布計画を提案した海賊の数が少ないことにより、信用の大きさに応じて番号が付けられていることを決めました。プログラムは、ほとんどの人が同意を取得することができた場合は、その後、彼は提案した計画に従って分布あなたは、彼が威信を失ったこと、海賊は海の中に彼に残酷になることができない場合はフィードサメに

かすんの朝に目を覚ます、突然、彼は彼自身のナンバーワン海賊を見つけ、そしてあなたは、ほとんどの金貨を取得する方法を割り当てる必要があり、彼らはサメを養うませんか?


我々は改善しなければならない質問の意味を考える前に、いくつかの条件を追加します


まず第一に、すべての海賊は非常に残酷です。場合には、収益に影響を与えることはありません、この手段は、彼らがより多く殺すために傾斜になります。

第二に、すべての海賊は、最良の答えを考えることができ、非常に知的です。


これらの2つの条件が出てきた、問題は、これは、より明白であるゲーム理論の姿勢のみ対象。

これはゲーム理論の問題ですので、我々は従来の考え方を通してある答えを見つけることができない、我々は必要な別の方法をダウン。


だから、どのようにそれは別の方法はありますか?


より従来のアプローチは、まず、元の問題と見なされていない元の問題と類似したが、問題のはるかに小さいサブスケールと仮定するサブ問題を解くことによって、元の問題の解決策を探求します。


たとえば、この質問では、我々は状況を5分海賊金を計算する必要があります。突然、いくつかの私たちのすべてが、問題はまだ同じルールで、その後、我々は問題を単純化し、起動することはできませんが、我々は持っている海賊の数減らすためだけの海賊に減少し、。だから、ルールによれば、最終的な結果は、海賊は、すべての金貨を手に入れたということであることは明らかです。

この時間割り当ては、[0、0、0、0、100]


我々は戻って、この時点から開始し、後方どうなるか、ときに、2人の海賊、この時間は、より多くの海賊の第4と第5の合計を想定しますか?


半分以上が提案に同意するために必要なので、どうやら、提案が渡すことができます。だから、この時点では、関係なく、どのように提案した海賊の第4の、第5号は、飼料サメに海をキャストするために彼を運ぶために、同意しないだろう。もしそうなら、わずか4および5、第4海賊特定の死。

この時間割り当ては、[0、0、0、-1、100]、-1特定の死を示します


我々はその海賊それ追加した場合は?


プラス海賊は、その後、3,4,5 3海賊の場合です。ときのみ、4番4と5のダイので、彼が生き残るために命題3(彼らは残酷ではないために他の人に残酷な海賊を、)同意するようにします。この時間は、第3号にかかわらず提案のすべてが通過することができるであろう。自分の投票数、およびチケット番号4は、半分以上を持っているので、彼は提案を渡すことができるようになります。

この時間割り当ては、[0、0、100、0、0]


私たちは、その後、海賊の合計残りの4例を検討し、海賊を追加します。第2ダイは、その後、第3号は、すべての金貨懐ことができれば、いくつかは、第3番2のプログラムに同意しないであろうことは明らかです。4個人的な時間、彼らはプログラムを採用することに同意する前に、少なくとも3人が必要で、あなたは第2第4号及び第5号を戦わなければなりません。第2ニーズが4号と5号金貨に割り当てられるので、第2のダイ、4と5は、何もない場合は、それらを描くことができます。

この時間割り当ては、[0、98、0、1、1]


最後に、我々はバイキング1を追加します。同様に、命題1は、少なくとも3人が通過海賊が必要です。自分自身を含めて、彼はチケット2枚を獲得する必要があります。ので、第1第2号のダイとして、98枚のコインを得ることができます第1は確かに第2戦うことができない、3、4、または開始からわずか3人。3つ、2番4(2の倍数よりもバージョン番号)とすることができる与えることができない番号31、番号5〜2。

この時間割り当てがある[97、0、1、2、0]又は[97、0、1、0、2]。


ここで、問題は終わりました。しかし、私たちの思考は終わっていない、私は法律を見て何の解決策はありません、そこから分かりません。我々は、5人の海賊で起動する方法はありませんが、この複雑な状況に直面していましたが、できるだけ早く我々がしようとしている場合は、問題の規模を縮小するために、最も単純なケースについて考え始める、疑問が突然場所に落ちました。


彼は言った:世界情勢を、罰金になり、世界は困難であり、簡単になりますこの観点から問題があり、その理由は、お互いを補完します。


この最も単純かつ最も複雑な導出アルゴリズムを再帰的に呼び出されるから


仮定し、N海賊取得機能割当方式はFです。我々は、F(2)を計算するとき、我々は、F(1)の結果を必要とします。私たちは、書き込み擬似コードにしてみてください。

def f(n):
  if n == 1:
    return [0, 0, 0, 0, 100]
  else:
    allocation = f(n-1)
    # 新的分配
    new_allocation = allocate(allocation)
    return new_allocation

のは、この内部メソッドを無視達成するためにどのように割り当てさせ、単にコードを見て、全体のフレームワークが既に持っています。


ここでまた、再帰的なプログラムの本質は、外観だけで自分自身を呼び出す、問題の本質が実際に分割されるの内側上から下への再帰プロセス全体は、実際には、解決のマイナーな問題のためにプロセスに大きな問題ですあなたが理解していない場合、我々は少しを統合するために古典的な例を見ていきます、この問題は、ハノイの問題の有名なタワーです。


彼が作成する世界を作成し、インド神話に梵天と呼ばれる偉大な神、ある3つのキング列が解決退屈、彼は64枚のディスク上に置くポストへ。前回から増加にダウンこの64ディスクは、彼は問題外僧侶を与えました。1枚のだけのディスクを移動させることができ、およびディスクのみディスク上に配置することができますが、それよりも大きくなっていることの別のルートに1列からディスクを移動するために行う方法、?

問題を単純化するために、我々は、第1の状況は、5枚のディスクを入れて観察します。私たちがBピラーにディスクを移動したい場合は、それを行うにはどのようにあるべき、時間の初めAピラー内のディスク、図から見ることができますか?


我々はまた、最初ある最も単純なケースを観察:A列には、1つのディスクだけを持っていることは、私たちが直接することができ、Bピラーに移動非常に簡単です。2枚のディスクが、それはありますか?まず、最初のCピラーに移動し、Bに、次いで第2の列BにディスクカートリッジCの最終的な動きを移動する必要があります それは3枚のディスク、もう少し複雑な、しかしリストをよく見ている場合でも、それも考慮することができます。


しかし、どのように我々は問題それの規模を削減することによって、問題を単純化するのですか?


これは、タイトルのために深く考えることのポイントを作るために私たちを必要とします。この問題の重要なポイントは、ディスクを制限することがあり、ディスクはそれにはるかに小さいディスクを落ちることはできません。だから我々はそれがそのような後、Bの最大の部分に配置することができますので、Cピラーまでのn-1最初に移動したディスクに、Bピラーにn個のディスクAピラーから前の必見を移動する場合N-1ブロック移動は、Bバック


つまり、我々は、N-1を仮定しますディスクの全体ブロックであるので、ディスクブロックNと、ディスクと同様に二つのプログラム。これは、再帰的に簡素化することによって行われます。


最後に、そして最も重要なのは、どのようにN-1のディスクKuaiそれを移動するには?実際には、非常に単純な、我々は、同じ方法を適用し、このブロックN-1、N-2ディスクのブロック全体として、再帰的な操作。あなたが理解したら、あなたは、実際には、わずか数行のコードを書いてみるかもしれません。


def hanoi_tower(num, tower_start, tower_dest, tower_other):
  if num == 1:
    print('move plate {} from {} to {}'.format(num, tower_start, tower_dest))
    return 
  hanoi_tower(num-1, tower_start, tower_other, tower_dest)
  print('move plate {} from {} to {}'.format(num, tower_start, tower_dest))
  hanoi_tower(num-1, tower_other, tower_dest, tower_start)

私たちは、このメソッドを呼び出して何を、いくつかのテストを実施。

我々の期待、私たちのアルゴリズムが正しいことを示しているとの一貫性のある結果。


最後に、我々は、それがコードに実装する必要があるか、著作権侵害の問題に戻りますか?興味のある学生は、あなたが本当に「パブリック号にキー・ワードに応答しない書き込みのコードことができれば、それを自分で試してみてください海賊ゴールドポイントは」私が書いたコードを参照してください。


ここで今日の記事、国民の関心の数のIスキャンコード:TechFlow、より多くの記事を取得します

公開された28元の記事 ウォンの賞賛0 ビュー2244

おすすめ

転載: blog.csdn.net/TechFlow/article/details/104073971