使用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
我不确定抛弃重叠方块的约束条件是什么,或者我是否正确地执行此操作。
答案 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).