【问题标题】:Mixed Integer Linear Programming with pyomo or PuLP使用 pyomo 或 PuLP 的混合整数线性规划
【发布时间】:2022-01-21 03:15:24
【问题描述】:

我是使用 python 进行优化编程的新手,我在为 MILP 问题在 pyomo 和 PuLP 中定义一个变量时遇到了问题。我正在使用基因表达数据,我对如何将变量定义为 MXN 矩阵感到困惑。我正在尝试使用 pyomo 或 PuLP。我知道如何使用 MATLAB 并对其进行定义,因此我将其放在让任何人理解它都更有帮助。

y = optimvar('y',M,N,'Type','integer','LowerBound',0,'UpperBound',1)

另外如果你觉得有更好的python包请给我你的建议。

非常感谢您!

【问题讨论】:

    标签: optimization linear-programming pyomo pulp mixed-integer-programming


    【解决方案1】:

    我会选择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')])
    

    【讨论】:

    • 您好@AirSquid,非常感谢您的回答,但我想澄清一下,我的意思是我拥有的每一组都是二维的。因此,我有点困惑如何使用 pyomo
    • 更新显示 x-set
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多