整数线性规划程序未按预期运行
Integer linear programming program does not behave as expected
我有以下整数线性规划问题,它按预期分配值,但是当我添加某些约束时,objective 函数似乎变得空洞。我不知道该怎么做。我正在使用 python 来解决问题。
非空公式
score12 = 1
score21 = -1
C = 1000000
maximize : (w12 - s12) * score12 + (w21 - s21) * score21
subject to:
d12 = x2 - x1
d21 = x1 - x2
d12 - w12*C <= 0
d21 - w21*C <= 0
d12 + (1 - w12)*C > 0
d21 + (1 - w21)*C > 0
d12 + s12*C >= 0
d21 + s21*C >= 0
0 <= xi <= 1 , continuous
0 <= wij, sij <= 1, integer
objective函数符合预期:
MAXIMIZE
-1*s_12 + 1*s_21 + 1*w_12 + -1*w_21 + 0
并且解决方案符合预期:
('d_12', '= ', 0.0)
('d_21', '= ', 0.0)
('s_12', '= ', 0.0)
('s_21', '= ', 1.0)
('w_12', '= ', 1.0)
('w_21', '= ', 0.0)
('x_1', '= ', 0.0)
('x_2', '= ', 0.0)
但是当我添加以下约束时,或者只添加其中之一:
d12 - (1 - s12)*C < 0
d21 - (1 - s21)*C < 0
Python 将 objective 函数更改为:
MAXIMIZE
0*__dummy + False
SUBJECT TO
... omited
我不知道该怎么办,解决方案变得空洞:
('__dummy', '= ', None)
('d_12', '= ', 0.0)
('d_21', '= ', 0.0)
('s_12', '= ', 1.0)
('s_21', '= ', 1.0)
('w_12', '= ', 1.0)
('w_21', '= ', 1.0)
('x_1', '= ', 0.0)
('x_2', '= ', 0.0)
我没有分析你的约束,但这里有一些关于可能存在什么样的问题的评论。
您正在使用它来定义约束:
d12 - (1 - s12)*C < 0
- 在线性规划中,只有
<=
和>=
形式的不等式(==
可以由它们构造;忽略数值困难);其他一切都不自然(在数学方面没有多大意义)
- pulp-or 只定义上面提到的运算符;但不是
<
和 >
link; scroll to bottom; also see next image from the docs
Pulp 对库的错误使用不那么健壮,通常会在添加一些格式错误的约束时默默地覆盖 objective(这可能是这种情况这里)。也许你会在pulp的issue-tracker
中找到类似的体验
考虑使用 Constraint-class 而不是使用重载运算符。
我有以下整数线性规划问题,它按预期分配值,但是当我添加某些约束时,objective 函数似乎变得空洞。我不知道该怎么做。我正在使用 python 来解决问题。
非空公式
score12 = 1
score21 = -1
C = 1000000
maximize : (w12 - s12) * score12 + (w21 - s21) * score21
subject to:
d12 = x2 - x1
d21 = x1 - x2
d12 - w12*C <= 0
d21 - w21*C <= 0
d12 + (1 - w12)*C > 0
d21 + (1 - w21)*C > 0
d12 + s12*C >= 0
d21 + s21*C >= 0
0 <= xi <= 1 , continuous
0 <= wij, sij <= 1, integer
objective函数符合预期:
MAXIMIZE
-1*s_12 + 1*s_21 + 1*w_12 + -1*w_21 + 0
并且解决方案符合预期:
('d_12', '= ', 0.0)
('d_21', '= ', 0.0)
('s_12', '= ', 0.0)
('s_21', '= ', 1.0)
('w_12', '= ', 1.0)
('w_21', '= ', 0.0)
('x_1', '= ', 0.0)
('x_2', '= ', 0.0)
但是当我添加以下约束时,或者只添加其中之一:
d12 - (1 - s12)*C < 0
d21 - (1 - s21)*C < 0
Python 将 objective 函数更改为:
MAXIMIZE
0*__dummy + False
SUBJECT TO
... omited
我不知道该怎么办,解决方案变得空洞:
('__dummy', '= ', None)
('d_12', '= ', 0.0)
('d_21', '= ', 0.0)
('s_12', '= ', 1.0)
('s_21', '= ', 1.0)
('w_12', '= ', 1.0)
('w_21', '= ', 1.0)
('x_1', '= ', 0.0)
('x_2', '= ', 0.0)
我没有分析你的约束,但这里有一些关于可能存在什么样的问题的评论。
您正在使用它来定义约束:
d12 - (1 - s12)*C < 0
- 在线性规划中,只有
<=
和>=
形式的不等式(==
可以由它们构造;忽略数值困难);其他一切都不自然(在数学方面没有多大意义) - pulp-or 只定义上面提到的运算符;但不是
<
和>
link; scroll to bottom; also see next image from the docs
Pulp 对库的错误使用不那么健壮,通常会在添加一些格式错误的约束时默默地覆盖 objective(这可能是这种情况这里)。也许你会在pulp的issue-tracker
中找到类似的体验考虑使用 Constraint-class 而不是使用重载运算符。