在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
如果性能不好,请考虑使用更好的MIP解算器。CVXPY支持不同的解算器(有些很好,有些只对玩具问题有用)。你知道吗
其次,对单个变量
x[i,j]
(比如)进行操作可能比对总和(这称为dis-aggregation)进行操作更好。即或者
当然,我们假设最小化
y[i]
(否则我们需要使用双向蕴涵)。你知道吗因此,在您的更新模型中,我们有:
这可以分解为:
或聚合:
根据解算器的不同,分解版本可能工作得更好(一些高级解算器可以识别聚合结构)。你知道吗
从建模的角度来看,我可能会使用
y[i]
和x[i,j]
作为变量。(对我来说)这更有逻辑。你知道吗相关问题 更多 >
编程相关推荐