Постановка проблемы удовлетворенности - PullRequest
0 голосов
/ 11 ноября 2018

Мне даны следующие требования, которые необходимо сформулировать в задачу 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) является допустимой парой).

  • По сути, мы ищем последовательность дуги.

1 Ответ

0 голосов
/ 16 ноября 2018
  • Мы можем использовать ограничение NValues, область действия которого - все переменные, а домен - это каждое возможное назначение (для каждого назначения создайте ограничение). Это гарантирует, что все значения будут назначены, если заданы верхняя и нижняя границы 1.

  • Мы можем использовать ограничение Neq с небольшим изменением, чтобы обеспечить правильную последовательность, передавая ей кортежи действительных назначений.

  • Мы снова можем использовать ограничение NValues, чтобы обеспечить требование k_assignment, передав нижнюю границу 1 и верхнюю границу K с доменом K_assignments.

  • Таким же образом мы можем использовать ограничение NValues с доменом problem.first_assignments() для первого назначения. И еще один с доменом problem.valid_assignments() для заполнения пробелов.

...