如何将 k-knights 问题表述为约束满足问题?

人工智能 解决问题 约束满足问题
2021-11-18 07:30:20

每个约束满足问题(CSP)都有三件事:

  1. 变量
  2. 领域
  3. 约束

在给定的场景中,我知道如何识别约束,但我不知道如何识别变量和域。

给定的场景是:

给你一个n×n板,在哪里n3. 在这个板上,你必须把k骑士在哪里k<n2,这样就没有骑士在攻击另一个骑士。预计骑士将被放置在棋盘上的不同方格上。骑士可以垂直移动两个格子,水平移动一个格子,或者水平移动两个格子,垂直移动一个格子。如果他们中的一个可以在一次移动中到达另一个骑士,则骑士会互相攻击。例如,在一个3×3板,我们可以放置k=5骑士。

所以,输入是m=3,n=3,k=5. 有两种解决方案。

解决方案 1

K A K   
A K A    
K A K

解决方案 2

A K A
K K K
A K A
1个回答

有许多可能的方法来编码这个问题,有些会比其他的更有优势

对我来说似乎是一个合理的起点的编码是:

  1. 变量:让S成为一组k代表棋盘上骑士坐标的变量。
  2. 域:每个变量的域最初是所有向量[n]2. [r,c].
  3. 约束:
    • 设 A 为 8 个攻击动作的集合:A={[2,1],[2,1],[2,1],[2,1],[1,2],[1,2],[1,2],[1,2]}
    • i<jSiSj(没有骑士在同一个广场上)
    • i<j[ri,ci]{[rj+x,cj+y]|x,yA}(没有骑士攻击另一个骑士)

应该是这样的。注意使用i<j在约束中是将约束的总数减少一半,利用骑士的对称性i可以攻击骑士j当夫骑士j可以攻击骑士i. 你也可以使用ij,但它会将您的约束计数增加到没有收益。