【问题标题】:C++ Algorithm for solving maximisation in linear programming用于求解线性规划中的最大化的 C++ 算法
【发布时间】:2016-03-22 01:10:25
【问题描述】:

我正在学习使用线性规划进行最大化,并且遇到了一种用于最大化两个变量(在本例中为 silvergold)的算法,但我不确定是什么某段代码正在做:

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

【问题讨论】:

    标签: c++ algorithm linear-algebra maximization


    【解决方案1】:

    你需要用谷歌搜索的神奇词汇是线性规划约束最大化的“单纯形算法”。 这个幻灯片看起来可能是您想要的。 http://www.cs.nccu.edu/~melikyan/mat_fm/lec/lec5_4.pdf

    【讨论】:

    • 感谢 Hal 的提示,在我看来,它比单纯形算法更像一个贪心算法
    • 两个数组 - 将其视为具有两个值的结构的数组。按这两个值的乘积排序。初始化为幻数的低零和高值的二进制搜索。丢弃所有银和金的价值,其中银总和为测试值。将剩余部分乘以黄金作为成本的起始值,将剩余的黄金相加并相加。首先最大化黄金,然后考虑到拾取所有剩余的白银,你可以看起来是它正在尝试做的事情。
    猜你喜欢
    • 2021-01-29
    • 1970-01-01
    • 2023-03-22
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多