【问题标题】:Integer linear programming program does not behave as expected整数线性规划程序未按预期运行
【发布时间】:2016-10-20 22:01:08
【问题描述】:

我有以下整数线性规划问题,它按预期分配值,但是当我添加某些约束时,目标函数似乎变得空洞。我不知道该怎么做。我正在使用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

目标函数符合预期:

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 将目标函数更改为:

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

标签: python mathematical-optimization pulp


【解决方案1】:

我没有分析您的限制,但这里有一些关于可能存在什么样的问题的评论。

您正在使用它来定义一个约束:

d12 - (1 - s12)*C < 0
  • 在线性规划中,只有&lt;=&gt;= 形式的不等式(== 可以由这些构造;忽略数值困难);其他一切都不自然(在数学方面没有多大意义)
  • pulp-or 只定义了上面提到的操作符;但不是&lt;&gt; link; scroll to bottom; also see next image from the docs

Pulp 对于库的错误使用并不那么健壮,并且当添加一些格式错误的约束时,通常会默默地覆盖目标(这里可能就是这种情况)。也许你会在纸浆的issue-tracker中找到一些类似的经历

考虑使用约束类而不是使用重载运算符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多