我想使用约束来解决以下问题,但实际上我不知道从哪里开始,所以我决定在这里发帖求助。
*** Fitting squares ***
Given the set of black squares of Figure 1 (a 2x2, 3x3, 4x4 and a 5x5 square),
fit them all into the white rectangle of Figure 1 (a 7x9 rectangle), and this in
such a way that there is no overlap between the squares.
Note that the black squares can only be put on integer coordinates.
Formulate the problem above as a constraint problem. Come up with a useful
representation of the problem in terms of the constraint processing tool.
Provide an explanation of indices, variables and domains. Furthermore,
provide for every introduced constraint,
the meaning of the constraint in natural language.
请这不是作业,因为我已经解决了自己添加方块和圆圈的问题。但是这个我不知道如何以及从哪里开始。我作为一个初学者学习这个约束的东西,并不知道如何解决这个问题并需要帮助。我假设使用以下语法来定义变量和约束:
* VARIABLES *
1)
名称必须以大写[A-Z]开头,并且仅使用[A-Za-z0-9_]。 示例:X或MyVar_1。
2)
Domain是[from,...,to]范围内所有整数的集合。确保从≤到。
第3)
索引是指索引变量的(单个!)索引。例如,如果为变量“X”输入1到8的索引范围,则“X(1)”,“X(2)”,...,“X(8)”中的每一个都是正常变量使用相同的域名。指定索引范围,使得从≤到。如果将“索引”字段留空,则假定您的变量是非索引变量。 (注意:使用from = to是可能的,虽然它没有多大意义:你可以使用非索引变量。) 不要使用相同的名称两次,也不要使用一次正常,一次使用索引变量!也不要重复使用部分变量名称,例如如果您已经拥有MyVar_1,请不要使用Var。
的约束 的
如果需要,您可以输入算术约束,并为已使用的索引指定范围。算术约束的形式为Expr~Expr,其中Expr是一个使用整数,声明变量和一些算术的表达式,其中〜是关系运算符。
1)
使用索引变量时,必须指定索引
算术使用运算符'+',' - ','*','/','mod',其中'X / Y'是X和Y(向下舍入)的商。也允许'min(X,Y)','max(X,Y)','abs(X)'。
第3) 可用的关系运算符是'=','\ =','<','>','=<','> =',具有明显的含义。
4) 使用圆括号消除歧义! 实例:X(i)+ Y(j)< 12或min(X(i),X(j))\ = Z或X(i)* i = 20.
也可以使用布尔表达式。允许的布尔连接词分别为'&lt; =&gt;','=&gt;','/ \'和'\ /',分别用于等价,暗示,连接和析取。
范围是一个表达式,其中包含约束中使用的每个索引。例子:i&lt; j或i = j或(i = j / \ k \ = l)。范围表达式不应包含“&lt; =&gt;”,“=&gt;”或“\ /”。 注意:范围是一个逻辑表达式(隐式普遍量化),而不是像i = 1..10那样的集合表达式。
以下示例使用以上语法:
You can solve, e.g., some linear integer equations using normal variables only:
Name: X, domain: 1..10000
Name: Y, domain: 1..10000
Name: Z, domain: 1..1000000
Constraint: 29*X + 43*Y = Z
Constraint: X * Y = Z
Another example is the N-queens problem which uses index variables:
Name: Q(i), i=1..4, domain: 1..4
Constraint: Q(i) \= Q(j), range: i < j
Constraint: abs(Q(i) - Q(j)) \= j - i, range: i < j
感谢您的帮助。
答案 0 :(得分:2)
假设放置i×i平方(i = 2,3,4或5)使得其左下角位于(X(i),Y(i))。因此,正方形占据了从左下角的(X(i),Y(i))到右上角的(X(i)+ i,Y(i)+ i))的区域。现在你想说j×j方块与这个方块不重叠。只有当它完全位于右侧,完全位于左侧,完全位于该正方形之上或完全位于该正方形之下时,才会发生这种情况。因此:
Name X(i), i=2..5, domain: 1..7
Name Y(i), i=2..5, domain: 1..9
Constraint: X(i)+i=<X(j) \/ X(j)+j=<X(i) \/ Y(i)+i=<Y(j) \/ Y(j)+j=<Y(i), range: i<j