如何在 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,所以这一切都有点令人困惑。

约束

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"。

相关内容

  • 没有找到相关文章

最新更新