2016-03-22 11 views
2

を最大化を解くために、私は線形計画との最大化について学んでいますし、2つの変数(この例では)を最大化するためのアルゴリズムに遭遇してきたが、私はどのような特定のわかりませんよコードのセクションがやっている:C++アルゴリズムは線形計画に

using namespace std; 


class PreciousStones { 
    int n; 
    vector<int> as; 
    vector<int> ag; 

を以下の関数は、私が不明確だセクションです:

double maxg (double s) { 
    double g = 0; 
    for (int i=0; i<n; i++) 
     if (s == 0) 
     g += ag[i]; 
     else if (as[i] <= s) 
     s -= as[i]; 
     else { 
     g += (1-s/as[i])*ag[i]; 
     s = 0; 
     } 
    return g; 
    } 

コードの残りの部分は以下の通りです(cについてontext)、誰もがこのアルゴリズムにいくつかの関連する論文を知っている、またはこの機能に簡単な説明を提供できる場合、私は非常に感謝します

public: 
    double value(vector <int> silver, vector <int> gold) { 
    n = silver.size(); 
    as = silver; 
    ag = gold; 
    for (int i=0; i<n; i++) 
     for (int j=i+1; j<n; j++) 
     if (as[j]*ag[i] > as[i]*ag[j]) { 
      swap(as[i], as[j]); 
      swap(ag[i], ag[j]); 
     } 
    double lo = 0; 
    double hi = 51*100; 
    double D = 1e-10; 
    while (lo+D < hi && lo*(1+D) < hi) { 
     double mid = (lo+hi)/2; 
     if (mid <= maxg(mid)) 
     lo = mid; 
     else 
     hi = mid; 
    } 
    return lo; 
    } 
}; 

答えて

1

Googleに必要な魔法の言葉は、線形計画法のための「シンプレックス法」です制約の最大化。 このスライドデッキは、あなたが望むように見えます。 http://www.cs.nccu.edu/~melikyan/mat_fm/lec/lec5_4.pdf

+0

ヒントをいただきありがとうございます。私にはSimplexアルゴリズムよりも貪欲なアルゴリズムのように見えます。 –

+0

2つの配列 - 2つの値を持つ構造体の配列と考えてください。これらの2つの値の積でソートします。ゼロと高い値の低いバイナリ検索は、魔法の数に初期化されます。シルバーとゴールドのすべての価値を投げ捨てて、シルバーとテストの合計額を加算します。金の残余に金の出発値として金を掛け、残りの金を合計して加算する。最初に金を最大にしてから、残っている銀をすべて拾い上げると、それが何をしようとしているのかが分かります。 – Hal

+0

大丈夫、ありがとうたくさん:)意味がある –

関連する問題