使用约束将方块包装成矩形(CLINGO)

时间:2016-02-22 07:25:20

标签: answer-set-programming

使用CLINGO将给定的一组方块打包到给定的矩形区域而不会重叠。  例如,我们想要打包正方形:

A大小为4,B大小为3,C&尺寸为2的D,尺寸为1的E

进入5 x 8区域。

 #const x = 8.
  #const y = 5.

square(a,4; b,3; c,2; d,2; e,1).

%generate a grid:
1 { pos(X,Y) } 1 :- x(X), y(Y).

%generate placement of the squares
1 { placement(P, SQ) } 1 :- square(SQ), pos(P).

%throw out overlaps

我不确定抛弃重叠方块的约束条件是什么,或者我是否正确地执行此操作。

1 个答案:

答案 0 :(得分:0)

修复代码

网格生成不会产生预期的原子。这是你想要的那个:

POS(1..X,1..y)。

此外,正方形的位置表示: placement / 2适用于任何一对正方形×位置。相反,我们希望将一个职位与每个方格相关联:

1 {placement(pos(X,Y),S):pos(X,Y)} 1: - square(S,_)。

现在我们必须设计重叠约束。

解决问题的方法。

首先,我们定义占用/ 3,当方形S占据位置(X,Y)处的网格时占用(S,X,Y):

occupy(S,X+I,Y+J):- square(S,Size) ; placement(pos(X,Y),S) ; I=0..Size-1 ; J=0..Size-1.

例如,square(a,2). placement(a,pos(1,3)).将与occupy(a,1,3).occupy(a,1,4).occupy(a,2,3).occupy(a,2,4).相关联。

然后,我们丢弃任何在给定位置占据多于一个的模型:

:- {occupy(_,X,Y)}>1 ; occupy(_,X,Y).

修复:您还必须丢弃放置正方形的模型,使其占据不存在的位置:

:- occupy(_,X,Y) ; not pos(X,Y).