貪欲アルゴリズム
最適化問題を解決するためのアルゴリズムは、典型的には、各ステップがオプションの数を有する、一連のステップを含みます。多くの最適化問題のために、単純な貪欲アルゴリズムは、動的計画法を使用せずに解決することができます。貪欲アルゴリズム地元の選択が行われるように局所的な最適解を選択することで、グローバルな最適化を生成するために、現在のベストを探します。この記事では、貪欲アルゴリズムと、いくつかの簡単なアプリケーションの理論的根拠を説明しています。問題の初期状態から、貪欲な基準のいくつかの種類の基礎を最適解を求める過程では、各ステップに最適なソリューションに直接アクセスし、貪欲な選択数回で、問題全体の最適解は、最終的に来ます、この解決方法は、貪欲アルゴリズムです。
アルゴリズムの貪欲な設計手順:
残りの問題子供を解決するために、選択をすることで、問題への最適化問題、。
元の問題の最適解の一つは、貪欲に選択することによって証明することができます。
貪欲な選択を行った後、証明する、貪欲の残りの問題にサブ最適解と我々は元の問題の最適解を得ることができ、組み合わせて選択します。
我々は問題は二つの重要な特性を持っていることを証明できる場合は一般的に、あなたは貪欲アルゴリズムでそれを設計することができます。
(1)貪欲な自然を選択:グローバル最適解が選択された局所最適解(貪欲)によって達成することができます。選択することを検討した場合には、唯一の現在の問題に関するサブ質問の結果を考慮せずに最良の選択肢を検討しています。動的計画法では、各ステップは、部分問題への解決策に依存している選択を行う必要があります。動的なプログラミングは小さなから大きな問題と問題のために、ボトムアップから、一般的です。貪欲アルゴリズムは通常、トップダウンで、貪欲一つ一つが行うことを選択、より小さなサブ問題に与えられた問題インスタンス規程に進みます。
(2)最適な下部構造であって、サブ問題を含む最適解の問題に対する最適解は、問題は最適な下部構造を有すると言われている場合。**
貪欲な基準を選択する方法を検討する必要が貪欲を使用して問題を解決するための鍵。
理論的根拠貪欲アルゴリズム
この理論は、すべてのケースが含まれていませんが、貪欲アルゴリズムが適用されますが、それは非常に興味深いの数を記述したときに、貪欲アルゴリズムの最適解を決定するために使用することができる理論がありますが、貪欲なアルゴリズムを使用して与えることができ状況。
第二に、アプリケーションの質問
1.活動の選択。
200室と各両側の南北回廊に沿ってこの床。最近、同社は改装を行い、オフィスのさまざまな机の間を移動する必要があります。そのため、狭い廊下で、机は素晴らしいです、廊下だけワークデスク経由することができます。私たちは、輸送効率を向上させるための計画を策定しなければなりません。定式化マネージャ計画は次のとおりデスクは10分、最大で別の部屋に1つの部屋から移動すること。私はワークデスクjに部屋から部屋へと移動すると、廊下には、2つのオフィス占有されている間になります。だから、10分ごとに、そうでない場合は同じ段落の廊下、机は部屋から部屋に移動することができます。
そこテーブルを搬送路のアイデアがオーバーラップであれば、そこに同時にこと、したがって最短の数を介して各部屋の状況を考慮していなければならない処理です。
int i, j;
int move[200];
int N; //搬运次数
//每次搬运的起点和终点
int from, to;
scanf("%d", &N);
memset(move, 0, sizeof(move));
for(i = 0; i < N; i++)
{
scanf("%d%d", &from, &to);
//将房间号映射为走廊号
from = (from - 1)/2;
to = (to - 1)/2;
//确保from<to,C++使用:swap(from, to)
if(from > to) {
int temp = from;
from = to;
to = temp;
}
//占用走廊情况
for(j = from; j <= to; j++)
move[j]++;
}
2.取り外し可能なナップザック問題
優先順位の程度に合わせて質問の意味に応じて選択貪欲選択基準、。
たとえば、これはあなたの食べ物を拾うに戻ります食べて、食べに食堂に行くが、あなたの片手だけ、人々が食べるようになる、結果の商の品質の価格で割った価格は貪欲なガイドラインであるとして、プロバイダが価格に従ってください優先選択。
3.最適な負荷の問題
船舶の積載容量にロードされるコンテナの数をc、iはウィスコンシンた容器の量で存在します。多くのコンテナが船に搭載されたように、負荷は、無制限の量を決定するために必要な場合に最適なローディングの問題。
ボリュームが品質上の制約によってのみ限定されるものではないので、品質小さな容器を選択するために最初から見ることができます。
4.いくつかの問題を削除
string a; //n位数a
int k;
cin>>a>>k;
//如果k≥n,数字被删完了
If (k >= a.size()) a.erase();
else while(k > 0)
{
//寻找最近下降点
int i;
for (i=0; (i<a.size()-1) && (a[i] <= a[i+1]); ++i);
a.erase(i, 1); //删除xi
k- -;
}
//删除前导数字0
while(a.size() > 1 && a[0] == '0')
a.erase(0, 1);
cout<<a<<endl;
5.複数の最適な順序の問題
この質問は、元雇用は最長ヒトの状況、確かにない最適なソリューションを待つために長い時間を持つことになりますと、そのように顧客が、短い時間を待ちたいです。最小の最初から想定し、人々が時間によって少量を掛けベース、その後徐々に数を減らすために、物事との間に延びます。
6.機械スケジューリング問題
n個の操作からなるジョブセットは、mが同一の加工工程であってもよいです。ジョブが最短時間で処理されたn個のM-機によって行われることを考えると、スケジューリング方式を与えるために必要。仕事はより小さなサブジョブに分割することはできません。各ジョブは、任意のマシンで処理することができます。問題はNP完全である、そこには効果的なソリューション(最適解)はありませんが、貪欲な選択戦略は、より良い近似アルゴリズム(次善の解決策を見つける)を設計するために使用することができます。場合<限り時間間隔はジョブにジョブに割り当てられているとして、= M; N場合> N M、降順にソート最初のn個の操作を、この順序は、プロセッサがアイドル状態にジョブを割り当てます。つまり、ジョブの残りの部分からで、最長処理時間を選択し、処理時間と長い時間を選択し、全体のプロセスは、すべての割り当てを完了するまで、またはマシンは、他のジョブを処理することはできませんまで。我々が対処する必要があるたびに、アイドルマシンに割り当てられた最短の仕事であれば、他のすべてのジョブを処理のみの場合に必要な最長の仕事上で処理され、これはあまり効率的にバインドされているように見えるかもしれません。
7.6。インターバル・カバレッジの問題
POJ1328は、貪欲アルゴリズムの典型的な例です。想定直線海岸線が無限大の効果を受けます。海岸線の陸側で、反対側の海。それぞれの小さな島は海の上の点です。レーダー、距離dだけをカバーし、海岸線に位置しているので、島をカバーすることができるならば、ほとんどのそれらの間の距離d。特定のすべての島は、被験者のレーダーカバーの最小必要数を算出しました。各島のために、私たちはレーダーレンジ嘘の位置を算出することができます。
どのようにいくつかのポイントとの間隔に、これらの問題をカバーします。並べ替え、必要な初期ポイントの左端の大きさに応じてすべてのセクションの最初の。交差しない2つの間隔が重複した場合、我々は何もする必要はありません。範囲は完全に別のセクションに含まれている場合、我々は右のポイントの範囲を更新する必要があり、2つの間隔が交差しない場合、我々は増加し、ポイントに右のポイントを更新する必要があります。