【问题标题】:lpsolve solves the integer linear programming without meeting the given constraintslpsolve 在不满足给定约束的情况下求解整数线性规划
【发布时间】:2013-11-04 19:18:16
【问题描述】:

我想知道这里是否有人使用 lpsolve 来解决线性规划问题。

我在一个文件中定义了一个整数线性规划问题,其中有一个约束 x45=0(还有其他整数变量)。问题被lpsolve解决后,奇怪的报告结果是x45=1。但是,如果我在约束之前加上一个标签,例如 c1:x45=0,那么就会满足约束。有人知道这是怎么回事吗?

所以我在我的 LP 文件中定义的问题是这样的:

max: 0 x0 262 x1 262 x2 262 x3 262 x4 262 x5 262 x6 262 x7 270 x8 0 x9 270 x10 270 x11 270 x12 270 x13 270 x14 270 x15;
549 x16 549 x17 0 x18 549 x19 549 x20 549 x21 549 x22 549 x23 >= 1; 
603 x24 603 x25 603 x26 0 x27 603 x28 603 x29 603 x30 603 x31 >= 1;
x0=0;
x9=0;
x18=0;
x27=0;
x36=0;
x45=0;
x54=0;
x63=0;
x0=x0; x1=x8; x2=x16; x3=x24; x4=x32; x5=x40; x6=x48; x7=x56; x8=x1; x9=x9; x10=x17; x11=x25; x12=x33; x13=x41; x14=x49; x15=x57; x16=x2; x17=x10; x18=x18; x19=x26; x20=x34; x21=x42; x22=x50; x23=x58; x24=x3; x25=x11; x26=x19; x27=x27; x28=x35; x29=x43; x30=x51; x31=x59; x32=x4; x33=x12; x34=x20; x35=x28; x36=x36; x37=x44; x38=x52; x39=x60; x40=x5; x41=x13; x42=x21; x43=x29; x44=x37; x45=x45; x46=x53; x47=x61; x48=x6; x49=x14; x50=x22; x51=x30; x52=x38; x53=x46; x54=x54; x55=x62; x56=x7; x57=x15; x58=x23; x59=x31; x60=x39; x61=x47; x62=x55; x63=x63; x0 x1 x2 x3 x4 x5 x6 x7=1; x8 x9 x10 x11 x12 x13 x14 x15=1; x16 x17 x18 x19 x20 x21 x22 x23=1; x24 x25 x26 x27 x28 x29 x30 x31=1; x32 x33 x34 x35 x36 x37 x38 x39=1; x40 x41 x42 x43 x44 x45 x46 x47=1; x48 x49 x50 x51 x52 x53 x54 x55=1; x56 x57 x58 x59 x60 x61 x62 x63=1;

bin x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16,x17,x18,x19,x20,x21,x22,x23,x24,x25,x26,x27,x28,x29,x30,x31,x32,x33,x34,x35,x36,x37,x38,x39,x40,x41,x42,x43,x44,x45,x46,x47,x48,x49,x50,x51,x52,x53,x54,x55,x56,x57,x58,x59,x60,x61,x62,x63;

通过求解,结果是:

Value of objective function: 532.00000000

Actual values of the variables:
x0                              0
x1                              0
x2                              0
x3                              0
x4                              0
x5                              0
x6                              0
x7                              1
x8                              0
x9                              0
x10                             1
x11                             0
x12                             0
x13                             0
x14                             0
x15                             0
x16                             0
x17                             1
x18                             0
x19                             0
x20                             0
x21                             0
x22                             0
x23                             0
x24                             0
x25                             0
x26                             0
x27                             0
x28                             1
x29                             0
x30                             0
x31                             0
x36                             0
x45                             1
x54                             1
x63                             0
x32                             0
x40                             0
x48                             0
x56                             1
x33                             0
x41                             0
x49                             0
x57                             0
x34                             0
x42                             0
x50                             0
x58                             0
x35                             1
x43                             0
x51                             0
x59                             0
x37                             0
x44                             0
x38                             0
x52                             0
x39                             0
x60                             0
x46                             0
x53                             0
x47                             0
x61                             0
x55                             0
x62                             0

