欲張り法は、複雑な問題を一連の比較的単純な局所最適選択に分解することです。選択の各ステップは、問題の完全な解が得られるまで、現在の解を拡張することです。欲張り法の典型的な用途は最適化問題を解くことであり、多くの問題について、全体的な最適解を得ることができます。全体的な最適解が得られない場合でも、通常は最適解の良い近似です。
概要概要
欲張り法のデザインアイデア
欲張り法は近視眼的であり、全体的な最適性を考慮していません。それが行う選択は、ある意味で局所的な最適化のみです。この局所的な最適化の選択は、必ずしも全体的な最適解を達成するとは限りませんが、通常は近似最適化を得ることができます。解決。
欲張り法によって解決される問題には、一般に、最適な部分構造特性と欲張り選択特性という2つの最も重要な特性があります。
1)最適部分構造の性質:問題の最適解がその部分問題の最適解を含む場合、その問題は最適部分構造の性質を持っていると言われます。また、問題は最適化の原則を満たしているとも言われます。問題の最適部分構造構造的性質は、動的プログラミング法または貪欲法によって問題を解決できるという重要な特徴です。
2)欲張り選択の性質:いわゆる欲張り選択の性質は、問題の全体的な最適解が一連の局所的な最適選択、すなわち欲張り選択を通じて得られることを意味します。欲張り法は通常、一連の欲張り選択を行います。トップダウン方式で。欲張りな選択があるかどうかを判断する
- 通常、最初に問題の全体的な最適解を調べ、この最適解を変更して貪欲な選択から開始できることを証明します。
- 貪欲な選択をした後、元の問題は小規模で同様のサブ問題に縮小されます
- 数学的帰納法を使用して、欲張り選択の各ステップを通じて、問題の全体的な最適解が最終的に得られることを証明します
欲張り法の解決プロセス
欲張り法は通常、現在の局所最適戦略に従って、特定の初期状態から開始し、条件として制約方程式を満たし、目的関数を基準として最も速く(最も遅く)成長することを基準として、最適化問題を解決するために使用されます。候補セット問題の実行可能な解決策をできるだけ早く形成するために、一連の選択を行います。
グラフ問題における欲張り法
TSP問題
TSP問題は、n個の都市を旅行したい旅行者を指し、各都市で1回だけ経験し、その後出発都市に戻り、最短距離を必要とします。
欲張り法によってTSP問題を解決するための2つの欲張り戦略があります
-
最近傍戦略:頂点から開始して、近傍が選択され、距離が最短になるたびに。このプログラムの最終結果を保証することは難しいので、合格します。
-
最短リンク戦略:グラフ全体の範囲内でソリューションセットに追加する最短エッジが選択されるたびに、ソリューションセットに追加されたエッジが最終的にハミルトニアンループを形成することを確認する必要があります。したがって、残りのエッジセットE 'からエッジ(u、v)を選択して解集合Sに追加する場合は、次の条件を満たす必要があります。
- エッジ(u、v)は、エッジセットE 'の中でコストが最小のエッジです。
- エッジ(u、v)が解集合Sに追加された後、Sでループは生成されません。
- エッジ(u、v)が解集合Sに追加された後、Sは分岐を生成しません
このアイデアは、TSP問題を解決し、最短エッジを取得してヒープソートを使用し、2つの頂点が接続されているかどうか、分岐があるかどうかを判断し、ユニオン検索を使用して時間パフォーマンスをO(nlog2 n)に向上させることができます。
TSP問題に関連するトピックはないので、ここでは説明しませんが、このアイデアは実際には動的計画法よりも簡単ですが、特定の実装でははるかに困難です。
グラフ彩色の問題
無向連結グラフG =(V、E)が与えられた場合、グラフGの最小色数kを見つけます。これにより、k色を使用してGの頂点に色を付け、隣接する2つの頂点に異なる色を付けることができます。
欲張り戦略は次のとおりです。色を選択し、開始頂点として任意の頂点を取り、順番に色付けされていないグラフ内の各頂点を検査します。頂点を色1で色付けできる場合、つまり、頂点がまだ色付けされていない場合は、色1を使用して頂点に色を付けます。この色で色付けできる頂点がない場合は、開始頂点として色2と色付けされていない頂点を選択し、2番目の色を使用して同じ数の色を付けます。可能な限り頂点。色付けされていない頂点がある場合は、色3を選択し、できるだけ多くの頂点に色を付けます。
この戦略は、色付けのために頂点が選択される順序と多くの関係があり、それが最適な解決策であるかどうかを確認するのは困難です。著者がこの問題について話している理由はわかりません。
最小全域木問題
G =(V、E)を無向連結グラフとし、スパニングツリーの各エッジの重みの合計をスパニングツリーのコストと呼びます。Gのすべてのスパニングツリーの中で、コストが最小のスパニングツリー最小生成ツリーと呼ばれます。
- 最も近い頂点戦略:頂点を選択し、頂点に隣接する最も近い頂点を見つけ、ポイントを追加した後、これら2つの頂点に隣接する最も近い頂点を見つけ、すべての頂点が追加されるまでプロセスを繰り返します。これはプリムアルゴリズムとも呼ばれ、その時間計算量はO(n ^ 2)です。
- 最短エッジ戦略:最短エッジ戦略はTE = {}から始まります。貪欲な選択はすべて、エッジセットEから最短エッジ(u、v)を選択することです。エッジ(u、v)がセットに追加された場合ループを生成せずにTEを実行し、エッジ(u、v)をエッジセットTEに追加し、セットEから削除します。これはKruskaアルゴリズムとも呼ばれ、その時間計算量はO(elog2 e)です。
これら2つのアルゴリズムの証明は、実際には矛盾によって証明できます。最適でない場合は、あるポイントから別のポイントまでの距離が現在のエッジよりも短いことを意味しますが、これは存在しないため、最適です。
LOCKの欲張りアルゴリズムシリーズにはグラフ関連のアルゴリズムがないため、ここでは演習を行いません。
組み合わせ問題における欲張り法
ナップサック問題
n個のアイテムと容量Cのバックパックが与えられた場合、アイテムiの重量はwiであり、その値はviです。バックパックの問題は、バックパックにロードするアイテムをどのように選択して、バックパックのアイテムは最大化されていますか?
このナップサック問題は0/1ナップサック問題ではありません。アイテムは部分的にロードできるため、欲張り法を使用できます。欲張り戦略は、アイテムセットから最大の単位重量値を持つアイテムが選択されるたびに、単位値です。 = vi / wi。
- 1383.チームパフォーマンスの最大値-難易度コードこの質問は、問題の最初のアイデアである問題を解決していないということです。答えを読んだ後、私はそれを理解しました。それは確かに欲張りアルゴリズムです。この問題を解決するには、アイデアについて明確に考える必要があります。実際、この問題のアイデアはマクロの観点から非常に単純です。さらに、goヒープを柔軟に使用する必要があります。
イベントスケジューリング問題
n個のアクティビティセットE = {1,2、……、n}があり、それぞれが同じリソース(講義会場など)の使用を必要とし、1つのアクティビティのみがこのリソースを同時に使用できます。各アクティビティiには、リソースの使用を必要とする開始時間siと終了時間fiがあり、si <fiです。アクティビティiが選択されている場合、それはハーフオープン時間間隔[si、fi)でリソースを占有します。区間[si、fi)と区間[sj、fj)が交差しない場合、アクティビティiとアクティビティjは互換性があると言われます。言い換えると、si> = fjまたはsj> = fiの場合、アクティビティiはアクティビティjと互換性があります。イベントスケジューリングの問題では、互換性のある最大のアクティビティのサブセットを、指定された一連のアクティビティから選択する必要があります。
合理的な欲張り戦略は次のとおりです。次のアクティビティをできるだけ早く開始できるように、最も早い終了時間。
すべてのアクティビティを最も早い終了時間に従ってソートし、最初からばらばらのアクティビティを選択します。これが最終結果です。
厄介な点は、欲張り戦略が正しい結果を計算できることをどのように証明するかです。
- 全体的な最適解は、貪欲な選択から始まります。E= {1,2……、n}をn個のアクティビティのセットとし、Eのアクティビティは終了時間の降順ではない順序で配置されるため、アクティビティ1が最も早くなります。終了時間。まず、欲張りな選択から始まるアクティビティスケジューリングの問題に最適なソリューションがあることを証明します。つまり、最適なソリューションにはアクティビティ1が含まれます。AがEのサブセットであり、アクティビティスケジューリング問題の最適解であり、Aのアクティビティも終了時間の降順ではなく配置され、Aの最初のアクティビティがアクティビティkであるとします。k = 1の場合、Aは最適な開始貪欲を選択します。k> 1の場合、B = A- {k} +1、つまり、アクティブに置換された1アクティビティkAを最適解とします。f1 <= fkであるため、Bのアクティビティも互換性があり、Bのアクティビティの数はAのアクティビティの数と同じであるため、Bも最適なソリューションです。貪欲な選択から始まる最適な活動手配計画が常にあることがわかります。
- 貪欲な選択を行った後、元の問題は小規模で同様のサブ問題に縮小されます。アクティビティ1を選択した後、元の問題は、アクティビティ1と互換性のあるEのすべてのアクティビティをスケジュールするためのサブ問題に縮小されます。言い換えると、Aが元の問題の最適解である場合、A 'はアクティビティ配置サブ問題E' = {si> = f1、siはE}に属します。そうでない場合、B 'がE'の最適解であると仮定すると、B 'にはA'よりも多くのアクティビティが含まれ、アクティビティ1をB 'に追加すると、EのソリューションBが生成され、BにはAよりも多くのアクティビティが含まれます。これは矛盾します。 Aは元の問題の最適解です。したがって、各ステップでの欲張り選択の急降下問題は、元の問題と同じ形式の小規模なサブ問題に縮小されます。
- 欲張りな選択肢の数に数学的帰納法を適用することで、欲張り法が活動スケジューリングの問題を解決し、最終的に元の問題に対する最適な解決策を生み出すことを証明できます。
- 1386.映画館の座席配置-ミディアムコード
マルチマシンスケジューリング問題
n個の独立したジョブ{1,2、……、n}があり、それらはm個の同一のマシン{M1、M2、……、Mm}によって処理され、ジョブiのロックに必要な処理時間はti(1 <= i <= n)、各ジョブは任意のマシンで処理できますが、中断または分割することはできません。マルチマシンスケジューリング問題には、ジョブスケジューリングスキームが必要です。これにより、指定されたn個のジョブをm台のマシンで最短時間で処理できます。
マルチマシンスケジューリング問題はNP困難であり、これまでのところ効果的な解決策はありません。この種の問題の場合、欲張り法を使用すると、より適切な近似解が得られる場合があります。マルチマシンスケジューリング問題を解決するための欲張り法の欲張り戦略は、最も長い処理時間のジョブ優先度です。つまり、最も長い処理時間のジョブが最初のアイドル状態のマシンに割り当てられます。これにより、長い処理時間のジョブを確実に実行できます。全体的な結果を得るために、処理時間が最初に処理されます。可能な限り最短の処理時間。
実際、欲張り法の章を読んだとき、なぜ先生が欲張り法を使ってこの章の多くのトピックの正しい結果を計算したのか理解できませんでした。この本の鍵は正しい結果を計算することではなく、欲張り法で何ができるのか、何ができないのか、そしてどこまでできるのかを理解することなので、少し理解できました。実際の社会では、結果が最も正確であるかどうかよりも他のいくつかの要因がより大きな影響を与える可能性があるため、最も正確な結果も必要ない場合があります。
総括する
DPの問題は面倒だと思いましたが、後で欲張り法の方が面倒であることがわかりました。主な理由は、欲張り法を使用するには、最適解が得られるという証拠が必要なためです。
- 貪欲な選択から始める
- 小規模で同様のサブ問題に縮小
- 帰納法を使用して、最適解を生成できることを証明します
欲張り法の証明は動的計画法よりも複雑であり、この章の演習は動的計画法なしでよりスムーズに行うことができます。欲張り法をもっと練習することをお勧めします。
やっと
私の記事が気に入ったら、私の公式アカウント(プログラマーMala Tang)をフォローしてください。
私の個人的なブログは次のとおりです:https://shidawuhen.github.io/
以前の記事のレビュー:
アルゴリズム
技術
- マイクロサービスのサービスフレームワークとレジストリ
- Beegoフレームワークの使用法
- マイクロサービスについて話す
- TCPパフォーマンスの最適化
- 電流制限の実現1
- Redisは分散ロックを実装しています
- Golangソースコードのバグ追跡
- トランザクションの原子性、一貫性、耐久性の実現原理
- 詳細なCDNリクエストプロセス
- 押しつぶされたブログサービスの歴史
- 一般的なキャッシュ手法
- サードパーティの支払いに効率的に接続する方法
- ジンフレームワークの簡潔なバージョン
- InnoDBのロックとトランザクションの簡単な分析
研究ノート
考え