Нужна помощь в решении проблемы ограничения - PullRequest
4 голосов
/ 15 мая 2011

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

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

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

2)

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

3)

Индекс относится к (одиночному!) Индексу индексированной переменной.Например, если вы введете диапазон индекса от 1 до 8 для переменной «X», то каждый из «X (1)», «X (2)», ..., «X (8)» является нормальной переменнойс тем же доменом.Укажите диапазон индексов, чтобы от ≤ до.Если вы оставите пустыми поля «Индекс», ваша переменная считается неиндексированной.(Примечание: использование from = to возможно, хотя это не имеет большого смысла: вместо этого вы можете использовать неиндексированную переменную.) Не используйте одно и то же имя дважды, также не один для нормального и один раз дляиндексированная переменная!Также не используйте повторно часть имен переменных, например, если у вас уже есть MyVar_1, также не используйте Var.

CONSTRAINTS

Вы можете ввестиарифметические ограничения, если необходимо, с указанием диапазона для используемых индексов.Арифметическое ограничение имеет вид 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. </p>

Также могут быть логические выраженияиспользуемый.Разрешенными логическими связями являются '<=>', '=>', '/ \' и '\ /' для эквивалентности, импликации, конъюнкции и дизъюнкции соответственно.

Диапазон - это выражение, которое содержит каждоеИндекс, который используется в ограничении.Примеры: i », «=>» или «\ /».Примечание: диапазон является логическим выражением (неявно универсально выраженным), а не выражением множества, как 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

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

1 Ответ

2 голосов
/ 15 мая 2011

Предположим, что квадрат i & times; i (i = 2, 3, 4 или 5) расположен так, что его нижний левый угол находится в точке (X (i), Y (i)). Таким образом, квадрат занимает область от (X (i), Y (i)) внизу слева до (X (i) + i, Y (i) + i)) в правом верхнем углу. Теперь вы хотите сказать, что квадрат j & times; 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
...