如您所见。 x45 和 x54 都是 1,而其他约束都满足。如果我在约束之前放一个标签,例如:

c1: x45=0;

那么它就会被满足。我不知道为什么这会有所不同

【问题讨论】:

  • 您可以编辑您的问题以包含公式吗? (您能够复制问题的最小问题。)
  • @RamNarasimhan 感谢您的建议。我已经编辑过了。
  • 您发现问题所在了吗?
  • @RamNarasimhan 我已在您的回复帖子中回复您。你可以看看:>

标签: linear-programming lpsolve


【解决方案1】:

根据 OP 的说明更新响应

发生了一些有趣的事情。当我解决您在上面发布的完全相同的 IP 时,所有约束都得到满足。

Value of objective function: 532.00000000

Actual values of the variables:
x0                              0
x1                              0
x2                              0
x3                              0
x45                             0
x54                             0
x63                             0
x32                             0
x40                             0
x48                             1
x56                             0
x33                             0
x41                             0
x49                             0
x57                             1

好消息是 Obj 函数值是相同的。这是您可以尝试的方法,您将了解正在发生的事情。你的问题是高度退化的。

不知何故,lp_solve 没有看到您的 x45=0 约束。

使用 -stat 选项进行诊断

以下是如何查看正在发生的事情: 创建两个 LP 文件。

  1. 原始 lp(比如 original.lp)
  2. 添加了另一个带有 c1: 的文件。 (比如命名约束.lp)

现在试试这个:从命令行模式

 lp_solve -stat original.lp
 lp_solve -stat namedconstraint.lp

如果你比较两个输出,你会看到发生了什么。

就我而言,当我运行 lp_solve -stat 时,我得到了

Constraints: 74
Variables  : 64
Integers   : 64
Semi-cont  : 0
SOS        : 0
Non-zeros  : 190    density=4.011824%

然后你可以继续调整 original.lp 文件,直到你明白为什么会这样。

进一步尝试:

根据您在下面的补充说明,lp_solve 没有看到约束,除非您给约束命名。接下来试试这个: 1. 将该约束移动到模型中的第一个或最后一个约束。这有什么改变吗? 2. 我怀疑在您输入 x45=0 的行之前的行(或约束)中有一些奇怪的字符。看看删除那行是否有帮助。

很遗憾,我无法重现该问题,因此无法自行调试。因此提出了这些建议。

【讨论】:

  • 您好,感谢您的回复。但是对于 + 号,请在此处查看 lpsolve.sourceforge.net/5.5(搜索“运营商”)。它说可以删除所有+号。它似乎对我有用。其次,对于您定义的问题,可能会遇到约束。但是对于我的问题,没有标签,x45 只是被解决为 1 虽然我设置了 x45=0 并且 lpslove 没有报告任何问题。
  • @HaoShen 是的,你是对的。运算符是可选的。你能发布一个可运行的 lp 文件,没有所有的....省略号吗?你能按原样运行上面的问题吗?我必须修改才能让它运行。另外,您可以粘贴您的 lp_solve 解决方案输出吗?这将有助于我看到。
  • 您好,感谢您的回答。我已经接受了。但恐怕我还有一些问题。根据您的建议,没有标签,我的约束编号是 74。使用标签,数字变为 75。所以在我看来,您的解决方案只是“意外”有效。您可以执行以下命令:./lp_solve -wlp con.txt -wafter -presolverow。然后你可以去con.txt文件。从我的结果来看,没有标签,约束 x45=0 不在文件中,而有标签,它就在那里。
  • 非常好的诊断。我们需要找出为什么 lp_solve 缺少该约束。我在回复中添加了更多尝试。你可以试试吗?
  • 您好,感谢您的回复。你说的我已经试过了。第一个没有帮助,至少从 Windows 中的 vi、gedit、记事本和写字板中没有看到“奇怪的字符”。我很惊讶你不能复制这个问题。我使用的 lp_solve 版本是 5.5.2.0 .我只需进入目录并键入 ./lp_solve 。文件内的布局与我在帖子中显示的完全相同(我复制并粘贴)。无论如何,我想我应该把标签留在那里:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多