欲張りアルゴリズムが正しいことを証明する方法


29

私は正しいと思われる貪欲なアルゴリズムを持っていますが、よくわかりません。正しいかどうかを確認するにはどうすればよいですか?貪欲なアルゴリズムが正しいことを証明するために使用するテクニックは何ですか?一般的なパターンやテクニックはありますか?

これが参考質問になることを願っています初心者に向けられるしています。したがって、通常よりも広い範囲です。少なくとも1つの例で説明されているが、多くの状況をカバーする、一般的で教訓的に提示された答えを与えるように注意してください。ありがとう!



マトロイドまたはグリードイドを使用して、貪欲なアルゴリズムが正しいことを証明できますか?
zdm

回答:


24

最終的に、正確性の数学的証明が必要になります。以下では、そのためのいくつかの証明手法を紹介しますが、まず、それに飛び込む前に、時間を節約しましょう。証明を探す前に、ランダムテストを試してください。

ランダムテスト

最初のステップとして、ランダムテストを使用してアルゴリズムをテストすることをお勧めします。これがどれほど効果的かは驚くべきことです。私の経験では、欲張りなアルゴリズムの場合、ランダムテストは不当に効果的であるようです。アルゴリズムをコーディングするのに5分間費やすと、証拠を考え出すのに1、2時間節約できます。

基本的な考え方は単純です:アルゴリズムを実装します。また、正しいことがわかっている参照アルゴリズムを実装します(たとえば、すべての可能性を徹底的に試行し、最善を尽くす参照アルゴリズム)。参照アルゴリズムが漸近的に非効率であれば、小さな問題のインスタンスでのみこれを実行するので問題ありません。次に、100万の小さな問題インスタンスをランダムに生成し、それぞれで両方のアルゴリズムを実行し、候補アルゴリズムがすべての場合に正しい答えを与えるかどうかを確認します。

経験的に、欲張りアルゴリズムの候補が正しくない場合、通常、ランダムテストでこれを発見することがよくあります。すべてのテストケースで正しいと思われる場合は、次のステップに進む必要があります。正確性の数学的証明を考え出すことです。

正確性の数学的証明

それでは、欲張りアルゴリズムが正しいことを証明する必要があります:最適解を出力する(または、同様に良い複数の最適解がある場合、それらの1つを出力する)。

基本的な原則は直感的なものです:

原理:間違った選択を行わない場合は、大丈夫です。

貪欲なアルゴリズムには通常、一連の選択肢が含まれます。基本的な証明戦略は、アルゴリズムが決して悪い選択をしないことを証明しようとすることです。貪欲なアルゴリズムは後戻りできません-一度選択すると、コミットされ、その選択を取り消すことはありません-したがって、決して悪い選択をしないことが重要です。

何が良い選択としてカウントされますか?最適なソリューションが1つしかない場合、何が良い選択であるかが簡単にわかります。最適なソリューションによって作成されたものと同一の選択です。言い換えれば、貪欲なアルゴリズムの実行のどの段階でも、これまでにアルゴリズムによって行われた選択のシーケンスが最適解のプレフィックスに正確に一致することを証明しようとします。同等に最適な最適解が複数ある場合、最適な選択肢は、少なくとも1つの最適値と一致するものです。言い換えると、これまでのところ、アルゴリズムの選択のシーケンスが最適なソリューションのいずれかのプレフィックスに一致する場合、これまでのところ何も問題ありません(まだ何も問題はありません)。

生活を簡素化し、気を散らすものを排除するために、結びつきがない場合に焦点を当てましょう。単一の、独自の最適なソリューションがあります。すべての機械は、根本的な変更なしに複数の同等に最適なオプティマがある場合に引き継がれますが、技術的な詳細にはもう少し注意する必要があります。これらの詳細を無視し、最適なソリューションが一意である場合に焦点を当てることから始めます。それはあなたが不可欠なものに集中するのに役立ちます。

使用する非常に一般的な証明パターンがあります。アルゴリズムの次の特性を証明するために努力します。

クレーム:レッツアルゴリズムによって解出力することとOの最適なソリューションです。SOと異なる場合、Oを微調整して、Oとは異なり厳密にOよりも良い別の解O を取得できます。SOSOOOOO

なぜこれが役立つのか注目してください。主張が真の場合、アルゴリズムが正しいということになります。これは基本的に矛盾による証明です。Oと同じか、または異なります。それが異なる場合は、我々は別の解決策を見つけることができますO *厳密よりも良好だOを -しかし、我々が定義されていることは、矛盾だOを最適なソリューションであることが、より良いそれよりもだ任意の解決策があることはできません。したがって、SOと異ならせることはできません。Sは常にOに等しくなければなりませんSOOOOSOSOつまり、欲張りアルゴリズムは常に正しい解を出力します。上記の主張を証明できれば、アルゴリズムが正しいことを証明できました。

