[英]CPLEX can't find a solution if I use binary vabriables
我正在使用 CPLEX 12.9 和 Python 來解決 MILP(混合整數線性問題)。 我嘗試了兩種方法; 我期望得到相同的結果,但雖然第一種方法有效,但第二種方法無效。
1)第一種方法:
這種方法很成功。 在生成的“.lp”文件(一個文本文件,其中包含一個人類可讀的問題公式:有一個必須最小化的目標函數和一些約束),可以看到x6, x7, x8, x9, x10, x11
是continuous
變量,它們都等於500
(我定義了它們的upper
和lower
等於500
;因此它們實際上是常數)。
2)第二種方法:
它返回CPLEX Error 1217: No solution exists
,因此 CPLEX 無法找到解決方案,但我不明白為什么。
我改變的唯一事情是:
x6, x7, x8, x9, x10, x11
為binary
變量;0
的lower
和等於500
的upper
。因此,生成的“.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
變量。
注意:即使(在第二種方法中)我將lower
和upper
都設置為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.