【プログラミング】アルゴリズムと貪欲アルゴリズム

貪欲アルゴリズムの理論的根拠

定義:
最適解を求める過程で、貪欲な基準のいくつかの種類の基礎、問題の初期状態から、貪欲に選択することにより、各ステップの最適解に直接数回行って、最適な最終結果の全質問解決策は、この解決方法は、貪欲アルゴリズムです。
最適解を得ることができ、全体としての問題を考慮すべきではない貪欲アルゴリズムは、それだけでローカルの意味での最適解にするために選択したが、その特性は、タイトル貪欲アルゴリズムの使用により、問題を決定します。
問題は、同時にいくつかの方法で解決することができる場合は、貪欲アルゴリズムは最良の選択の一つでなければなりません。

理論的根拠:
貪欲アルゴリズムは、最良の結果や最高のアルゴリズムを得ることを期待して、最高または現在の状態で最良の選択を各ステップでの選択肢を取っていますさ。
貪欲アルゴリズムは、階層的なアプローチが選択肢のシリーズを介して取得する問題を解決し、意義のある指標の下で、最適な解決策になることができますし、すべての選択肢には、最新の状態のすべてのいくつかの意味を成していました良い選択。地域の問題によって得られた最適解の全体の問題にことを願って最適なソリューションを提供します。
この戦略は非常に単純な方法で、多くの問題ができる最善全体的なソリューションですが、すべての問題に対する最善のソリューション全体を取得することができないので、常に効果的な保証することはできません。
貪欲な問題解決の戦略、我々は二つの問題を解決する必要があります:
(1)タイトルは貪欲な戦略を解決するための適切であり、
(2)どのような問題の最善の/よりよい解決策を得るために貪欲な基準を選択します。

動的なプログラミングの違い:
貪欲な選択肢プロパティは、ローカル、すなわち貪欲達成するために選択した一連の最良の選択をすることができ、全体の最適なソリューションの質問をすることをいいます。
これは、主な違いは、貪欲アルゴリズムと動的プログラミングアルゴリズムである、貪欲アルゴリズム可能最初の必須要素です。
(1)動的プログラミング・アルゴリズムでは、選択は、各ステップが後にのみ選択を行うために、子供に関連する問題を解決するように、多くの場合、子に関連する問題を解決するに依存して作られました。
(2)貪欲アルゴリズムは、唯一の現在の状態では最良の選択、再度選択した後に生成、すなわち、ローカルの最適な選択は、対応するサブ問題溶液を作製します。

  • 最適なソリューションは、彼の息子の問題の問題に対する最適解が含まれている場合、この問題は構造的な次善を持っているという。
    各変換で貪欲な戦略を使用して、最適なソリューションを達成しました。問題の最適な基礎構造の性質は、この問題の重要な特徴は、貪欲アルゴリズムまたは動的プログラミングアルゴリズムであることが可能です。
  • 貪欲すべての操作は、アルゴリズムの結果に直接影響を与え、ダイナミックプログラミングではありません。
    1. 各サブ問題の解決策は、選択を行う必要があり、あなたがロールバックすることはできませんのための貪欲アルゴリズム、ダイナミックプログラミングは、バックオフ機能、以前の選択の現在の結果に基づいて選択されます。
    2. 動的プログラミングは、主に2次元または3次元の問題に使用されるが、貪欲は、一般的に一次元の問題です。

貪欲アルゴリズムの問題解決:
次の側面を考慮すべき問題を解決するために貪欲なアルゴリズムを使用する:
(1)候補集合A:
問題の構築ソリューションのために、候補者は、問題の最終的な解決策であるがから取られる可能性のある解決策を設定するなどの問題がありますA.への候補セット
(2)ソリューションSのセット:
貪欲な選択、Sが満たす構成に問題の完全な解決まで拡大し続けているソリューションのセットとして。
ソリューションを解決するために(3)機能:
チェックし、完全なソリューションセットSソリューションは、問題となっています。
(4)選択機能を選択:
候補者は、ほとんどの問題の解決策を構成したいかを示す貪欲法への鍵であることを貪欲戦略は、目的関数と選択機能は通常関連しています。
可能(5)の可能な機能は:
チェック制約拡張を設定する溶液を満たした後、実行可能な候補のソリューションセットを追加しました。

