【发布时间】:2021-05-09 09:54:40
【问题描述】:
尝试构建一个 pyomo 模型来解决“SEND+MORE=MONEY”任务。
C4 C3 C2 C1
S E N D
+ M O R E
______________
M O N E Y
模型构建:
from pyomo.environ import *
m = ConcreteModel()
m.letters = Set(initialize = ['S', 'E', 'N', 'D', 'M', 'O', 'R', 'Y'])
m.tens = Set(initialize = ['C1', 'C2', 'C3', 'C4'])
m.let_val = Var(m.letters, bounds=(0,9), initialize=9, within=Integers)
m.ten_val = Var(m.tens, within=Binary)
m.C1 = Constraint(expr = m.ten_val['C3'] + m.let_val['S'] + m.let_val['M'] == m.let_val['O'] + m.ten_val['C4']*10)
m.C2 = Constraint(expr = m.ten_val['C2'] + m.let_val['E'] + m.let_val['O'] == m.let_val['N'] + m.ten_val['C3']*10)
m.C3 = Constraint(expr = m.ten_val['C1'] + m.let_val['N'] + m.let_val['R'] == m.let_val['E'] + m.ten_val['C2']*10)
m.C4 = Constraint(expr = m.let_val['D'] + m.let_val['E'] == m.let_val['Y'] + m.ten_val['C1']*10)
m.C5 = Constraint(expr = m.let_val['M'] == m.ten_val['C4'])
m.C6 = Constraint(expr = m.let_val['M'] == 1)
m.f1 = Objective(expr = m.let_val['S']*1000 + m.let_val['E']*100 + m.let_val['N']*10 + m.let_val['D'] +
m.let_val['M']*1000 + m.let_val['O']*100 + m.let_val['R']*10 + m.let_val['E'], sense=minimize)
solver = SolverFactory('glpk')
results = solver.solve(m)
print(' ', int((value(m.let_val['S'])*1000 + value(m.let_val['E'])*100 + value(m.let_val['N'])*10 + value(m.let_val['D']))))
print('+ ', int((value(m.let_val['M'])*1000 + value(m.let_val['O'])*100 + value(m.let_val['R'])*10 + value(m.let_val['E']))))
print('=', int((value(m.let_val['M'])*10000 + value(m.let_val['O'])*1000 + value(m.let_val['N'])*100 + value(m.let_val['E'])*10 + value(m.let_val['Y']))))
'glpk'解决方案:
9000
+ 1000
= 10000
'iopt'解决方案:
8942
+ 1057
= 10000
Ipopt 更接近但还不够好。我必须帮助求解器并添加约束(C5 和 C6)。没有它,答案是 0。
我找不到任何有关如何声明所有字母值应彼此不同的指令的信息。 怎么做?
如何用pyomo正确解决这样的任务?
【问题讨论】:
-
对于全不同约束的 MIP 公式,请参见:Williams, H. Paul 和 Yan, Hong (2001),整数规划中约束满足的“all_diff”谓词的表示,Informs Journal on Computing , 13 (2)。 96-103.
-
@Erwin Kalvelagen。谢谢你的文章参考。有趣的是,在这篇文章中审查了相同的任务。我还阅读了您 2016 年和 2017 年有关此问题的其他帖子。理论上很清楚,但我没有足够的技能和经验在代码中实现它。所以在实践中它是完全不清楚的。我想知道为什么没有针对此问题的代码示例。在 pyomo 文档中找不到任何内容。在经验交流论坛上找不到任何东西。初学者在优化领域的实际应用太难了。
标签: optimization constraints solver pyomo