我想使用约束来解决以下问题,但我实际上不知道从哪里开始,所以我决定在这里发帖寻求帮助。
*** 拟合正方形 *** 给定图 1 中的黑色正方形集合(一个 2x2、3x3、4x4 和一个 5x5 的正方形), 将它们全部放入图 1 的白色矩形中(一个 7x9 的矩形),并且以 这样一种方式,即正方形之间没有重叠。 请注意,黑色正方形只能放置在整数坐标上。 将上述问题表述为一个约束问题。 想出一个有用的 问题表示方式,以约束处理工具的形式。 提供索引、变量和域的解释。 此外, 对于每个引入的约束, 提供自然语言中约束的含义。
请注意,这不是家庭作业,因为我已经自己解决了添加正方形和圆形的问题。 但这个问题我不知道如何以及从哪里开始。我是一个初学者,正在学习约束相关知识,完全不知道如何解决这个问题,需要帮助。我应该使用以下语法来定义变量和约束:
* 变量 *
1)
名称必须以大写字母 [A-Z] 开头,并且只能使用 [A-Za-z0-9_]。示例:X 或 MyVar_1。
2)
域是范围 [from,…,to] 中所有整数的集合。 确保 from ≤ to。
3)
索引是指索引变量的(单个!)索引。 例如,如果为变量 “X” 输入 1 到 8 的索引范围,则 “X(1)”、”X(2)”、…、”X(8)” 中的每一个都是具有相同域的普通变量。 指定索引范围,使得 from ≤ to。 如果您将“索引”字段留空,则假定您的变量是非索引变量。(注意:使用 from = to 是可能的,尽管它没有多大意义:您可以改用非索引变量。)不要两次使用相同的名称,无论是用于普通变量还是索引变量! 也不要重复使用变量名称的一部分,例如,如果您已经有 MyVar_1,则不要也使用 Var。
约束
您可以输入算术约束,如果需要,可以指定所使用索引的范围。 算术约束的形式为 Expr ∼ Expr,其中 Expr 是使用整数、声明的变量和一些算术的表达式,其中 ∼ 是关系运算符。
1)
使用索引变量时,必须给出索引
- 以 MyVar(index) 格式,即在变量名后面立即使用 “(” 和 “)”,并且中间没有空格。
- 请注意,索引必须是一个变量,因此不允许使用 MyVar(37) 之类的东西。 而是编写 MyVar(i),并输入 i=37 的范围。
- 此外,索引必须出现在“范围”字段中。 提示:如果您的约束必须适用于整个索引范围,例如 i=1..10,则只需输入一个微不足道地满足的范围,例如 i>0。
- 索引名称可以按原样出现在约束中,即不作为索引。
- 还允许使用 MyVar(index+x) 或 MyVar(index-x) 格式,其中 x 是一个整数。 不要在“+”或“-”之前或之后使用空格!2)
算术使用运算符“+”、“-”、“*”、“/”、“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。
也可以使用布尔表达式。 允许的布尔连接词有“<=>”、“=>”、“/\”和“\/”,分别表示等价、蕴含、合取和析取。
范围是一个包含约束中使用的每个索引的表达式。 示例:i < j 或 i = j 或 (i = j /\ k \= l)。 范围表达式不应包含“<=>”、“=>”或“\/”。注意:范围是一个逻辑表达式(隐式地普遍量化),而不是像 i=1..10 这样的集合表达式!
以下示例使用了上述语法:
您可以仅使用普通变量来求解一些线性整数方程,例如: 名称:X,域:1..10000 名称:Y,域:1..10000 名称:Z,域:1..1000000 约束:29*X + 43*Y = Z 约束:X * Y = Z 另一个例子是 N 皇后问题,它使用索引变量: 名称:Q(i), i=1..4, 域:1..4 约束:Q(i) \= Q(j), 范围:i < j 约束:abs(Q(i) - Q(j)) \= j - i, 范围:i < j
感谢您的帮助。
回答:
假设 i×i 的正方形(i=2, 3, 4, 或 5)放置时,其左下角位于 (X(i), Y(i))。 那么这个正方形占据的区域是从左下角的 (X(i),Y(i)) 到右上角的 (X(i)+i,Y(i)+i))。 现在你想表达的是 j×j 的正方形不与这个正方形重叠。 这种情况只有当它完全位于这个正方形的右侧、完全位于左侧、完全位于上方或完全位于下方时才会发生。 因此:
名称 X(i), i=2..5, 域:1..7 名称 Y(i), i=2..5, 域:1..9 约束:X(i)+i=<X(j) \/ X(j)+j=<X(i) \/ Y(i)+i=<Y(j) \/ Y(j)+j=<Y(i), 范围:i<j