我会选择pyomo。我认为它更具表现力,更容易阅读/使用。您需要单独安装求解器。如果这令人生畏,pulp 内置了 CBC。
这应该可以帮助您入门。 pyomo 文档中有大量示例可以帮助您入门。
import pyomo.environ as pe
m = pe.ConcreteModel('example')
m.M = pe.Set(initialize=[1, 2, 3], name='the M set')
m.N = pe.Set(initialize=['A', 'B', 'C'], name='the N set')
m.X = pe.Var(m.M, m.N, domain=pe.NonNegativeReals)
m.pprint()
产量:
3 Set Declarations
M : Size=1, Index=None, Ordered=Insertion
Key : Dimen : Domain : Size : Members
None : 1 : Any : 3 : {1, 2, 3}
N : Size=1, Index=None, Ordered=Insertion
Key : Dimen : Domain : Size : Members
None : 1 : Any : 3 : {'A', 'B', 'C'}
X_index : Size=1, Index=None, Ordered=True
Key : Dimen : Domain : Size : Members
None : 2 : M*N : 9 : {(1, 'A'), (1, 'B'), (1, 'C'), (2, 'A'), (2, 'B'), (2, 'C'), (3, 'A'), (3, 'B'), (3, 'C')}
1 Var Declarations
X : Size=9, Index=X_index
Key : Lower : Value : Upper : Fixed : Stale : Domain
(1, 'A') : 0 : None : None : False : True : NonNegativeReals
(1, 'B') : 0 : None : None : False : True : NonNegativeReals
(1, 'C') : 0 : None : None : False : True : NonNegativeReals
(2, 'A') : 0 : None : None : False : True : NonNegativeReals
(2, 'B') : 0 : None : None : False : True : NonNegativeReals
(2, 'C') : 0 : None : None : False : True : NonNegativeReals
(3, 'A') : 0 : None : None : False : True : NonNegativeReals
(3, 'B') : 0 : None : None : False : True : NonNegativeReals
(3, 'C') : 0 : None : None : False : True : NonNegativeReals
4 Declarations: M N X_index X
[Finished in 1.5s]
================
编辑:制作交叉集
下面的一些变化应该可以正常工作。您可以通过初始化为两个集合的交叉来制作完整的 x 集,或者如果您的模型是稀疏的,并且这很有意义,我鼓励您使用 within 关键字来控制域并且只填充必要的与initialize 配对,如图所示。
import pyomo.environ as pe
m = pe.ConcreteModel('example')
m.M = pe.Set(initialize=[1, 2, 3], name='the M set')
m.N = pe.Set(initialize=['A', 'B', 'C'], name='the N set')
m.cross = pe.Set(within=m.M*m.N, initialize = [(1,'A'), (3,'B')])