一、整体流程
from ortools.sat.python import cp_model
class MyModel:
def run():
"1. 数据采集"
self.data_collect()
"2. 创建模型"
cpmodel = cp_model.CpModel()
"3. 变量定义"
self.variable_define(cpmodel)
# 初始解给定
# self.set_hint(cpmodel)
"4. 添加约束"
self.add_constrain(cpmodel)
"5. 目标函数"
self.obj_func(cpmodel)
"6. 求解器"
self.solver = self.get_solver()
"7. 模型求解"
status = self.model_solve(cpmodel, self.solver)
"8. 结果输出"
self.data_output(cpmodel, self.solver, status)
二、变量定义
创建bool变量和整数变量
a = model.NewIntVar(0, 100, '整数变量1')
b = model.NewBoolVar('布尔变量1')
c = model.NewBoolVar('布尔变量2')
d = model.NewBoolVar('布尔变量3')
# 用字典的方式快速创建多个变量
variable = {(i): model.NewIntVar(0, 100, '变量%i'%i) for i in range(10)}
三、添加约束
- 基本约束
model.Add(a + 2 <= 1)
- 条件约束
# if b为真,则a<=9。b为假时,a任意
model.Add(a <= 9).OnlyEnforceIf(b)
# 全等。b真a<=9,b假a>9
model.Add(a <= 9).OnlyEnforceIf(b)
model.Add(a > 9).OnlyEnforceIf(b.Not())
# c and d 为真则b为真,b为真则cand d 为真
model.Add(b).OnlyEnforceIf([c,d])
model.AddImplication(b, c) # 如果b为真则c为真。b => c
model.AddImplication(b, d)
N、待完善
solution_printer是自定义的回调函数,可以不提供该参数。目前后两种调用方式已淘汰,只需要使用第一种方式即可。需要求解最优值时,给定目标函数,需要可行解时,不给定目标函数
求解结果输出:
solver.Value() # 输出指定的求解值
self.Value() # 在回调函数中直接输出指定的求解值
模型参数输出
print(' - conflicts : %i' % solver.NumConflicts())
print(' - branches : %i' % solver.NumBranches())
print(' - wall time : %f ms' % solver.WallTime()) # 实际时间长度,包括被意外地堵塞后不在执行的时间
print(' - user time : %f ms' % solver.UserTime()) # 用户态cpu消耗时间,执行总共花费时间
[未完待续]