python - 约束满足问题公式化
问题描述
通过定义一组变量和一组对这些变量的约束,我得到了以下需要将其表述为 CSP 问题的要求。但是,我在为我的问题制定约束和变量时遇到了麻烦。
一些信息:
问题的解决方案是一个赋值列表:变量[Var, A1, A2, A3]
在哪里,,是有效赋值的有序序列。Var
A1
A2
A3
要求:
- 每个变量都被赋予一个值
problem.valid_assignments()
- 每个变量的第一个赋值在
problem.first_assignments()
- 每个变量的赋值顺序都在
problem.valid_pairs()
(有些赋值不能跟随其他) - 给定一个整数
K
,最多只能有K
一个连续赋值,其中至少有一个不在problem.k_assignment() - 给定分配列表中的每个值:
problem.assignment
必须使用。
可用约束:
NValues
约束:给定一个列表required_values
,一个上限和下限,确保其值在其中的变量的数量required_values
在边界之间。AllDifferent
约束:给定一组变量,强制它们的不等式。也就是说,集合中没有两个变量是相等的。NotEqual
约束:给定Var1
,Var2
, 强制执行:Var1
!=Var2
至今:
- 每个
Var
域的变量problem.valid_assignments()
- 每个
Var
域的变量problem.first_assignments()
NValues
每个Var
范围的约束[Var]
,要求的值problem.valid_assignments(Var)
,下限0
,上限len(domain)
。
附加信息:
解决方案是一个“分配列表”,因为对于每个
Var
我们返回的变量是在[Var, A1, A2, A3]
哪里分配的,并且通过是满足给定约束的有效分配。确切的格式并不重要,因为我只是在寻找一个概念性的解决方案。此外(也就是 a 的所有赋值)显然必须在该变量的域中。(域可以在变量之间重叠)。Var
A1
A3
A1, A2, A3
Var
valid_pairs()
返回一个元组列表[(A1, A2), (A2,A3)]
。约束是这样的,即返回的解决方案列表(如上所述)必须具有连续的分配,这些分配形成由该函数给出的有效对。例如,如果解决方案是[Var, A1, A2, A4, A3]
并且有效对是,[(A1, A2), (A2,A3)]
则解决方案不正确,因为(A2, A4) (A4, A3)
不在列表中((A1, A2)
但是是有效对)。本质上,我们正在寻找弧一致性。
解决方案
我们可以使用一个
NValues
范围是所有变量的约束,域是每个可能的赋值(为每个赋值创建一个约束)。这可确保在设置为上限和下限为 1 时分配所有值。我们可以使用 use
Neq
约束并稍作修改,通过为其提供有效分配的元组来确保正确的排序。我们可以通过传递 1 的下限和domain的上限来再次使用
NValues
约束来确保需求。k_assignment
K
K_assignments
以同样的方式,我们可以将
NValues
约束与域一起problem.first_assignments()
用于第一次分配。另一个用域problem.valid_assignments()
来填补空白。
推荐阅读
- python - csv导入中每行的Python打印标题响应和行号
- asp.net - asp net临时文件,ResX文件夹,为什么没有创建?
- html - 为什么当正文中的代码工作时,头部标签内的代码不工作?
- java - MyBatis 偶尔使用 selectByPrimaryKey 时无法获取记录
- r - 在 R 中的 multidplyr 中使用 distinct() 时出错
- reactjs - 无效的钩子调用,它让我发疯?
- api - 如何从 API 保存数据 - 颤振
- git - 无法在 docker-compose 中克隆存储库
- python - 如何在使用 pandas_profiling 运行 ProfileReport 时解决 TypeError?
- reed-solomon - 为 reed-solomon 编码选择伽罗瓦域