如何对MathProg中所有行的总和的所有列取最大值

时间:2018-07-04 15:27:44

标签: linear-programming mathprog

我正在尝试解决一个优化问题,其中我要优化的变量在一个矩阵中(销售人员X商店,如果该销售人员被分配给该商店,则变量为1)。每个商店都有利润。

这是我的定义方式:

set SalesPeople;
set Shops;

param profit{Shops} >=0;

var a{i in SalesPeople, j in Shops}, binary;

我现在正在尝试添加一个约束条件,该约束条件是利润的所有商店中所有营业员的总和的最大值大于某个特定数字。这就是我制定的方式,但这似乎行不通。

subject to cond3: max{i in SalesPeople} sum{j in Shops} profit[j]*a[i,j] >= 10; 

可以做到吗?如果是这样,正确的语法是什么?

我才刚刚开始学习MathProg,所以这有点令人困惑。

1 个答案:

答案 0 :(得分:1)

约束

 max{i in SalesPeople} sum{j in Shops} profit[j]*a[i,j] >= 10; 

不是线性的,因此MIP求解器无法接受。不幸的是,这种特殊形式需要额外的二进制变量。如果约束是

 max{i in SalesPeople} sum{j in Shops} profit[j]*a[i,j] <= 10;

我们可以这样写:

 cond3{i in SalesPeople}: sum{j in Shops} profit[j]*a[i,j] <= 10; 

对于您的情况,我们需要执行以下操作:

 var d{i in SalesPeople}, binary; 
 cond3{i in SalesPeople}: sum{j in Shops} profit[j]*a[i,j] >= 10*d[i];
 sumd: sum{i in SalesPeople} d[i] >= 1; 

最后一个约束也可以写成:

 sumd: sum{i in SalesPeople} d[i] = 1; 

此构造实质上说:“ 至少一个i应该具有: sum{j in Shops} profit[j]*a[i,j] >= 10”。