在建模过程中,经常要对带下标数据做挑选,不同下标的数据进行组合,使用python原本处理数据的会面临效率问题,因此Gurobi 中采用了特殊的扩展对象 和
(1)Gurobi tuplelist
增加了快速筛选功能,例如从中找到第一个元素为的元组
等效于下面的代码
(2)Gurobi tupledict
键值为 tuple (元组),可以使用 select, sum, prod 函数
用于变量和约束(后面案例中体现)
- 函数:变量求和
- 函数:用于变量和系数相乘后累加
下面两个表达式等效,即变量和系数想乘后累加
(3)Multidict()
创建 tuplelist 和 tupledict 的便捷方法,如下返回
(4)创建list
(3)参数设置方法
对于python,可以简写成,例如设置求解时间有如下写法
(4)常用参数
(5)参数使用案例
(6)属性类别
- Model Attributes 模型属性
例如: 模型优化方向(最大化或最小化); 当前目标值 - Variable Attributes 变量属性
例如: 当前变量的取值; 初始解 - Linear Constraint Attributes 线性约束属性
例如: 约束对应的对偶值; 约束的松弛量; 约束的右端项 - Special-ordered Set constraints Attributes SOS约束属性
例如: 对不可行的模型,指示约束是否属于IIS (Irreducible Inconsistent Subsystem) - Quadratic Constraint Attributes 二次约束属性
例如: 约束右端项 - General Constraint Attributes 广义约束属性
例如: 约束名称 - Quality Attributes 解质量属性
例如: 最大的界违反; 整数变量离最近整数的最大距离 - Multi-objective Attributes 多目标属性
例如: 对应多目标表达式中变量系数; 对应目标函数值
(7)属性设置和查询方法
属性设置,注意并不是所有的属性都可以设置
属性查询
(8)常用属性
(1)调用自动调参工具
(2)调参参数
(3)调参案例
(1)广义约束
- :一组变量(包含常数)中取最小
例如:z = min(x, y, 3)
- :取绝对值
例如:x = |y|
- :一组变量的值全等于1,则取1,否则取0。所有的变量都被视为0,1变量,不论他们之前被定为什么类型
例如:x = 1且y = 1,那么z = 1,否则 z = 0
- :一组变量的值有一个等于1,则取1,否则取0。所有的变量都被视为0,1变量,不论他们之前被定为什么类型
例如:x = 0且y = 0,那么z = 0,否则 z = 1
- :指示变量的值为1,约束成立,否则约束可以被违反
例如:如果 z = 1,则 x+y <= 4
(2)范围约束
例如: 5 <= x + y + z <= 10
(3)SOS约束 Special-Ordered Set
SOS_TYPE1 表示一组有序变量中最多有一个变量取值不为0;
SOS_TYPE2 表示一组有序变量中最多有两个变量取值不为0,且非零变量相邻,变量是否相邻由权重决定;
例如:
(1)多个目标函数
所有的目标函数都为线性的,并且目标函数的优化方向一致(全部最大化或全部最小化),可以通过乘以 -1 实现不同的优化方向。
(2)分段线性函数
对一些非线性模型,可以使用这一功能去线性逼近
更多python+gurobi的使用案例见Gurobi官网Build Your Optimization Skills with Python
Gurobi中的回调函数callbacks为用户在求解模型时提供了高级控制功,用于在求解过程中获取信息、终止优化、加入额外约束条件(割平面)、加入自己开发的算法等。
- 查询一些信息,例如目标值,节点数:
- 查询变量在当前节点的松弛解:
- 查询可行解变量的取值:
- 在节点添加割平面:
- 在节点添加Lazy Cut(与一般cut区别在于只有在被违反的时候才起作):
- 向当前节点导入一个解:,可以计算导入解的目标值,对复杂的问题,可以先开发启发式算法找到高质量的解,然后导入解让求解器在其基础上继续求解
- 用户切割User cuts:通过消除分数解来加强混合整数规划(MIP)的松弛,对于模型不是必需约束,但是能更快的解决MIP问题,参考割平面法中的切割
- 惰性约束Lazy constraints:模型必要约束,如果没有这些约束,模型是不正确的。惰性约束通常用于处理包含相对较多约束的模型,其中大多数约束都是显然满足的。在计算上只在这些约束被违反时考虑它们更为高效,参考列生成