当前位置: 首页 > 工具软件 > or-tools > 使用案例 >

gurobi学习笔记1OR-Tools约束规划(1)

申屠恺
2023-12-01

OR-tools
OR-Tools约束规划核心步骤:
1,声明模型—,2,创建变量——3,创建约束条件—,4,创建约束条件(或者可行解)——5,调用求解器—,6,展示结果

#导入OR-Tools中的CP-SAT求解器中的cp_model模块
from ortools.sat.python import cp_model

ortools.sat.python:导入or-tools CP-SAT求解器
CP-SAT求解器:使用SAT (satisfiability)方法的约束规划求解器,是原始约束规划求解器 (CP Solver)的高级版。
SAT (satisfiability)方法:在计算机科学中,布尔可满足性问题(有时称为命题可满足性问题,缩写为SATISFIABILITY或SAT)是确定是否存在满足给定布尔公式的解释的问题。它询问给定布尔公式的变量是否可以一致地用值TRUE或FALSE替换,公式计算结果为TRUE。如果是这种情况,公式称为可满足。

拓展

约束规划

  1. 约束优化或约束规划(Constraint programming, CP)是指从一组非常大的候选集合中找出可行的解决方案。

    CP是基于可行性(寻找一个可行的解决方案)而不是最优化(寻找一个最优的 解决方案),关注点是约束和变量而不是目标函数。甚至CP问题可能没有目标函数(典型的CP问题如员工调度)

注意点:为了增加运算速度,CP求解器处理的都是整数。如果有非整数项 约束,可以先将其乘一个整数,使其变成整数项

  1. OR-Tools为约束编程提供了两个求解器:
    CP-SAT:SAT (satisfiability)方法的约束规划求解器是原始约束规划求解器 (CP Solver)的高级版。
    original-CP:原始约束规划求解器
 #声明模型
 #定义CP约束规划模型类,命名model为cp_model.CpModel
  model = cp_model.CpModel()  

cp_model:约束规划,主要使用整型变量对优化问题进行建模

#创建变量
#定义model的变量X1,X2,变量类型为NewIntVar
x1 = model.NewIntVar(0, 4, 'x1')
x2 = model.NewIntVar(0, 3, 'x2')
#这里的model为上文定义的model
  1. model.NewIntVar(lb, ub, name)
    整数变量(下限,上线,变量名)
  2. model.NewIntervalVar(start, size, end, name)
    区间变量(开始,步长,结束,变量名)
  3. model.NewBoolVar(name):
    0-1整数变量(变量名)
#创建约束条件
#model中添加约束x1+ 3*x2 <=8
model.Add(x1+ 3*x2 <=8)
#创建目标函数
#添加model目标函数最大化2*x1 + 3* x2
model.Maximize(2*x1 + 3* x2)
#调用求解器
#命名求解方式为solver,选用cp_model.CpSolver工具
solver = cp_model.CpSolver()
solver.Solve(model)
#用solver解模型model

或者没有目标函数,只求可行解

solver = cp_model.CpSolver()
solver.Solve(model)
status = solver.Solve(model) #命名status,表示model模型的求解状态,用solver.Solve语句调用
    if status == cp_model.FEASIBLE:  #如果status恒等于cp_model.FEASIBLE,则输出x1,x2,此时没有目标函数
     print("x1=",solver.Value(x1))
     print("x1=",solver.Value(x2))
#展示结果,打印结果
print("目标值为:",solver.ObjectiveValue())
print("x1=",solver.Value(x1))
print("x1=",solver.Value(x2))
#完整代码有目标函数
#导入OR-Tools中的CP-SAT求解器中的cp_model模块
from ortools.sat.python import cp_model
# 定义CP约束规划模型类
model = cp_model.CpModel()
#定义变量
x1 = model.NewIntVar(0, 4, 'x1')#这里的model为上文定义的model
x2 = model.NewIntVar(0, 3, 'x2')
#添加约束
model.Add(x1+ 3*x2 <=8)
#添加目标函数
model.Maximize(2*x1 + 3* x2)
#创建求解器并求解
solver = cp_model.CpSolver()
solver.Solve(model)  #用solver解模型model
#打印结果
print("目标值为:",solver.ObjectiveValue())
print("x1=",solver.Value(x1))
print("x1=",solver.Value(x2))
#完整代码无目标函数
#导入OR-Tools中的CP-SAT求解器中的cp_model模块
from ortools.sat.python import cp_model
# 定义CP约束规划模型类
model = cp_model.CpModel()
#定义变量
x1 = model.NewIntVar(0, 4, 'x1')#这里的model为上文定义的model
x2 = model.NewIntVar(0, 3, 'x2')
model.Add(x1+ 3*x2 <=8)
solver = cp_model.CpSolver()
solver.Solve(model)
status = solver.Solve(model) #命名status,表示model模型的求解状态,用solver.Solve语句调用
if status == cp_model.OPTIMAL:  #如果status恒等于cp_model.FEASIBLE,则输出x1,x2,此时没有目标函数
    print("x1=",solver.Value(x1))
    print("x1=",solver.Value(x2))

OPTIMAL:找到了最优可行解
FEASIBLE:找到了一个可行的解,但我们不知道它是否是最优解
INFEASIBLE:这个问题被证明是不可行的
MODEL_INVALID:给定的CpModelProto没有通过验证步骤,可以通过调用ValidateCpModel(model_proto)来获得详细的错误信息
UNKNOWN:模型的状态是未知的,因为已经达到了搜索限制

 类似资料: