Gurobi常见问题

来源:Gurobi中国答疑QQ群251135672
Model is infeasible : Gurobi 不可行问题的冲突溯源
如果明确获知模型不可行,有几种溯源的方法
(1)调用 model.computeIIS() 函数,会自动启动冲突约束寻找和筛选过程,这个过程根据问题类型和规模可能会花费较长时间。
(2)computeIIS() 结束后,可以用 model.write(“abc.ilp”) 命令 输出为以 ilp 为后缀的文件,用户打开文件后,就可以看到冲突的约束和变量。用户需要采用消元、合并、推理等方法自行分析冲突的具体原因。在 ilp 文件中,如果某个变量在 Bounds 部分显示为 free, 那说明这个变量无论取什么值,冲突都会发生。注意没有出现在 Bounds 部分的变量,Gurobi 默认为非负变量。
(3)如果 ilp 中的约束和变量过多,分析推理比较困难,用户也可以参考群文件的《Gurobi 不可行问题的冲突溯源》文章,通过松弛变量的结果来分析冲突发生的原因。
(4)对于采用 computeIIS() 和 松弛变量方法都无法分析原因的不可行模型,用户也可以采用从一个可行模型起步,逐步增加约束,直到模型不可行的方式找到产生冲突的约束条件。

如何快速判断模型可能存在数值问题
为了获得最大数值稳定性和运算效率,Gurobi 建议
(1)变量、约束条件、目标的系数取值合适的范围,使得变量的优化值尽量范围在【-1e+4,1e+4】 之间,约束取值在【-1e+4, 1e+4】之间,目标取值【-1e+4, 1e+4】之间
(2)查看日志,最大系数/最小系数 的比值,对于线性模型控制在 1e+9 之内,二次和非线性模型控制在 1e+6 之内,见右边图片。
(3)详细信息请阅读 安装目录 docs 目录中参考手册 refman.pdf 中的最后一章。
在这里插入图片描述
Numerical trouble encountered 解决思路
内点法对于数值问题更加敏感。一方面请阅读参考手册最后一章,缩小模型中最大系数和最小系数的比值差距到1e9 之内(包括右边项),对于二次模型,系数比值最好控制在 1e6 之内。另外一方面可以尝试以下一个或者多个参数 (1)BarHomogeneous =1 (2)NumericFocus = 2 或者3 (3)Method = 0 或者 1 (4)Aggregate = 0 (5) Presolve = 0

Sub-optimal termination 信息处理方法
这个信息通常在采用 Barrier 算法时模型出现数值问题时出现。处理的方法包括 (1)检查和调整模型的系数,参见群公告【如何快速判断模型可能存在数值问题】,避免模型出现数值问题 (2)设置 NumericFocus = 2 或者 3, 增大精度检验 (3)减少 BarConvTol, BarQCPConvTol 收敛精度 (4)减少 FeasibilityTol 可行度精度 (5)设置 BarHomogeneous = 1 (6)实验和调整 BarCorrectors 参数 (7)设置 Presolve = 0 关闭 Presolve (8)设置 Crossover = 0 关闭 Crossover. 以上各参数的含义请查阅参考手册。

### Gurobi 实现多目标优化 在实际应用中,许多优化问题涉及到多个相互冲突的目标。为了处理这类问题,可以采用帕累托最优的概念来寻找一组解,在这些解之间无法再改进任何一个目标而不损害其他目标。 Gurobi 提供了强大的功能支持多目标优化问题的求解。具体来说,可以通过设置不同的优先级和权重来进行多目标优化[^1]。下面是一个简单的 Python 代码示例,展示如何利用 Gurobi 来实现一个多目标线性规划问题: ```python from gurobipy import Model, GRB def pareto_optimization(): # 创建一个新的模型实例 model = Model("multi_objective") # 定义决策变量 x = model.addVar(name="x", vtype=GRB.CONTINUOUS) y = model.addVar(name="y", vtype=GRB.CONTINUOUS) # 设置第一个目标:最大化 x + 2 * y obj1 = x + 2 * y model.setObjectiveN(obj1, index=0, priority=2, weight=1.0, name='obj1') # 设置第二个目标:最小化 (x - 3)^2 + (y - 4)^2 obj2 = (x - 3)**2 + (y - 4)**2 model.setObjectiveN(-obj2, index=1, priority=1, weight=1.0, name='obj2') # 添加约束条件 model.addConstr(x >= 0, "c1") model.addConstr(y >= 0, "c2") # 更新并求解模型 model.update() model.optimize() # 输出结果 print(f"x={x.X}, y={y.X}") ``` 在这个例子中,`setObjectiveN()` 方法用于定义两个具有不同优先级别的目标函数。当调用 `optimize()` 后,Gurobi 将按照设定好的顺序依次考虑各个目标的重要性,并尝试找到满足所有约束的最佳解决方案集合——即所谓的帕累托前沿上的点。 对于更复杂的场景,比如需要探索整个帕累托前沿而不是单一点的情况,则可能需要用到额外的技术手段,如加权法、ε-约束法等,这取决于具体的业务需求和技术背景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值