当gurobi死活找不到一个可行解:如下图所示:
可以通过给定初始可行解加快求解速度。
https://blog.csdn.net/sinat_41348401/article/details/133547827
这个时候上面链接里的文章提出了三种方法:
1、决策变量的Start
属性直接设置变量的初始值
2、设置决策变量的Hint属性,为求解器提供提示
3、使用求解器的callback方法
同时给出了详细的步骤。这里只针对方法1【对决策变量的Start
属性直接设置变量的初始值】进行详细阐述。
过程
这里假定有两个模型,gurobi先求解出model1后,将model1的最优解设为model2的初始可行解。model1、model2的变量命名一致
model1的求解算例代码为:
import gurobipy as gp
from gurobipy import GRB
# 创建第一个模型 model1
model1 = gp.Model("model1")
model1.setParam('OutputFlag', 0)
# 添加变量
x1 = model1.addVar(vtype=GRB.CONTINUOUS, name="x1")
x2 = model1.addVar(vtype=GRB.CONTINUOUS, name="x2")
# 设置目标函数
model1.setObjective(2 * x1 + 3 * x2, sense=GRB.MAXIMIZE)
# 添加约束
model1.addConstr(3 * x1 + 4 * x2 <= 25)
model1.addConstr(2 * x1 + 5 * x2 <= 20)
# 解决模型1
model1.optimize()
这个时候将model1的决策变量求解结果导出到字典initial_solution = {}中。具体代码为:
initial_solution = {}
for var in model1.getVars():
initial_solution[var.varName] = var.x
输出initial_solution 结果:
print(initial_solution)
把这个作为可行解写入到model2中
# 创建第二个模型 model2
model2 = gp.Model("model2")
#不要输出求解过程
model2.setParam('OutputFlag', 0)
# 添加变量
x1 = model2.addVar(vtype=GRB.CONTINUOUS, name="x1")
x2 = model2.addVar(vtype=GRB.CONTINUOUS, name="x2")
# 设置目标函数
model2.setObjective(3 * x1 + 2 * x2, sense=GRB.MAXIMIZE)
# 添加约束
model2.addConstr(2 * x1 + 3 * x2 <= 15)
model2.addConstr(4 * x1 + 2 * x2 <= 16)
#更新模型,这条很重要!
model2.update()
# 将第一个模型的解作为初始可行解应用于第二个模型的变量
for var in model2.getVars():
if var.varName in initial_solution:
var.Start=initial_solution[var.varName]
# 解决模型2
model2.optimize()
这个时候我们查看model2的初始可行解是否和model1的最优解一致。
查看model2初始可行解
if model2.status == GRB.OPTIMAL:
print("Optimal solution found in model2")
for var in model2.getVars():
print(f"{var.VarName}: {var.Start}")
输出为这样就成功改变了初始可行解:
否则,x1、x2的初始可行解为1e101。
参考
更多关于Gurobi加快求解速度之设置初始可行解方面的内容,可以查看如下几篇文章
1 [1]: https://zhuanlan.zhihu.com/p/557970852
2 [2]: https://blog.csdn.net/sinat_41348401/article/details/133547827
2[3]: https://mp.weixin.qq.com/s/-dxL4DBJK–LORh6-7pkWA
2[4]: https://mp.weixin.qq.com/s/tkw-mtPecIMYvMS72icskw