簡體   English   中英

如果我使用二進制變量,CPLEX 找不到解決方案

[英]CPLEX can't find a solution if I use binary vabriables

我正在使用 CPLEX 12.9 和 Python 來解決 MILP(混合整數線性問題)。 我嘗試了兩種方法; 我期望得到相同的結果,但雖然第一種方法有效,但第二種方法無效。

1)第一種方法:

這種方法很成功 在生成的“.lp”文件(一個文本文件,其中包含一個人類可讀的問題公式:有一個必須最小化的目標函數和一些約束),可以看到x6, x7, x8, x9, x10, x11continuous變量,它們都等於500 (我定義了它們的upperlower等於500 ;因此它們實際上是常數)。

2)第二種方法:

它返回CPLEX Error 1217: No solution exists ,因此 CPLEX 無法找到解決方案,但我不明白為什么。

我改變的唯一事情是:

  • 我將x6, x7, x8, x9, x10, x11binary變量;
  • 對於它們中的每一個,我定義了等於0lower和等於500upper

因此,生成的“.lp”文件與使用第一種方法生成的文件非常相似; 唯一不同的是:

  • x6, x7, x8, x9, x10, x11被定義為范圍(而不是常數),因此它們是:

     0 <= x6 <= 500 0 <= x7 <= 500 0 <= x8 <= 500 0 <= x9 <= 500 0 <= x10 <= 500 0 <= x11 <= 500
  • Binaries部分(在“.lp”文件的末尾)現在也包含x6, x7, x8, x9, x10, x11變量。

注意:即使(在第二種方法中)我將lowerupper都設置為500 ,問題仍然存在。

如果您使用二進制,則意味着決策變量將是 0 或 1,即使您稍后添加了一些約束,這應該小於 500。

如果您希望您的決策變量允許 500 作為值,您應該使用浮點數或整數作為類型。

如果我使用動物園示例並將整數更改為二進制:

from docplex.mp.model import Model

mdl = Model(name='buses')
nbbus40 = mdl.binary_var(name='nbBus40')
nbbus30 = mdl.binary_var(name='nbBus30')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
mdl.minimize(nbbus40*500 + nbbus30*400)

mdl.solve()

print(mdl.solve_details.status)

給出:

integer infeasible

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM