Подсчет размещения предметов в корзинах в соответствии с логическими ограничениями - PullRequest
1 голос
/ 09 августа 2010

У нас есть пул предметов.Каждый предмет имеет набор характеристик.Каждая характеристика представляет собой строку, целое число или число с плавающей точкой.Каждый элемент также имеет определенный тип.Типы являются иерархическими.

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

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

Например, у нас может быть следующая иерархия типов:

  • shape
    • треугольник
      • равносторонний треугольник
    • прямоугольник
      • квадрат

У нас могут быть следующие предметы:

  • LargeRedTriangle
  • type = треугольник
  • color = "red"
  • area = 1000
SmallShape
  • тип = форма
  • площадь = 5
LargeBlueSquare
  • тип = квадрат
  • цвет= "синий"
  • area = 2000

Вот пример корзины:

  • LargeRectangles
    • (type == прямоугольник) и (область> 750)
    • количество элементов = 5

Мы можем поместить LargeBlueSquare в корзину LargeRectangles.Мы хотим ровно 5 элементов в этой корзине.

Вот еще один пример корзины:

  • NonBlueTriangles
    • (type == треугольник) и (не (color ==)"синий"))
    • количество элементов = 10

LargeRedTriangle может помещаться в корзину NonBlueTriangles.Мы хотим ровно 10 элементов в этой корзине.

Итак, у нас есть набор предметов и набор корзин.Вопрос состоит в том, чтобы выяснить, сколько существует способов поместить элементы в ячейки при соблюдении ограничений (то есть требований к элементам в ячейках и количества элементов в каждой ячейке).(Нам не нужно перечислять все способы сделать это; нам нужно только знать, сколько существует различных способов сделать это.)

Существует ли эффективный способ определения этого числа?Или нам просто нужно «перебить» его и попробовать все возможные комбинации?

1 Ответ

3 голосов
/ 09 августа 2010

Если я правильно понял, ваша проблема сводится к проблеме поиска числа Совершенных совпадений в двудольном графе.

Предметы из левого набора. Бункеры образуют право. Если корзине нужно k предметов, вы делаете k копий этой корзины.

Теперь вы формируете грань между элементом и корзиной, если предмет является возможным кандидатом на эту ячейку.

Теперь вам нужно найти количество идеальных совпадений на этом графике.

К сожалению, это сложная проблема. Расчет количества идеальных совпадений в графе эквивалентен нахождению Перманента связанной матрицы, который равен # P-Complete . См .: Расчет перманента .

Ваша лучшая ставка может быть рандомизированными / приближенными алгоритмами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...