CVXPY函数,用于在约束中最大值时将整数变量之和限制为1

2024-04-18 21:33:41 发布

您现在位置:Python中文网/ 问答频道 /正文

在python-cvxpy优化任务约束中,我需要一些方法将整数变量之和限制为1。你知道吗

我不想强制变量之和为1,我只需要一个函数将sum(x)的结果限制为1,以便在约束中使用它。 我要建模的是一个约束,如:

y[i] >= if sum(x) >= 1 then 1 else 0

y是布尔变量,x需要是整数变量。我似乎找不到解决这个问题的办法。我试过用min和cvxpy.最小功能

y[i] >= min(sum(x), 1)

以及

y[i] >= cvxpy.minimal(sum(x), x[test])

其中x[test]总是每个约束1,但这两种方法都不起作用。第一个给出了一个错误,因为严格的不等式是不允许的,第二个给出了一个错误,即约束违反了DCP。你知道吗

我发现唯一有效的方法是用0.001乘以一个小“hack”(总和永远不会大于1000,因此结果总是在0到1之间)

y[i] >= sum(x) * 0.001

但这完全打破了求解器,甚至只有几个约束和变量(500100)的问题似乎没完没了地运行。(30分钟以上仍无溶液) 这个“hack”的最大变量量是<;100,运行时间只有几分钟,这是不可接受的

\uuuuu\u更新更多说明:

我想有X数量的产品Y,我知道有多少卖家Z的库存产品Y。我还需要考虑到每个卖家的运费(固定金额1) 这个问题很容易描述如下:

             Product1  Product2  Product3
seller1 has  3         4         5
seller2 has  0         1         10

wanted order 2         1         7

这相当于问题(为了简单起见,忽略约束x1>;=0)

min 1*x1 + 1*x2 + 1*x3 + 1*x4 + 0.9*x5 + 0.95*x6 + y1 + y2
s.t. 
     x1 <= 3
     x2 <= 4
     x3 <= 5
     x4 <= 0
     x5 <= 1
     x6 <= 10
     x1 + x4 >= 2
     x2 + x5 >= 1
     x3 + x6 >= 7
     y1 >= if x1 + x2 + x3 > 0 then 1 else 0
     y2 >= if x4 + x5 + x6 > 0 then 1 else 0

Tags: 方法testif整数minelsesumx1
1条回答
网友
1楼 · 发布于 2024-04-18 21:33:41

如果性能不好,请考虑使用更好的MIP解算器。CVXPY支持不同的解算器(有些很好,有些只对玩具问题有用)。你知道吗

其次,对单个变量x[i,j](比如)进行操作可能比对总和(这称为dis-aggregation)进行操作更好。即

y[i] = 0 => x[i,j] = 0 

或者

x[i,j] <= 100*y[i] 

当然,我们假设最小化y[i](否则我们需要使用双向蕴涵)。你知道吗

因此,在您的更新模型中,我们有:

y1 >= if x1 + x2 + x3 > 0 then 1 else 0

这可以分解为:

x1 <= 100*y1
x2 <= 100*y1
x3 <= 100*y1

或聚合:

x1+x2+x3 <= 100*y1

根据解算器的不同,分解版本可能工作得更好(一些高级解算器可以识别聚合结构)。你知道吗

从建模的角度来看,我可能会使用y[i]x[i,j]作为变量。(对我来说)这更有逻辑。你知道吗

相关问题 更多 >