约束满足问题的表述

时间:2018-11-10 22:43:27

标签: python search constraints backtracking constraint-programming

我得到以下要求,这些要求需要通过定义一组变量以及对这些变量的一组约束来表达为CSP问题。但是,我在为问题制定约束和变量时遇到了麻烦。

一些信息: 该问题的解决方案是任务列表:[Var, A1, A2, A3] 其中Var是变量,而A1A2A3是有效分配的有序序列。

要求:

  • 每个变量都在problem.valid_assignments()中分配了一个值
  • 每个变量的第一个赋值在problem.first_assignments()
  • 每个变量的分配顺序在problem.valid_pairs()中(某些分配不能跟随其他分配)
  • 给定整数K,其中至少一个没有问题的连续分配不能超过K。k_assignment()
  • 给定分配列表中的每个值:problem.assignment

可用约束:

  • NValues约束:给定required_values的列表(上限和下限),请确保值在required_values中的变量数在两个边界之间。
  • li>
  • AllDifferent约束:给定一组变量,强制其不等式。那集合中没有两个变量相等。
  • NotEqual约束:给定Var1Var2,强制执行: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)]是有效对)。

  • 本质上来说,我们正在寻找弧线一致性。

1 个答案:

答案 0 :(得分:1)

  • 我们可以使用范围为所有变量的NValues约束,而domain是每个可能的赋值(为每个赋值创建一个约束)。这样可以确保在设置上限和下限为1时分配所有值。

  • 我们可以使用Neq约束进行一些修改,以通过向其提供有效分配的元组来确保正确的排序。

  • 我们可以再次使用NValues约束,以通过域k_assignment传递下限1和上界K来确保K_assignments的要求。

  • 以相同的方式,我们可以将NValues约束与域problem.first_assignments()一起用于第一次分配。另一个具有域problem.valid_assignments()的空格。