Я пытаюсь найти разумный алгоритм для этой проблемы:
Скажем, у вас есть куча мячей. Каждый шар имеет по крайней мере один цвет, но также может быть многоцветным. Каждый шар имеет вес и значение, связанное с ним. Есть также куча ящиков, каждая из которых имеет только один цвет. Каждая коробка имеет максимальное количество шаров, которые она может удерживать. Цель состоит в том, чтобы максимизировать сумму значения в ящиках, оставаясь при некотором общем весе W, и единственным правилом является:
Чтобы поместить мяч в коробку, он должен по крайней мере иметь цвет коробки на нем
(Например, вы можете поместить синий и зеленый шар в синюю коробку или зеленую коробку, но не в красную рамку.)
У меня есть некоторые исследования, и это похоже на проблему с рюкзаком, а также похоже на то, что оно разрешимо венгерским алгоритмом, но я не могу, похоже, уменьшить его до любой проблемы.
Мне просто любопытно, есть ли какой-то алгоритм динамического программирования для этого типа проблемы, чтобы сделать его разрешимым в полиномиальное время, или если это просто проблема коммивояжера в маскировке. Помогло бы мне, если бы я знал, что есть не более X цветов? Любая помощь приветствуется. Я мог бы также формализовать проблему немного с именами переменных, если это поможет. Спасибо!
Вот простой пример:
Максимальный вес: 5
Шарики:
1 красный шар - (value = 5, вес = 1)
1 синий шар - (value = 3, вес = 1)
1 зеленый/красный/синий шар - (value = 2, вес = 4)
1 зеленый/синий шар - (value = 4, вес = 1)
1 красный/синий шар - (value = 1, вес = 1)
Коробки:
1 красный (имеет 1 мяч)
1 синий (имеет 2 шара)
1 зеленый (имеет 1 шар)
Оптимальное решение:
красный шар в красном поле
синий шар и красный/синий шар в синем поле
зеленый/синий шар в зеленой коробке
Общее значение: 13 (5 + 3 + 1 + 4)
Общий вес: 4 (1 + 1 + 1 + 1)
Примечание: несмотря на то, что зеленый/красный/синий шар был более ценным, чем красный/синий шар, этот вес поставил бы нас над пределом.
Edit:
Один поясняющий момент: шары с одинаковой цветовой комбинацией не обязательно будут иметь одинаковые веса и значения. Например, у вас может быть красный шар со значением 3 и весом 1 и еще один красный шар со значением 2 и весом 5.
Изменить 2:
Мы можем принимать целочисленные веса и значения, если это помогает нам разработать алгоритм динамического программирования.