Подобная вам проблема похожа на классическую задачу коммивояжера, которая требует от продавца наиболее эффективного способа посещения списка городов.Разница в том, что вполне возможно, что вам не понадобится каждый автомобиль, чтобы заполнить баржу, тогда как продавец должен посетить каждый город.Но проблема похожа.Грубым способом решения этой проблемы является исследование каждой возможной комбинации автомобилей, от 1 до 10 автомобилей. Мы будем считать, что допустимо иметь любое количество каждого автомобиля (т. Е. Если автомобиль 2 является Ford Focus, выможет быть три форд фочи).Однако это легко изменить, если список автомобилей представляет собой точный список конкретных автомобилей, и вы можете использовать только 1 из них.
Теперь это быстро начинает занимать много времени.По мере того, как количество автомобилей увеличивается, количество возможных комбинаций автомобилей увеличивается геометрически, что означает, что при меньшем количестве, чем вы ожидаете, для запуска программы потребуется больше времени, чем в вашей жизни.Тем не менее, 10 должны быть управляемыми (получается чуть более 700 000 комбинаций, или 1024, если вы можете иметь только один из каждого предмета).
Прежде всего необходимо определить вес каждого автомобиля имаксимальный вес, который может выдержать баржа.
weights = [1, 2, 1, 3, 1, 2, 2, 4, 1, 2, 2]
capacity = 8
Теперь нам нужен способ найти каждую возможную комбинацию.Модуль Python itertools
имеет функцию, которая даст нам каждую комбинацию заданной длины, но мы хотим, чтобы все длины.Итак, мы напишем один цикл, который идет от 1 до 10 и вызывает itertools.combinations_with_replacement
для каждой длины.Затем мы можем узнать общий вес каждой комбинации, и если он будет больше, чем какой-либо вес, который мы уже нашли, но все еще в пределах емкости, мы запомним его как лучший из найденных нами.
Единственный реальный трюк в том, что нам не нужны комбинации весов - нам нужны комбинации индексов весов, потому что в конце мы хотим знать, какие машины ставить на баржу, а не их вес.Так что combinations_with_replacements(range(10), ...)
, а не combinations_with_replacements(weights, ...)
.Внутри цикла вы захотите получить вес каждого автомобиля в комбинации с weights[i]
, чтобы подвести его.
У меня изначально был код, но я его снял, так как это домашняя работа.:-) (Первоначально он не был помечен как таковой, но я должен был знать - я виноват в изменении времени.)
Если вы хотите разрешить только одну машину, вы должны использовать itertools.combinations
вместо combinations_with_replacement
.
Возможен ярлык, поскольку в другом месте вы упоминаете, что автомобили весят от 1 до 2 тонн.Это означает, что вы знаете , вам понадобится как минимум 4 из них (4 * 2 = 8), поэтому вы можете пропустить все комбинации из 1-3 машин.Тем не менее, это не будет обобщать, если проф изменил параметры на вас.