0

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

A 4 号,B 3 号,C 和 D 2 号,E 1 号

进入 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

我不确定扔掉重叠方块的限制是什么,或者我是否做对了。

4

1 回答 1

0

修复代码

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

位置(1..x,1..y)。

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

1 {placement(pos(X,Y),S): pos(X,Y)} 1:- 正方形(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).
于 2017-01-13T18:30:44.067 回答