いいよ それでは、クレームをどのように証明しますか?解は、アルゴリズムによって作成されたn個の選択肢のシーケンスに対応するベクトルS 1S nとして考え、同様に、最適解OはベクトルO 1O Nをもたらす選択肢の配列に対応するOSOと異なる場合、S iでないインデックスiが存在する必要がありますS(S1,,Sn)nO(O1,,On)OSOi ; iなどの最小のものに焦点を当てます。その後、我々は微調整う Oを変更することにより、 Oで少し一致するように、番目の位置 S Iを、すなわち、我々は、最適解の微調整う Oを変更することにより、 Iその後、貪欲アルゴリズムによって選ばれたものに目の選択肢を、そしてこれがさらに優れたソリューションにつながることを示します。特に、 O を次のように定義します。SiOiiOOiSiOiO

O=(O1,O2,,Oi1,Si,Oi+1,Oi+2,,On),

ただし、グローバルな一貫性を維持するために、部分をわずかに変更する必要があることがよくあります。証明戦略の一部には、O ∗を適切に定義する際の賢さが含まれます。そして、証明の要点は、アルゴリズムと事実に関する事実を何らかの形で使用して、O Oより厳密に優れていることを示すことになります。Oi+1,Oi+2,,OnOOO; そこで、問題固有の洞察が必要になります。ある時点で、特定の問題の詳細に飛び込む必要があります。しかし、これにより、貪欲なアルゴリズムの典型的な正当性の証明の構造の感覚が得られます。

簡単な例:最大合計のサブセット

これは、簡単な例を詳細に説明することで理解しやすくなります。次の問題を考えてみましょう。

入力: Aセット、整数の整数k個の出力を: AセットS UのサイズのKその和可能な限り大きいですUk
SUk

この問題には自然な欲張りアルゴリズムがあります:

  1. 集合S:=
  2. i:=1,2,,k
    • レッツは、で最大の数であるUまだ選ばれていない(つまり、の最も大きい数番目のU)。x iSに追加します。xiUiUxiS

ランダムテストでは、これにより常に最適なソリューションが得られることが示唆されているため、このアルゴリズムが正しいことを正式に証明しましょう。最適なソリューションは一意であるため、関係を心配する必要はありません。上記の主張を証明しましょう:

項:レット入力で、このアルゴリズムによって溶液出力であるU K、およびO最適解。S Oの場合、合計がOよりも大きい別の解O を構築できます。SU,kOSOOO

証明。仮定、およびlet iは最初の反復の指標であるX IO。(S Oと仮定し、アルゴリズムの定義によりS = { x 1x k }であるため、このようなインデックスiが存在する必要があります。)(仮定により)iは最小であるため、X 1... X I - 1O、特に、SOixiOiSOS={x1,,xk}ix1,,xi1Oの形式は O = { x 1x 2x i 1x ix i + 1x n }で、ここで数字 x 1x i 1x ix nOO={x1,x2,,xi1,xi,xi+1,,xn}x1,,xi1,xi,,xn降順でリストされています。アルゴリズムの選択方法を見ると、我々は我々が持っている必要があることを見るのx I > X " jはすべてのためのJ 。特に、x i > x iです。だから、定義O = O { X I } { xは' I }、すなわち、我々が入手O *削除することによって、私にで目数をOx1,,xixi>xjjixi>xiO=O{xi}{xi}OiOを追加します。今の要素の和O *は、の要素の合計であるOプラスxはI - X " I、およびxは私を - XをI > 0、そうO *の合計がより厳密に大きいOの合計"。これは主張を証明します。xiOOxixixixi>0OO

ここでの直観は、貪欲なアルゴリズムがと矛盾する選択を行った場合、その段階で貪欲なアルゴリズムによって選択された要素を含むように変更された場合、Oさらに良いことを証明できるということです。以来Oが最適であり、おそらくそこに(それは矛盾になります)さらに良いそれを作るためにどのような方法が考えられますので、唯一残っている可能性が私たちの仮定が間違っていたということであることはできません。言い換えれば、貪欲アルゴリズムが選択をすることはありませんそれはOと矛盾しています。OOOO

