2016-01-23 2 views
0

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

Question: Let there be a list of items, where number of items are greater 
than 10000. Each item has a value in between 0 and 1, and a price. Value and 
price are independent of each other. You must choose the cheapest 10 items 
where their average (or total) value is greater or equal than a given value. 

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

-Sort the list by price 
-Divide the list in 5 item chunks, reducing the brute 
force steps from 10000nCr10 to 2000nCr2. 

Очевидно, что это не даст истинное дешевое сочетания, но, надеюсь, достаточно близко? Я ценю любую помощь.

+0

но что «достаточно близко»? –

+0

Почему вы выбрали 10 предметов, которые составляют определенную сумму. вместо того, чтобы брать самые дешевые? если речь идет только о достижении определенной суммы, вы должны взглянуть на проблемы с упаковкой. –

+0

@ guillaumegirod-vitouchkina В этом случае достаточно близко будет означать любое достойное решение, которое бытовой процессор (~ 2 ГГц) может получить в ~ 5 минут. Я знаю, что это действительно расплывчато, но я не знаю, как количественно определить «достаточно близко». – cozkul

ответ

1

Вы можете решить эту проблему с помощью целочисленного линейного программирования. Пусть значение элемента i будет v [i] и его стоимость c [i]. Пусть x [i] - количество каждого купленного вами товара (который может принимать значения 0 или 1), а V - минимально приемлемое общее значение. Ограничение 0/1 на x [i] делает это целочисленной линейной программой, а не простой линейной программой.

Тогда вы хотите минимизировать сумму (c [i] * x [i]) такую, что сумма (v [i] * x [i])> = V и сумма (x [i]) = 10, что является проблемой правильной формы, которая должна быть решена как ИЛП.

Вот хороший открытый исходный код решатель: https://www.gnu.org/software/glpk/

+0

Быстрый поиск в Википедии заканчивается очень интересным чтением! Спасибо. – cozkul

+0

Хотя я не уверен, как сумма (x [i]) = 10 частей вписывается в эти типы проблем? И без этого ограничения проблема не будет сильно отличаться от того, как просто сортировать весь список с помощью «value/price» и продолжать выбирать их до тех пор, пока ваша сумма не будет равна = V – cozkul

+0

@cozkul. Ограничения равенства - это простое расширение теории LP/ILP и большинство решателей (включая GLPK) обрабатывают их изначально, но в случае их отсутствия: sum (x [i]) = 10 совпадает с суммой (x [i]) <= 10 и sum (x [i]) > = 10. Без ограничения решение по-прежнему не совпадает с жадным решением сортировки по стоимости/цене: например, с расходами 2, 2, 1.1 и значениями 2, 2, 1, и вы хотите 1 элемент с значение не менее 1. Жадность выберет один из предметов стоимости 2, тогда как оптимальным является выбор предмета со стоимостью 1.1. –

 Смежные вопросы

  • Нет связанных вопросов^_^