Нужна помощь в решении проблемы с ограничениями

Я хотел бы решить следующую проблему, используя ограничения, но на самом деле я не знаю, с чего начать, поэтому я решил опубликовать ее здесь для получения помощи.

*** 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.

Пожалуйста, это не домашнее задание, потому что я решил сам добавлять квадраты и круги. но я не знаю, как и с чего начать. Я изучаю этот ограничительный материал как новичок и вообще не знаю, как его решить, и мне нужна помощь. Я предполагаю использовать следующий синтаксис для определения переменных и ограничений:

* ПЕРЕМЕННЫЕ *

1)

Имя должно начинаться с верхнего регистра [A-Z] и использовать только [A-Za-z0-9_]. Примеры: X или MyVar_1.

2)

Домен - это набор всех целых чисел в диапазоне [от, ..., до]. Убедитесь, что от ≤ до.

3)

Индекс относится к (одиночному!) Индексу индексированной переменной. Например, если вы вводите диапазон индексов от 1 до 8 для переменной «X», тогда каждый из «X (1)», «X (2)», ..., «X (8)» является нормальной переменной. с тем же доменом. Укажите диапазон индекса таким образом, чтобы от ≤ до. Если вы оставите пустыми поля «Индекс», ваша переменная будет считаться неиндексированной. (Примечание: использование 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!

В следующем примере используется указанный выше синтаксис:

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

Спасибо за вашу помощь.


person Kap    schedule 15.05.2011    source источник


Ответы (1)


Предположим, что квадрат ii (i = 2, 3, 4 или 5) размещен так, что его нижний левый угол находится в точке (X (i), Y (i)). Таким образом, квадрат занимает область от (X (i), Y (i)) в нижнем левом углу до (X (i) + i, Y (i) + i)) в правом верхнем углу. Теперь вы хотите сказать, что квадрат jj не перекрывается с этим квадратом. Это происходит только тогда, когда он находится полностью справа, полностью слева, полностью выше или полностью ниже этого квадрата. Таким образом:

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
person ShreevatsaR    schedule 15.05.2011
comment
Большое спасибо за ваш ответ - person Kap; 15.05.2011