Python 具有绝对值的纸浆约束>;=忽略最小值

Python 具有绝对值的纸浆约束>;=忽略最小值,python,pulp,Python,Pulp,我试图通过使两个变量的绝对差大于0来约束我的问题。在我的实现中是否有明显的遗漏 这是我在上找到的一个实现 我在下面的代码中实现了它。 我尝试更改M的值,但没有任何区别 当我在公式中输入实际结果时(例如q1x-q2x=0),我发现这不符合约束条件。然而,帕姆表示,解决方案是最优的 prob = LpProblem("myProblem", LpMinimize) q1x = LpVariable("q1x",1,8) q2x = LpVariable("q2x",1,8) B12 = Lp

我试图通过使两个变量的绝对差大于0来约束我的问题。在我的实现中是否有明显的遗漏

这是我在上找到的一个实现 我在下面的代码中实现了它。 我尝试更改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
预期:

实际:

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

此外,我假设您希望决策变量
q1x
q2x
为整数,在定义变量时必须明确说明这一点

试试这个:

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])

欢迎来到SO!我不确定我是否完全理解您的模型要做什么-但看起来您希望
B12
是一个二进制变量,但您似乎没有将其声明为一个二进制变量。你的目标是什么?目标首先以正常方式添加到problen对象(在任何约束之前)。谢谢!我试图分配两个值,q1x和q2x,使它们的总和尽可能小,而q1x=q2x,我通过确保它们的绝对差大于0来实现。B12被声明为二进制变量会有什么不同?从您所说的和您的“预期”结果可以清楚地看出,您期望
q1x
q2x
为整数。但是,您没有将它们指定为整数,因此可以采用任何值,例如1.0000001。另外,在
B12
上,查看您的公式,这是一个变量,它决定哪个更大
q1x
q2x
。考虑<代码> q1x> q2x的情况,在这种情况下,第二个约束工作<代码> B12 < /代码>需要0。类似地,如果
q1x修复了它,非常感谢!)另外,如果B12是一个整数,那么它也就足够了。一个限制在0和1之间的整数与一个二进制变量相同,所以这是有意义的。请考虑把你的工作代码作为一个答案,并把它标记为被接受——这样别人就可以受益。
q1x = 1; q2x = 1 "optimal"
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])