2016-03-22 31 views
2

ich Maximierung mit linearer Programmierung am Lernen und habe über einen Algorithmus zur Maximierung mit zwei Variablen (Silber und Gold in diesem Fall) kommen, aber ich bin nicht sicher, was ein gewisses Abschnitt des Codes tut:C++ Algorithmus für die in der linearen Programmierung lösen Maximierung

using namespace std; 


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

die Funktion unten ist der Abschnitt ich bin unklar auf:

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; 
    } 

der Rest des Codes ist unten (für c ONTEXT), wenn jemand von einigen relevanten Papieren zu diesem Algorithmus kennt, oder kann eine kurze Erklärung zu dieser Funktion zur Verfügung stellen würde ich es sehr zu schätzen

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; 
    } 
}; 

Antwort

1

Die magischen Worte, die Sie brauchen, um Google ist „Simplex-Algorithmus“ für die lineare Programmierung Beschränkungsmaximierung. Dieses Diaplay sieht aus, als ob es sein könnte, was Sie wollen.

+0

Danke für den Tipp Hal, für mich sieht es aus wie ein Greedy-Algorithmus mehr als der Simplex-Algorithmus –

+0

Zwei Arrays - denke an es als ein Array einer Struktur mit zwei Werten. Sortiere nach dem Produkt dieser beiden Werte. Binärsuche mit niedriger Null und hohem Wert, initialisiert auf magische Zahl. Werfen Sie alle Werte von Silber und Gold weg, wobei Silber zum Testwert addiert wird. Multiplizieren Sie den Rest mit Gold als Startwert für die Kosten, summieren Sie den Rest des Goldes und fügen Sie hinzu. Maximiere zuerst Gold und dann, wenn du das restliche Silber abholst, kannst du sehen, was es zu tun versucht. – Hal

+0

Ok cool, vielen Dank :) das macht Sinn –