绝对值> =最小值的纸浆约束被忽略

时间:2019-10-12 14:15:11

标签: python pulp

我试图通过使两个LpVariables的绝对差大于0来约束我的问题。在实现过程中我明显缺少什么吗?

这是我在http://lpsolve.sourceforge.net/5.1/absolute.htm上找到的实现 香港专业教育学院在下面的代码中实现了它。 我尝试更改M的值,但没有任何效果。

当我在公式中输入实际结果(使得q1x-q2x = 0)时,我发现这不满足约束条件。但是纸浆说该解决方案是最佳的。

prob = LpProblem("myProblem", LpMinimize)

q1x = LpVariable("q1x",1,8)

q2x = LpVariable("q2x",1,8) 

B12 = LpVariable("B12",0,1)

M=8

prob += (q1x-q2x) + M * B12 >= 1

prob += -(q1x-q2x) + M * (1-B12) >= 1

prob += q1x+q1y

预期

 q1x = 1; q2x = 2 or "infeasible"

实际:

q1x = 1; q2x = 1 "optimal"

1 个答案:

答案 0 :(得分:0)

添加到LpProblem类的第一个“约束”将始终被视为目标函数,如flush()测试问题中所述。

我还假设您希望决策变量q1xq2x为整数,在定义变量时必须明确说明

尝试一下:

prob = LpProblem('myProblem', LpMinimize)

q1x = LpVariable("q1x",lowBound = 1, upBound = 8, cat = "Integer")

q2x = LpVariable("q2x",lowBound = 1, upBound = 8, cat = "Integer")

B12 = LpVariable("B12", lowBound = 0, upBound = 1, cat = "Integer")

# B12 can be also be defined by: 
#B12 = LpVariable("B12", cat = "Binary")

M = 8

prob += q1x + q2x 

prob += (q1x-q2x) + M * B12 >= 1

prob += -(q1x-q2x) + M * (1-B12) >= 1



prob.solve()

for v in prob.variables():
    print(v.name, " = ",  v.varValue)
print("Status:", LpStatus[prob.status])