Я думаю, что вижу, чего вы пытаетесь достичь, поэтому я завершил часть того, что вы ищете, а оставляю остальное, чтобы вы сами определились.Кажется, что самой сложной частью этой проблемы является разумное распределение нагрузки, чтобы максимизировать пространство для грузовика.Разделить вещи не проблема, но это не так просто, как просто проверить, если нагрузка меньше 30 000.
Во-первых, метод интеллектуального распределения нагрузок между грузовиками:
def build_trucks(sorted_loads):
load_copy = np.array(sorted_loads)
truck_max = 30000
# check if any loads are > truck_max and split them into bins that sum to the load
while len(load_copy) > 0:
truck = []
truck_load = 0
for i, load in enumerate(load_copy):
if truck_load + load <= truck_max:
truck.append(i)
truck_load += load
yield load_copy[truck]
load_copy = np.delete(load_copy, truck)
Вы не упомянули, начнутся ли какие-либо нагрузки как более 30000, так что я ушел, но не неполнымЭто само по себе было бы интересной проблемой (разбить 45 000 на две нагрузки: 30 000 и 15 000, и 65 000 на две 30 000 и 5 000).Я проверил это по нескольким тестам, включая ваш:
print(list(build_trucks(np.array([20000, 8000, 5000]))))
print(list(build_trucks(np.array([30000, 28000, 4000, 2000]))))
print(list(build_trucks(np.array([20000, 18000, 13000]))))
print(list(build_trucks(sorted(np.array([25000, 1000, 1000, 4000, 5500]), reverse=True))))
, который выводит:
[array([20000, 8000]), array([5000])]
[array([30000]), array([28000, 2000]), array([4000])]
[array([20000]), array([18000]), array([13000])]
[array([25000, 4000, 1000]), array([5500, 1000])]
Чтобы посмотреть, как это происходит, я запустил:
grp = data.groupby('zip')
for i, g in grp:
print(g.sort_values('pounds', ascending=False))
print()
print(list(build_trucks(g['pounds'])))
print()
где data
- это DataFrame исходных данных, которые вы предоставили.Надеемся, что остальная часть проблемы станет очевидной для вас.Если нет, не стесняйтесь спрашивать, и я сделаю все возможное, чтобы помочь (я оставил многое из этого неполным, потому что это большая проблема для вас, однако я не хотел тратить на это слишком много своего собственного времени).Вероятно, есть много способов сделать это, это первый способ, который я увидел.Я также подумал о рекурсивном способе сделать это. Может быть, а может и не быть эффективным.