一些信息:
该问题的解决方案是任务列表:[Var, A1, A2, A3]
其中Var
是变量,而A1
,A2
,A3
是有效分配的有序序列。
要求:
problem.valid_assignments()
中分配了一个值problem.first_assignments()
problem.valid_pairs()
中(某些分配不能跟随其他分配)K
,其中至少一个没有问题的连续分配不能超过K
。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]
是分配的变量,Var
至{{ 1}}是满足给定约束的有效分配。确切的格式无关紧要,因为我只是在寻找一种概念上的解决方案。另外,A1
(也就是A3
的所有赋值)显然必须在该变量的域中。 (域可以在变量之间重叠)。
A1, A2, A3
返回一个元组列表Var
。这种约束使得返回的解决方案列表(如上所述)必须具有连续的赋值,这些赋值形成了由该函数给出的有效对。例如,如果解决方案为valid_pairs()
并且有效对为[(A1, A2), (A2,A3)]
,则解决方案不正确,因为[Var, A1, A2, A4, A3]
不在列表中([(A1, A2), (A2,A3)]
是有效对)。
本质上来说,我们正在寻找弧线一致性。
答案 0 :(得分:1)
我们可以使用范围为所有变量的NValues
约束,而domain是每个可能的赋值(为每个赋值创建一个约束)。这样可以确保在设置上限和下限为1时分配所有值。
我们可以使用Neq
约束进行一些修改,以通过向其提供有效分配的元组来确保正确的排序。
我们可以再次使用NValues
约束,以通过域k_assignment
传递下限1和上界K
来确保K_assignments
的要求。
以相同的方式,我们可以将NValues
约束与域problem.first_assignments()
一起用于第一次分配。另一个具有域problem.valid_assignments()
的空格。