私は正しいと思われる貪欲なアルゴリズムを持っていますが、よくわかりません。正しいかどうかを確認するにはどうすればよいですか?貪欲なアルゴリズムが正しいことを証明するために使用するテクニックは何ですか?一般的なパターンやテクニックはありますか?
これが参考質問になることを願っています初心者に向けられるしています。したがって、通常よりも広い範囲です。少なくとも1つの例で説明されているが、多くの状況をカバーする、一般的で教訓的に提示された答えを与えるように注意してください。ありがとう!
私は正しいと思われる貪欲なアルゴリズムを持っていますが、よくわかりません。正しいかどうかを確認するにはどうすればよいですか?貪欲なアルゴリズムが正しいことを証明するために使用するテクニックは何ですか?一般的なパターンやテクニックはありますか?
これが参考質問になることを願っています初心者に向けられるしています。したがって、通常よりも広い範囲です。少なくとも1つの例で説明されているが、多くの状況をカバーする、一般的で教訓的に提示された答えを与えるように注意してください。ありがとう!
回答:
最終的に、正確性の数学的証明が必要になります。以下では、そのためのいくつかの証明手法を紹介しますが、まず、それに飛び込む前に、時間を節約しましょう。証明を探す前に、ランダムテストを試してください。
最初のステップとして、ランダムテストを使用してアルゴリズムをテストすることをお勧めします。これがどれほど効果的かは驚くべきことです。私の経験では、欲張りなアルゴリズムの場合、ランダムテストは不当に効果的であるようです。アルゴリズムをコーディングするのに5分間費やすと、証拠を考え出すのに1、2時間節約できます。
基本的な考え方は単純です:アルゴリズムを実装します。また、正しいことがわかっている参照アルゴリズムを実装します(たとえば、すべての可能性を徹底的に試行し、最善を尽くす参照アルゴリズム)。参照アルゴリズムが漸近的に非効率であれば、小さな問題のインスタンスでのみこれを実行するので問題ありません。次に、100万の小さな問題インスタンスをランダムに生成し、それぞれで両方のアルゴリズムを実行し、候補アルゴリズムがすべての場合に正しい答えを与えるかどうかを確認します。
経験的に、欲張りアルゴリズムの候補が正しくない場合、通常、ランダムテストでこれを発見することがよくあります。すべてのテストケースで正しいと思われる場合は、次のステップに進む必要があります。正確性の数学的証明を考え出すことです。
それでは、欲張りアルゴリズムが正しいことを証明する必要があります:最適解を出力する(または、同様に良い複数の最適解がある場合、それらの1つを出力する)。
基本的な原則は直感的なものです:
原理:間違った選択を行わない場合は、大丈夫です。
貪欲なアルゴリズムには通常、一連の選択肢が含まれます。基本的な証明戦略は、アルゴリズムが決して悪い選択をしないことを証明しようとすることです。貪欲なアルゴリズムは後戻りできません-一度選択すると、コミットされ、その選択を取り消すことはありません-したがって、決して悪い選択をしないことが重要です。
何が良い選択としてカウントされますか?最適なソリューションが1つしかない場合、何が良い選択であるかが簡単にわかります。最適なソリューションによって作成されたものと同一の選択です。言い換えれば、貪欲なアルゴリズムの実行のどの段階でも、これまでにアルゴリズムによって行われた選択のシーケンスが最適解のプレフィックスに正確に一致することを証明しようとします。同等に最適な最適解が複数ある場合、最適な選択肢は、少なくとも1つの最適値と一致するものです。言い換えると、これまでのところ、アルゴリズムの選択のシーケンスが最適なソリューションのいずれかのプレフィックスに一致する場合、これまでのところ何も問題ありません(まだ何も問題はありません)。
生活を簡素化し、気を散らすものを排除するために、結びつきがない場合に焦点を当てましょう。単一の、独自の最適なソリューションがあります。すべての機械は、根本的な変更なしに複数の同等に最適なオプティマがある場合に引き継がれますが、技術的な詳細にはもう少し注意する必要があります。これらの詳細を無視し、最適なソリューションが一意である場合に焦点を当てることから始めます。それはあなたが不可欠なものに集中するのに役立ちます。
使用する非常に一般的な証明パターンがあります。アルゴリズムの次の特性を証明するために努力します。
クレーム:レッツアルゴリズムによって解出力することとOの最適なソリューションです。SがOと異なる場合、Oを微調整して、Oとは異なり厳密にOよりも良い別の解O ∗を取得できます。
なぜこれが役立つのか注目してください。主張が真の場合、アルゴリズムが正しいということになります。これは基本的に矛盾による証明です。はOと同じか、または異なります。それが異なる場合は、我々は別の解決策を見つけることができますO *厳密よりも良好だOを -しかし、我々が定義されていることは、矛盾だOを最適なソリューションであることが、より良いそれよりもだ任意の解決策があることはできません。したがって、SをOと異ならせることはできません。Sは常にOに等しくなければなりませんつまり、欲張りアルゴリズムは常に正しい解を出力します。上記の主張を証明できれば、アルゴリズムが正しいことを証明できました。
いいよ それでは、クレームをどのように証明しますか?解は、アルゴリズムによって作成されたn個の選択肢のシーケンスに対応するベクトル(S 1、… 、S n)として考え、同様に、最適解Oはベクトル(O 1、… 、O N)をもたらす選択肢の配列に対応するO。SがOと異なる場合、S i ≠でないインデックスiが存在する必要があります ; iなどの最小のものに焦点を当てます。その後、我々は微調整う Oを変更することにより、 Oで少し私一致するように、番目の位置 S Iを、すなわち、我々は、最適解の微調整う Oを変更することにより、 Iその後、貪欲アルゴリズムによって選ばれたものに目の選択肢を、そしてこれがさらに優れたソリューションにつながることを示します。特に、 O ∗を次のように定義します。
ただし、グローバルな一貫性を維持するために、部分をわずかに変更する必要があることがよくあります。証明戦略の一部には、O ∗を適切に定義する際の賢さが含まれます。そして、証明の要点は、アルゴリズムと事実に関する事実を何らかの形で使用して、O ∗がOより厳密に優れていることを示すことになります。; そこで、問題固有の洞察が必要になります。ある時点で、特定の問題の詳細に飛び込む必要があります。しかし、これにより、貪欲なアルゴリズムの典型的な正当性の証明の構造の感覚が得られます。
これは、簡単な例を詳細に説明することで理解しやすくなります。次の問題を考えてみましょう。
入力: Aセット、整数の整数k個の出力を: AセットS ⊆ UのサイズのKその和可能な限り大きいです
この問題には自然な欲張りアルゴリズムがあります:
ランダムテストでは、これにより常に最適なソリューションが得られることが示唆されているため、このアルゴリズムが正しいことを正式に証明しましょう。最適なソリューションは一意であるため、関係を心配する必要はありません。上記の主張を証明しましょう:
項:レット入力で、このアルゴリズムによって溶液出力であるU 、K、およびO最適解。S ≠ Oの場合、合計がOよりも大きい別の解O ∗を構築できます。
証明。仮定、およびlet iは最初の反復の指標であるX I ∉ O。(S ≠ Oと仮定し、アルゴリズムの定義によりS = { x 1、… 、x k }であるため、このようなインデックスiが存在する必要があります。)(仮定により)iは最小であるため、X 1、... 、X I - 1 ∈ O、特に、の形式は O = { x 1、x 2、… 、x i − 1、x ′ i、x ′ i + 1、… 、x ′ n }で、ここで数字 x 1、… 、x i − 1、x ′ i、… 、x ′ n降順でリストされています。アルゴリズムの選択方法を見ると、我々は我々が持っている必要があることを見るのx I > X " jはすべてのためのJ ≥ 私。特に、x i > x ′ iです。だから、定義O = O ∪ { X I } ∖ { xは' I }、すなわち、我々が入手O *削除することによって、私にで目数をOを追加します。今の要素の和O *は、の要素の合計であるOプラスxはI - X " I、およびxは私を - Xを「I > 0、そうO *の合計がより厳密に大きいOの合計"。これは主張を証明します。◼
ここでの直観は、貪欲なアルゴリズムがと矛盾する選択を行った場合、その段階で貪欲なアルゴリズムによって選択された要素を含むように変更された場合、Oがさらに良いことを証明できるということです。以来Oが最適であり、おそらくそこに(それは矛盾になります)さらに良いそれを作るためにどのような方法が考えられますので、唯一残っている可能性が私たちの仮定が間違っていたということであることはできません。言い換えれば、貪欲アルゴリズムが選択をすることはありませんそれはOと矛盾しています。
この議論は、しばしば交換議論または交換補題と呼ばれます。私たちは、貪欲溶液から最適解が異なる最初の場所を発見し、我々はその要素交換想像対応する貪欲な選択肢(交換用X " 私はのためにX I)。一部の分析では、この交換は最適なソリューションのみを改善できることが示されましたが、定義により、最適なソリューションは改善できません。したがって、唯一の結論は、最適なソリューションが貪欲なソリューションと異なる場所があってはならないということです。別の問題がある場合は、特定の状況でこの交換原則を適用する機会を探してください。
then we can tweak O to get another solution O∗ that is different from O and strictly better than O
は私を混乱させます。最適なソリューションが複数ある場合S != O
、両方を最適化することができます。我々は、S(Oを作成*)「もっと似」にOを微調整して、まだすることができ同じように良いとして(ないstrictly better than
)O.
a single, unique optimal solution
。この質問は貪欲なアルゴリズムが正しいことを証明することに関するものなので、複数の最適なソリューションが存在する可能性がある場合の答えを提供したいと思います。このすべてを研究してからしばらく経ちましたが、algとは異なる最適な解Oで各要素O_iを交換できることを証明するだけでは不十分です。解SとS_iがあり、解O ' が O より悪くないか?
例として、次の単純なソートアルゴリズムを使用します。
repeat:
if there are adjacent items in the wrong order:
pick one such pair and swap
else
break
正確性を証明するために、2つのステップを使用します。
最初のポイントでは、アルゴリズムがすべてのステップで改善することを示すことができる適切なコスト関数を選択します。
この例では、入力リストで反転の数を選択します。リストの反転は、A [ i ] > A [ j ]であるがi < jであるようなエントリA [ i ]、A [ j ]のペアです。反転の数は常に負ではなく、ソートされたリストには0の反転があります。
順序が間違っている2つの隣接するアイテム、A [ i + 1 ]を明確に交換すると、反転A [ i ] 、A [ i + 1 ]は削除されますが、他の反転は影響を受けません。したがって、すべての反復で反転の数が減ります。
これは、アルゴリズムが最終的に終了することを証明しています。
ソートされたリストの反転の数は0です。すべてがうまくいけば、アルゴリズムは反転の数を0に減らします。ローカルの最小値でスタックしないことを示す必要があるだけです。
私は通常これを矛盾によって証明します。アルゴリズムは停止したと仮定しますが、解決策は正しくありません。例では、これはリストがまだソートされていないことを意味しますが、間違った順序で隣接するアイテムはありません。
リストがソートされていない場合、少なくとも2つのアイテムが正しい位置にない必要があります。レッツとA [ J ]、I、 A [ I ] > A [ J ]である二つのそのようなアイテムSTとの間の差 Iおよび jは最小です。アルゴリズムは停止しなかったため、隣接していないため、 i + 1 < jです。最小性を仮定したため、 A [ i ] < A [および A [ i + 1 ] < A [ j ]ですが、 A [ i ] < A [ j ]であり、矛盾があります。
これは、リストがソートされたときにのみアルゴリズムが停止することを証明しています。これで完了です。