首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用答案集规划的N-Queens问题

使用答案集规划的N-Queens问题
EN

Stack Overflow用户
提问于 2021-12-22 07:08:06
回答 1查看 474关注 0票数 3

试着学习答案集编程,并决定给n皇后问题一个尝试。这就是我到目前为止所拥有的:-

代码语言:javascript
复制
% Queens are placed on an n x n chess board.
% Each queens must not attack each other.

% Represent the chess board squares.
square(1..n, 1..n).

% Place a Queen on one chess square.
queen(1..n).
5 { on(Q, X, Y) : queen(Q), square(X, Y) } 5.
:- queen(Q), on(Q, X, Y), on(Q, X', Y'), X != X', Y != Y'.

% Make sure each square only has one queen.
:- queen(Q), queen(Q'), on(Q, X, Y), on(Q', X, Y), Q != Q'.

% A Queen attacks another if both are on the same vertical, horizontal or diagonal.
:- on(Q, X, Y), on(Q', X, Y'), Q != Q', Y != Y'.
:- on(Q, X, Y), on(Q', X', Y), Q != Q', X != X'.
:- on(Q, X, Y), on(Q', X', Y'), Q != Q', |X-X'| = |Y-Y'|.

我使用的是clingo命令- clingo n-queens.lp --const n=5 --models 2。我得到的输出是:-

正如您所看到的,尽管指出皇后不应该在同一列或行中,但输出还是包含了一些。这个程序有什么问题?

你们对ASP有什么建议吗?当我试图用ASP语法描述知识时,我觉得自己总是被困住了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-24 18:21:36

您的程序有两个问题:

代码语言:javascript
复制
5 { on(Q, X, Y) : queen(Q), square(X, Y) } 5.

应该是

代码语言:javascript
复制
n { on(Q, X, Y) : queen(Q), square(X, Y) } n.

如果你想要它除了n=5

代码语言:javascript
复制
:- queen(Q), on(Q, X, Y), on(Q, X', Y'), X != X', Y != Y'.

应该是

代码语言:javascript
复制
:- queen(Q), on(Q, X, Y), on(Q, X', Y'), X != X'.
:- queen(Q), on(Q, X, Y), on(Q, X', Y'), Y != Y'.

这是因为您希望编写:- ..., X != X' OR Y != Y'而不是:- ..., X != X' AND Y != Y' --只有当两个值不同时,此约束才会生效。

对于输出,我还添加了:

代码语言:javascript
复制
#show on/3.

使用在线版本的clingo进行测试(将#const n=5.添加到代码中):

代码语言:javascript
复制
clingo version 5.5.0
Reading from stdin
Solving...
Answer: 1
on(2,3,3) on(4,4,5) on(5,2,1) on(1,1,4) on(3,5,2)
SATISFIABLE

请注意,在线版本提供了一个非常简洁的n-皇后的例子。

你的计划可行,但仍有改进的余地。如果您想要实现高效的代码,第一个提示将是减少地面逻辑程序的大小。例如,可以通过减少谓词的重要性来做到这一点。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70445374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档