2016-03-22 5 views
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; 
    } 

остальная часть кода ниже (для с КОНТЕКСТ), если кто-нибудь знает о некоторых соответствующих документов по этому алгоритму, или может дать краткое объяснение этой функции я оценил бы его сильно

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 являются «Simplex алгоритма» для линейного программирования максимизация ограничений. Эта слайд-колода выглядит так, как будто она может быть тем, что вы хотите. http://www.cs.nccu.edu/~melikyan/mat_fm/lec/lec5_4.pdf

+0

Спасибо за подсказку Hal, для меня это выглядит как жадный алгоритм больше, чем симплексный алгоритм –

+0

Два массива - подумайте об этом как о массиве структуры с двумя значениями. Сортировка по продукту этих двух значений. Двоичный поиск с низким нолем и высоким значением, инициализированным магическим числом. Отбросьте все значения серебра и золота, где серебро суммируется до испытательного значения. Умножьте остаток по золоту в качестве стартового значения для стоимости, суммируйте остаток золота и добавьте. Максимизируйте золото сначала, а затем, учитывая, что забрать все остаточное серебро, которое вы можете смотреть, это то, что он пытается сделать. – Hal

+0

Хорошо круто, спасибо большое :), что имеет смысл –

Смежные вопросы