【问题标题】:Packing Squares into A Rectangle, Using Constraints (CLINGO)使用约束将正方形打包成矩形 (CLINGO)
【发布时间】:2016-02-22 07:25:19
【问题描述】:

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

4号A,3号B,2号C和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

我不确定丢弃重叠方块的限制条件是什么,或者我是否做得对。

【问题讨论】:

    标签: answer-set-programming


    【解决方案1】:

    修复代码

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

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

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

    1 {placement(pos(X,Y),S): pos(X,Y)} 1:- 正方形(S,_)。

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

    问题的解决方案。

    首先,我们定义occup/3,当正方形S在(X,Y)位置占据网格时,其中occup(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).
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 2011-11-18
      • 1970-01-01
      • 1970-01-01
      • 2013-02-16
      • 2020-04-03
      相关资源
      最近更新 更多