Алгоритм нахождения лучшей комбинации - PullRequest
0 голосов
/ 08 октября 2011

Итак, у меня 12 списков, каждый из которых содержит 28 элементов со значением.

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

Я также могу торговать разным количеством предметов. Например, я могу обменять 6 предметов из списка 1 и 3 предмета из списка 2. Или я могу обменять 19 предметов из списка 1 и 22 предмета из списка 2. В большом пуле есть другие предметы, которые не являются частью списка Таким образом, если список получает более 28 элементов, самые низкие значения могут быть легко удалены, а если список содержит менее 28 элементов, можно легко добавлять новые элементы.

Однако есть одно ограничение: я могу торговать только с одним списком за раз. Например, я не могу торговать 3 предметами из списка 1 в список 2, торговать 3 предметами из списка 2 в список 3 и торговать 3 предметами из списка 3 в список 1. Когда я торгую из списка 1, я могу только торгуйте с одним другим списком одновременно.

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

Итак, мои вопросы таковы: грубое принуждение является возможным решением, а если нет, то каков пример алгоритма, который мог бы мне помочь?

Спасибо, Кшиш.

EDIT:

Пример:

List 1
[Apple - 12]
[Banana - 5]
[Orange - 8]

List 2
[Steak - 15]
[Chicken - 2]
[Fish - 7]

List 3
[Zebra - 20]
[Horse - 6]
[Elephant - 10]

Итак, я начну со списка 1. Вот что делает программа:

if (List1.Apple - List2.Steak < BestTradeAvailable) Then BestTradeAvailable = List1.Apple - List2.Steak
if (list1.Apple - List2.Chicken < BestTradeAvailable) Then BestTradeAvailable = list1.Apple - List2.Chicken
if (list1.Apple - list2.Fish < BestTradeAvailable) Then BestTradeAvailable = list1.Apple - list2.Fish
if (list1.Banana - List2.Steak < BestTradeAvailable) Then BestTradeAvailable = list1.Banana - List2.Steak
if (list1.Banana - List2.Chicken < BestTradeAvailable) Then BestTradeAvailable = list1.Banana - List2.Chicken
if (list1.Banana - List2.Fish < BestTradeAvailable) Then BestTradeAvailable = list1.Banana - List2.Fish

и т.д. Я также хочу сделать несколько предметов одновременно, так:

if (list1.Apple + list1.Banana - List2.Steak + List2.Chicken < BestTradeAvailable) Then BestTradeAvailable = list1.Apple + list1.Banana - List2.Steak + List2.Chicken

Но, как я уже говорил, вы можете обменять один предмет из списка 1 и 2 предмета из списка 2:

if (list1.Apple - List2.Steak + List2.Chicken < BestTradeAvailable) Then BestTradeAvailable = List1.Apple - List2.Steak + List2.Chicken

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

В этом примере лучшей сделкой будет обмен Apple + Orange на List3 для Zebra и Elephant, потому что эта сделка увеличивает общую стоимость List1 на наибольшую сумму.

Ответы [ 2 ]

0 голосов
/ 08 октября 2011

Решение по грубой силе потребовало бы только O (n ^ 2 * (m-1)) временной сложности, где n - количество элементов в списке, а m - количество списков.Если вы хотите найти все комбинации, это будет O (n ^ 2 * (n-1) * (m-1)) сложность времени, которая будет только 232848 комбинаций, которые вы должны попробовать.Или все комбинации есть!если заказ тоже важен.

0 голосов
/ 08 октября 2011

По сути вам нужно отсортировать списки и взять топ-28?

Приоритетные очереди будут работать.

...