Мне даны следующие требования, которые необходимо сформулировать в задачу CSP путем определения набора переменных и набора ограничений для этих переменных. Однако у меня возникают проблемы с формулировкой ограничений и переменных для моей проблемы.
Некоторая информация:
Решением проблемы является список назначений: [Var, A1, A2, A3]
где Var
- переменная, а A1
, A2
, A3
- упорядоченная последовательность допустимых назначений.
Требования:
- Каждой переменной присваивается значение в
problem.valid_assignments()
- Первое присваивание каждой переменной в
problem.first_assignments()
- Последовательность присваивания каждой переменной находится в
problem.valid_pairs()
(некоторые назначения не могут следовать за другими)
- Учитывая целое число
K
, может быть не более K
непрерывных назначений, где хотя бы одно не входит в задачу. K_assignment ()
- Каждое значение в данном списке назначений:
problem.assignment
должно использоваться.
Доступные ограничения:
NValues
ограничение: Учитывая список required_values
, верхняя граница и нижняя граница, гарантирует, что число переменных, значение которых находится в required_values
, находится между границами.
AllDifferent
ограничение: Учитывая набор переменных, обеспечивает их неравенство. То есть нет двух переменных в наборе равных.
NotEqual
ограничения: Дано Var1
, Var2
, принудительно: Var1
! = Var2
Пока:
- Переменная для каждого
Var
, чей домен problem.valid_assignments()
- Переменная для каждого
Var
, чей домен problem.first_assignments()
- Ограничение
NValues
для каждого Var
, область действия которого [Var]
, необходимые значения problem.valid_assignments(Var)
, нижняя граница 0
, верхняя граница len(domain)
.
Дополнительная информация:
Решением является «список назначений», так как для каждого Var
мы возвращаем [Var, A1, A2, A3]
, где Var
- назначенная переменная, а A1
- A3
- действительные назначения, которые удовлетворяют заданному ограничения. Точный формат не имеет значения, так как я ищу только концептуальное решение. Кроме того, A1, A2, A3
(то есть все назначения для Var
), очевидно, должны находиться в домене этой переменной. (Домены могут перекрываться между переменными).
valid_pairs()
возвращает список кортежей [(A1, A2), (A2,A3)]
. Ограничение таково, что возвращаемый список решений (как описано выше) должен иметь последовательные назначения, которые образуют допустимые пары, которые задаются этой функцией. Например, если решение - [Var, A1, A2, A4, A3]
, а допустимые пары - [(A1, A2), (A2,A3)]
, то решение является неправильным, поскольку (A2, A4) (A4, A3)
отсутствует в списке (однако (A1, A2)
является допустимой парой).
По сути, мы ищем последовательность дуги.