名称: 约束满足求解器 描述: 用于调度、配置和分配问题的约束编程技能 允许工具:
- 读取
- 写入
- 全局搜索
- 文本搜索
- Bash
元数据:
专业领域: 决策智能
应用领域: 商业
类别: 优化
优先级: 中等
工具库:
- ortools
- python-constraint
- minizinc-python
约束满足求解器
概述
约束满足求解器技能提供解决约束满足问题(CSPs)和约束优化问题(COPs)的能力。它擅长处理调度、配置、分配和组合问题,在这些问题中寻找可行解与优化同等重要。
能力
- 变量和域定义
- 约束规范(全局约束)
- 解决方案搜索策略
- 带约束的优化
- 调度约束处理
- 配置问题求解
- 所有解决方案枚举
- 约束传播解释
使用流程
- 规范性分析与优化
- 资源调度
- 运营决策
使用方法
问题定义
# 定义CSP
csp_problem = {
"名称": "员工排班",
"变量": {
"周一早班": {"域": ["爱丽丝", "鲍勃", "卡罗尔", "大卫"]},
"周一下午班": {"域": ["爱丽丝", "鲍勃", "卡罗尔", "大卫"]},
"周二早班": {"域": ["爱丽丝", "鲍勃", "卡罗尔", "大卫"]},
"周二下午班": {"域": ["爱丽丝", "鲍勃", "卡罗尔", "大卫"]},
# ... 更多班次
},
"约束": [
{
"类型": "全不同",
"范围": ["周一早班", "周一下午班"],
"描述": "同一天不同员工"
},
{
"类型": "不相等",
"变量": ["周一下午班", "周二早班"],
"条件": "员工",
"描述": "无连续闭店/开店班次"
},
{
"类型": "计数",
"变量": "爱丽丝",
"最小值": 3,
"最大值": 5,
"描述": "爱丽丝每周工作3-5个班次"
}
]
}
调度约束
# 作业车间调度
scheduling_problem = {
"作业": [
{
"标识": "作业1",
"任务": [
{"标识": "J1_T1", "机器": "M1", "时长": 3},
{"标识": "J1_T2", "机器": "M2", "时长": 2, "后置": "J1_T1"}
]
},
{
"标识": "作业2",
"任务": [
{"标识": "J2_T1", "机器": "M2", "时长": 2},
{"标识": "J2_T2", "机器": "M1", "时长": 3, "后置": "J2_T1"}
]
}
],
"约束": {
"无重叠": "同一机器上的任务不能重叠",
"先后顺序": "任务必须遵守作业内的顺序",
"截止时间": {"作业1": 10, "作业2": 8}
},
"目标": "最小化总完成时间" # 或 "最小化延迟"
}
配置问题
# 产品配置
config_problem = {
"组件": {
"发动机": {"选项": ["V6", "V8", "电动"]},
"变速箱": {"选项": ["手动", "自动", "CVT"]},
"轮毂尺寸": {"选项": [17, 18, 19, 20]},
"颜色": {"选项": ["红色", "蓝色", "黑色", "白色"]}
},
"约束": [
{
"类型": "蕴含",
"如果": {"发动机": "电动"},
"那么": {"变速箱": ["自动", "CVT"]},
"描述": "电动发动机不支持手动变速箱"
},
{
"类型": "不兼容",
"值": [{"发动机": "V6"}, {"轮毂尺寸": 20}],
"描述": "V6不提供20英寸轮毂选项"
}
]
}
全局约束
| 约束 | 描述 | 示例用途 |
|---|---|---|
| 全不同 | 所有变量取不同值 | 数独、分配 |
| 累积 | 随时间变化的资源使用 | 调度 |
| 回路 | 变量形成哈密顿回路 | TSP、路由 |
| 表 | 允许/禁止的组合 | 配置 |
| 正则 | 序列匹配自动机 | 班次模式 |
| 基数 | 值出现次数 | 工作量平衡 |
输入模式
{
"问题类型": "csp|cop|调度|配置",
"变量": {
"变量名": {
"域": "数组或范围",
"类型": "整数|布尔|集合"
}
},
"约束": [
{
"类型": "字符串",
"范围": ["字符串"],
"参数": "对象"
}
],
"目标": {
"类型": "最小化|最大化",
"表达式": "字符串"
},
"搜索配置": {
"策略": "默认|首次失败|最小域",
"时间限制": "数字",
"所有解决方案": "布尔值",
"最大解决方案数": "数字"
}
}
输出模式
{
"状态": "满足|最优|不可行|未知",
"解决方案": {
"变量名": "值"
},
"目标值": "数字(如果是COP)",
"所有解决方案": [
{"变量名": "值"}
],
"统计": {
"探索节点数": "数字",
"传播次数": "数字",
"回溯次数": "数字",
"求解时间": "数字"
},
"解释": {
"未满足约束": ["字符串"],
"冲突集": ["字符串"]
}
}
搜索策略
| 策略 | 描述 | 最适合 |
|---|---|---|
| 首次失败 | 选择域最小的变量 | 通用CSPs |
| 最小域 | 与首次失败相同 | 通用CSPs |
| 影响 | 根据约束传播影响选择 | 大型问题 |
| 活跃度 | 选择频繁变化的变量 | 重启搜索 |
| 随机 | 随机变量/值选择 | 多样化 |
最佳实践
- 定义紧凑的域以减少搜索空间
- 使用适当的全局约束(比分解更高效)
- 添加冗余约束以改进传播
- 考虑对称性破坏约束
- 对大型难题使用重启
- 分析以识别传播瓶颈
- 根据业务需求验证解决方案
集成点
- 与线性规划求解器连接用于混合方法
- 输入到优化专家代理
- 支持调度和分配流程
- 与决策可视化集成用于甘特图