我问过一个问题,可以在这里找到:
Computing the optimal combination
并且有人建议使用线性编程。我已经查找了线性编程和Simplex方法。但是我遇到的所有例子都有不等式约束,这些约束使用松弛变量转换成等式。然后,单纯形法交换基本变量和非基本变量以获得最优解。
但我的问题是:
最小化:
x1 + x2 + ... + xn
受制于:
a1 * x1 + a1 * x2 + a1 * x3 + ... + a1 * xn = c1;
a2 * x1 + a2 * x2 + a2 * x3 + ... + a2 * xn = c2;
a3 * x1 + a3 * x2 + a3 * x3 + ... + a3 * xn = c3;
现在我不知道如何在这里应用单纯形法,因为我这里没有任何基本变量。
我也不能只求解线性方程,因为我有n个变量和3个方程。
有人可以建议我一个出路吗?
答案 0 :(得分:5)
您可以将每个方程式重写为两个不等式:
a1*x1 + a1*x1 + a1*x3 + … + a1*xn ≤ c1
a1*x1 + a1*x1 + a1*x3 + … + a1*xn ≥ c1
这假设标记为a1
的系数实际上是不同的;否则你的整个LP将是高度相互依赖的,无论是解决还是根本无法解决。接下来,添加松弛变量以将不等式再次转换为等式:
a1*x1 + a1*x1 + a1*x3 + … + a1*xn + y1a = c1 y1a ≥ 0
a1*x1 + a1*x1 + a1*x3 + … + a1*xn - y1b = c1 y1b ≥ 0
现在这些y1a和y1b是你的初始基本变量,你可以开始转动。如果初始基本解决方案已经可行,要么找到最优解,要么找不到可行解决方案。
答案 1 :(得分:2)
在教科书中
Kenneth Steiglitz和Christos Papadimitiou的“组合优化”
您可以找到Simplex算法的详细,独立的描述。如果我没记错的话,对于仅给出相等约束而没有基础的情况,引入了具有额外的成本为零的人工变量的人工基础。直观地,这就像在约束矩阵的一侧“粘合”单位矩阵。然后,单纯形算法开始“驱逐”人工基础,即它迭代直到基础中不再包含任何人为变量,这意味着找到了原始公式的基础。
答案 2 :(得分:1)
您不必自己动手,这就是建模语言存在的原因。我建议您试用GLPK或SCIP。
他们有自己的建模语言,GLPK有GNU MathProg,SCIP有ZIMPL,所以你可以方便地编写你的LP问题。 阅读文档。
相关问题是this。
答案 3 :(得分:0)
线性编程将解决此问题。 不使用两个不等式描述约束,只需将其提供给GLPK等求解器。例如,您可以在几行GMPL中编写它:
param k, n;
param a{1..k}{1..n};
param c{1..k};
var x{1..n}, >= 0;
minimize cost : sum{i in 1..n} x[i];
s.t. constraints{j in 1..k} : sum{i in 1..n}(a[j][i] * x[i]) = c[j];
正如你在这里所说的,你的模型可能没有最优:没有非负性约束,它只是一个欠定线性系统,具有无界解。我假设x必须保持非负值,并且约束有点复杂,如在链接的帖子中那样。