この議論は、しばしば交換議論または交換補題と呼ばれます。私たちは、貪欲溶液から最適解が異なる最初の場所を発見し、我々はその要素交換想像対応する貪欲な選択肢(交換用X " 私はのためにX I)。一部の分析では、この交換は最適なソリューションのみを改善できることが示されましたが、定義により、最適なソリューションは改善できません。したがって、唯一の結論は、最適なソリューションが貪欲なソリューションと異なる場所があってはならないということです。別の問題がある場合は、特定の状況でこの交換原則を適用する機会を探してください。Oxixi


これは古い質問ですが、私にとってはGoogleでの最初の結果です。行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.
citelao

@citelao、あなたを混乱させたと聞いてすみません。残念ながら、それをより明確に説明する方法がわかりません。はい、複数の最適なソリューションがあり、すべて同じ値があります。それは正しいです。あなたが書いたものと私が書いたものはどちらも有効です。矛盾はありません。違いは、あなたが書いたものは貪欲なアルゴリズムが正しいことを証明するのに役立たないということです。私が書いたことは何をします。私が書いたものをもう一度調べてみて、私が書いたものがどのように役立つかを理解できるかどうかを確認することしかできません。それでも解決しない場合は、別の記事を見つけてください。私はそれがトリッキーで紛らわしいことを理解しています。
DW

1
早速のご返事ありがとうございます!アルゴリズムがある場合にのみアルゴリズムを証明することに焦点を当てるポイントを逃しましたa single, unique optimal solution。この質問は貪欲なアルゴリズムが正しいことを証明することに関するものなので、複数の最適なソリューションが存在する可能性がある場合の答えを提供したいと思います。このすべてを研究してからしばらく経ちましたが、algとは異なる最適な解Oで各要素O_iを交換できることを証明するだけでは不十分です。解SとS_iがあり、解O ' O より悪くないか?
citelao

@citelao、この手法は複数の最適なソリューションがある場合にも適用されます。最適なソリューションが一意である場合にのみ焦点を当てることをお勧めします。これは、これを初めて見たときに、これらの証明がその設定でどのように機能するかを理解しやすいためです。ただし、最適なソリューションが複数ある場合でも、同じ戦略が機能します。これを研究し、単一の最適なソリューションがある場合の動作を理解してから、一般的なケースに適用することをお勧めします。また、貪欲なアルゴリズムのいくつかの例証を研究するのに役立つかもしれないと思います。
DW

後者の質問に答えるには、いや、それだけでは不十分です。それはSが最適であることを証明しません。(O 'がOより悪くないことだけを要求する場合、Sが準最適であるが、そのような交換を行うことが可能である場合があります。したがって、Oより悪くないO'を達成できることを証明します。 「TはSが最適であると貪欲アルゴリズムが正しいことを証明していないかどうかについては何も証明し、私は方法は、もう少し答えで説明した勉強示唆それはトリッキーだ背理法を理解することは、多くの場合、注意が必要です)。。。。
DW

14

例として、次の単純なソートアルゴリズムを使用します。

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の反転があります。AA[i]A[j]A[i]>A[j]i<j

順序が間違っている2つの隣接するアイテムA [ i + 1 ]を明確に交換すると、反転A [ i ] A [ i + 1 ]は削除されますが、他の反転は影響を受けません。したがって、すべての反復で反転の数が減ります。A[i]A[i+1]A[i],A[i+1]

これは、アルゴリズムが最終的に終了することを証明しています。

ソートされたリストの反転の数は0です。すべてがうまくいけば、アルゴリズムは反転の数を0に減らします。ローカルの最小値でスタックしないことを示す必要があるだけです。

私は通常これを矛盾によって証明します。アルゴリズムは停止したと仮定しますが、解決策は正しくありません。例では、これはリストがまだソートされていないことを意味しますが、間違った順序で隣接するアイテムはありません。

リストがソートされていない場合、少なくとも2つのアイテムが正しい位置にない必要があります。レッツA [ J ]IA[i]A[j] A [ I ] > A [ J ]である二つのそのようなアイテムSTとの間の差 Iおよび jは最小です。アルゴリズムは停止しなかったため、隣接していないため、 i + 1 < jです。最小性を仮定したため、 A [ i ] < A [i<jA[i]>A[j]iji+1<jおよび A [ i + 1 ] < A [ j ]ですが、 A [ i ] < A [ j ]であり、矛盾があります。A[i]<A[i+1]A[i+1]<A[j]A[i]<A[j]

これは、リストがソートされたときにのみアルゴリズムが停止することを証明しています。これで完了です。


説明されているテクニックは非常に一般的であるため、この質問のトピックである欲張りアルゴリズムについてはほとんど何も特定されていません。
-Apass.Jack
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.