C ++(データ構造及びアルゴリズム)77:---貪欲アルゴリズム(貨物の積載、ナップザック問題、トポロジカルソート、半分が覆われ、単一始点最短経路、最小コストのスパニングツリー)

A、コンテナ積載

  • 問題の説明:貨物船は状態にあり、全ての貨物箱の大きさは同じですが、貨物のボックスの重量は異なります
  • :今、私たちはある尋ねる過負荷をかけることなく、貨物船の積荷の状態の最大数

解決するために貪欲アルゴリズム

  • :思考カートン、誕生から貨物ボックス、貨物コンテナの選択された最小重量を選択する際にアップし、その後、コンテナがロードされ、その数を確保することができます
  • 例えば:と仮定他のボックスはn = 8、xは容器の数は、それぞれ、[100,200,50,91,150,50,20,80】重みw、最大過負荷船C = 400。次いで、基板上にロードさ貪欲アルゴリズムは、7,3,6,8,4,1,5,2容器、390の総重量の番号を付け、この時間X1で得られた最適なソリューション[、... X8であります] = [1,0,1,1,0,1,1,1]
  • 定理:上記貪欲アルゴリズムを用いて最適な負荷を生じます。次の定理の証明

達成するためのC ++コード

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

//用于表示货箱
struct container {
    container(int _id, int _weight, int _flag = 0) 
        :id(_id), weight(_weight), flag(_flag) {}
    int id;    //货箱编号
    int weight;//货箱重量
    int flag;  //用于表示是否装载进货船。0表示没有,1表示有
};

/*
参数:
    c:货箱集合
    capacity:船的最大超载容量
*/
void containterLoading(const std::vector<container*>& c, int capacity)
{
    //如果船未超载,那么进行装箱操作
    for (auto iter = c.begin(); ((iter != c.end()) && ((*iter)->weight <= capacity)); ++iter) {
        (*iter)->flag = 1;
        capacity -= (*iter)->weight;
    }
}

bool isMax(const container* p1, const container* p2)
{
    return p1->weight < p2->weight;
}

int main()
{
    //初始哈8个货箱
    std::vector<container*> vec;
    vec.push_back(new container(1, 100));
    vec.push_back(new container(2, 200));
    vec.push_back(new container(3, 50));
    vec.push_back(new container(4, 90));
    vec.push_back(new container(5, 150));
    vec.push_back(new container(6, 50));
    vec.push_back(new container(7, 20));
    vec.push_back(new container(8, 80));

    //根据container的重量对所有的货箱进行排序
    std::sort(vec.begin(), vec.end(), isMax);

    //装箱操作
    containterLoading(vec, 400);

    //打印信息
    std::cout << "The number of the case being loaded is :";
    for (auto iter = vec.cbegin(); iter != vec.cend(); ++iter) {
        if ((*iter)->flag)
            std::cout << (*iter)->id << " ";
    }
    std::cout << std::endl;
    return 0;
}
  • 結果は以下の通りであります:

第二に、ナップザック問題

問題の説明

  • n個のアイテムと容量Cのバックパックがあります。アイテムの重量は私のWi、Pの値です。今でバッグに選択された項目の数からn個のアイテム
  • 現在、Best主張は次のとおりです。記事ディスペンサーパッケージの総重量は、パックの容量を超えないように最高に項目の合計値
  • 問題の説明は次のとおりです。

  • 制約は以下のとおりです。

  • XI = 1は、バックパックの中に物品を示し、XI = 0は、バックパックに何記事がないことを示し
  • 0/1ナップザック問題は、実際には各容器得られた値から一般化問題ローディングカートンが、異なっています

貪欲な戦略①

  • ルール:選択した項目の最大値は、記事の残りの部分からバックパックをロードすることができます
  • この戦略は、最適解を保証するものではありません。
  •  

②貪欲戦略

  • ルール:バックパックの最低重量を選択するには、資料の残りの記事からロードすることができます
  • この戦略は、最適解を保証することはできません

③貪欲戦略

  • ルール:最大パイ/のWiの値を選択するが、残りの記事からバックパックの記事をロードすることができます
  • この戦略は、最適解を保証することはできません

貪欲ヒューリスティック法

  • 3つのアルゴリズムは、最適なソリューションを保証することはできません上記のが、私たちは落胆する必要はありません。0/1ナップザック問題は、複雑な問題ですNP-
  • ポリシーは③最適解を保証するものではありませが、我々はそれが良いヒューリスティックアルゴリズムであると思うし、何度もあって、それは非常に近い最適解の解にあります。最適解は、239を有するように600ランダムに生成されたナップザック問題の一つの実験、この溶液を用いて貪欲ヒューリスティックアルゴリズムでは、583は全て600、従って、最適解中の10%の差を有する溶液を有します最適との溶液を25%以内ちょうどフルsolution're。そして、アルゴリズムはO(nlogn)時間で完了することができ、パフォーマンスが非常に良いです

Kの順序の最適化

  • K順序の最適化原理は次のとおりです。
    • まず、ほとんどのk個のアイテムバックパック、いくら彼ら値に
    • k個のアイテムがナップザックCの最大容量を超える場合、この操作は放棄されています
    • k個のアイテムはバックパックcの最大容量を超えていない場合は、順序PI /のWi値商品をバックパックに一枚ずつ減少に残っているアイテムから継続
  • = [6,10,12,13]、P = [6,10,12,13]、C = 11、PI /のWi = [3,2.5,2,1.8、W、N = 4と仮定する
  • 0場合K =:バックパックにその濃度値に応じて項目の順序を非増加。まず、第1条にバックパックは、記事2はその後です。これは、5バックパックの残容量である任意の物品を置くことができないので、溶液は、x = [1,1,0,0]であり、この溶液は値16を有しています
  • K = 1、K = 2は、ときに結果は以下の通りでした:

  • 溶液を、得られた修飾された貪欲ヒューリスティックは順K.最適化されています k個のアイテムを溶液から取り出し、別のk個のアイテムに配置された場合には、であり、次いで、得られた結果は、元の良好ではありません。また、%(100 /(K + 1))の最適な値に、このようにして得られた値以内。したがって、我々はこのヒューリスティックメソッドを呼び出すと、有界ヒューリスティックパフォーマンスと呼ばれています
    • K = 1の場合:最終的な結果は、最適値の50%未満であります
    • 場合K = 2:33.33パーセント以内に
  • 増加K、自身に必要な試行の回数(Oと実行時間が増加する境界性能ヒューリスティックはN ^ {K})、時間は、各サブセットO(n)のために必要。また、項目は比要する時間はO(nlogn)である値によってソート。したがって、K> 0、Oの合計時間(N ^ {K + 1}
  • パフォーマンスの実際の検査がはるかに優れている、次の図に示す統計結果のランダムテストの600種類:

第三に、トポロジカル整列

つづきます

第四に、バイナリカバー

つづきます

第五に、単一ソースの最短経路

つづきます

第六に、最小コストスパニングツリー

つづきます

リリース1525元の記事 ウォンの賞賛1085 ビュー45万+

おすすめ

転載: blog.csdn.net/qq_41453285/article/details/104447962