典型的な例

I.活動の手配

【課題】
NイベントE = {1,2、...、n個のセットを }、 各アクティビティは、講堂等の同じリソースを必要とし、唯一つのイベントが同時に、このリソースを使用することができ。
私は、各アクティビティは、時間と終了時間Fiの、およびSI <Fiを提供開始SIリソースを使用する必要があります。イベントiは、リソースを選択した場合には、ハーフオープンの時間間隔[SI、FI)の内部を占めています。区間[SJ、FJ)との間隔[SI、Fiあり)活動と呼ばれる、互いに素である場合はi、jは互換性のある活動です。ときSI≥FJまたはアクティブなIと互換性SJ≥FiのJ活動。
活動の手配は、活動にに与えられた活動で最大のコレクションの互換性のサブセットを選択します。
ここに画像を挿入説明

[解析]
すべての活動取るためにフロントからバックまで年代順、。

[コード]

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int s;			//起始时间
	int f;			//结束时间
	int index;		//活动的编号
}a[100010];

int n;
int ss,ee;
int cmp(node a,node b)
{
    if(a.s!=b.s)
        return a.s<b.s;
    else
        return a.f<b.f;
}
vector<int>v;

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i].s>>a[i].f;
        a[i].index=i;
    }
    sort(a+1,a+1+n,cmp);
    int tmp=1;
    v.push_back(a[1].index);
    for(int i=2;i<=n;i++)
    {
        if(a[i].s>=a[tmp].f)
        {
            v.push_back(a[i].index);
            tmp=i;
        }
    }
    for(int i=0;i<v.size();i++)
        cout<<v[i]<<" ";
    cout<<endl;
    return 0;
}

第二、ナップザック問題を
【課題】
i番目の項目の重量、WI(1≤i≤n)の値は、充填された物品はナップザックを必要と前記n個のアイテムを考慮すると、Mのバックパックの自重を考慮し、バックパックそう内のアイテムの最大値。
アイテムは0-1ナップザック問題(動的計画法)と呼ばれ、分割できない場合、2つのタイプのナップザック問題は、(アイテムを分離することができるかどうかに応じて)があり、アイテムを分割することができた場合は、ナップザック問題(貪欲アルゴリズム)と呼ばれます。
ここに画像を挿入説明
[分析]
:項目を選択するための3つの方法があり
、(1)0-1ナップザック問題、最適値220を取得する動的プログラミングアルゴリズムとして
(2)0-1ナップザック問題、貪欲アルゴリズムとしては、コストに応じて、最適値160を取得するために最終的に上位から項目を選択します。不可分財のため、そして残りのスペースが無駄になります。
240の最適値を求める最終的に選択された高コストの項目から順に係るナップザック問題、貪欲アルゴリズムとして(3)。物品を分離することができるため、物品3の帯電部分の残りの空間は、より良好な性能を得ることができます。

[コード]

#include<bits/stdc++.h>
using namespace std;
struct node
{
    double value,weight,tmp;
    int index;
} a[100010];

int n;
double sum;
double ww;
int cmp(node a,node b)
{
    return a.tmp>b.tmp;
}

vector<int>v;

int main()
{
    cin>>n;
    cin>>ww;
    for(int i=1; i<=n; i++)
    {
        cin>>a[i].value>>a[i].weight;
        a[i].tmp=a[i].value/a[i].weight;
        a[i].index=i;
    }
    sort(a+1,a+1+n,cmp);
    double x=0;
    int cnt=1;
    for(int i=1; i<=n; i++)
    {
        if(x<ww)
        {
            x+=a[i].weight;
            sum+=a[i].value;
            v.push_back(a[i].index);
            cnt=i;
        }
    }
    if(x>ww)
        sum-=(x-ww)/a[cnt].weight*a[cnt].value;
    cout<<sum<<endl;
    return 0;
}
公開された335元の記事 ウォンの賞賛110 ・は 20000 +を見て

おすすめ

転載: blog.csdn.net/weixin_43460224/article/details/105245433