ortools探索记录(cp_model)

ortools的相关函数和使用技巧的记录

一、整体流程

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)}

三、添加约束

  1. 基本约束
model.Add(a + 2 <= 1)
  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消耗时间,执行总共花费时间

[未完待续]

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,报错信息是关于删除表CP_ORDER_FLOW时遇到了外键约束错误。这意味着在删除CP_ORDER_FLOW表之前,还存在其他表与其存在外键关联,因此无法直接删除。要解决这个问题,你可以按照以下步骤进行操作: 1. 首先,你需要找到与CP_ORDER_FLOW表存在外键关联的其他表。可以通过查询数据库的外键约束来获取这些信息。具体的查询语句可能因数据库类型而异,以下是一个示例查询语句[^1]: ```sql SELECT constraint_name, table_name, column_name, referenced_table_name, referenced_column_name FROM information_schema.key_column_usage WHERE referenced_table_name = 'CP_ORDER_FLOW'; ``` 这个查询将返回所有与CP_ORDER_FLOW表存在外键关联的表的信息,包括外键约束的名称、表名、列名以及关联的表名和列名。 2. 一旦你确定了与CP_ORDER_FLOW表存在外键关联的其他表,你需要先删除这些外键约束。可以使用ALTER TABLE语句来删除外键约束。以下是一个示例的ALTER TABLE语句: ```sql ALTER TABLE table_name DROP FOREIGN KEY constraint_name; ``` 其中,table_name是存在外键约束的表名,constraint_name是要删除的外键约束的名称。 3. 删除与CP_ORDER_FLOW表存在外键关联的其他表的外键约束后,你就可以顺利删除CP_ORDER_FLOW表了。可以使用DROP TABLE语句来删除表。以下是一个示例的DROP TABLE语句: ```sql DROP TABLE CP_ORDER_FLOW; ``` 这个语句将直接删除CP_ORDER_FLOW表。 请注意,删除表是一个敏感操作,请确保在执行之前备份数据,并确保你有足够的权限来执行这些操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值