当前位置: 附加器 >> 附加器前景 >> 优化求解器Gurobi的MVar类矩
作者
刘兴禄,清华大学博士在读
修宇璇,清华大学博士在读
优化求解器的建模方式:以gurobi为例
Gurobi的MVar(矩阵形式变量对象)
一个线性规划的例子:Wyndor玻璃厂
问题的建模
基于Gurobi进行按矩阵形式建模:完整代码
将Var对象转成MVar对象
`Model.getA()`函数的使用
基于矩阵形式建模的对偶问题的书写及建模
基于Gurobi进行按矩阵形式进行对偶问题的建模并求解
小结
本文涉及到的模型(LP,MIP)均是为了说明问题,即使是MIP,我们也将其当作LP看待。
LP:linearprogramming,线性规划;MIP:mixedintegerprogramming,混合整数(线性)规划。1优化求解器的建模方式:以gurobi为例我们考虑如下的线性规划问题
该模型有2个决策变量
和
,3个约束。
如果我们使用Gurobi对其进行建模,一般有下面3(或者说4)种方法:
按行建模:逐行进行建模。通过使用quicksum或者创建表达式LinExpr对象结合addTerms,拼凑表达式,最后使用Model.addConstr完成添加约束的操作,从而完成建模;按列建模:逐列进行建模。通过创建Column对象,使用addTerms函数拼凑好Column对象,最后使用Model.addVar函数直接完成建模。按非零系数建模:类似于逐列进行建模,可以使用addTerms拼凑表达式。具体实现跟按行建模类似。按矩阵方式建模:通过拼凑约束系数矩阵,然后将决策变量转化为MVar的对象,最后直接使用重载运算符
完成约束的添加,即如Model.addConstr(Ax==b),就可以完成建模。前3种建模方法我们已经在之前的推文中有所涉及,见推文:
优化
手把手教你用Python调用Gurobi求解VRPTW
优化
视频详解Python调用Gurobi的应用案例:TSP
论文代码复现
无人机与卡车联合配送(Python+Gurobi)
优化
史上最数学题求解的新尝试:一种求解器的视角(Python调用Gurobi实现)
优化
寻找新的建模视角——从直观解释对偶问题入手:以CuttingStockProblem的对偶问题为例
本文主要来介绍第四种:按矩阵方式建模。主要内容包括:
按矩阵方式建模的详细案例和代码;按矩阵方式建模,并通过求解器轻松得到对偶问题的例子和代码。在介绍具体内容之前,笔者首先指出按照矩阵建模的好处和不足(仅列举部分):
优点:
添加约束代码量少,只需要拼凑好系数矩阵,即可一行代码搞定约束的添加;便于直接得到对偶问题的系数矩阵(),从而快速得到对偶问题的具体形式。
缺点:
对于约束系数稀疏的模型,会占用不必要的内存来存储那些系数为0的部分,模型较大时,有可能导致内存溢出;虽然可以得到对偶问题的具体形式,但是对偶问题的公式形式却不能得出(这个严格来讲不算是这种建模方式的缺点)。不方便对每个决策变量赋予独一无二的变量名。Gurobi提供了矩阵形式建模的API,下面我们就基于上述小例子来介绍Gurobi的矩阵建模。
2Gurobi的MVar(矩阵形式变量对象)Gurobi的MVar可以查看手册中的相关内容: