PuLP: застрял с определением целевой функции - PullRequest
0 голосов
/ 17 марта 2020

Я первый раз пользуюсь PuLP и в последний раз, когда я занимался линейным программированием, Python не существовало. Я могу решить эту проблему с помощью расширения Solve LibreOffice (которое выполняет LP)

Но мне нужно сделать это в коде.

Я хочу оптимизировать проблему выбора акций. Нам нужно выбрать определенное количество винтов, скажем, 98. Винты упакованы в пачки по 25 и 100 штук. Я называю эти размеры пачек «25» и «100». Стоимость выбора должна быть минимизирована. За каждую упаковку взимается плата, а за избыточное количество взимается плата. Ограничение состоит в том, что выбранное количество> = target_qty

Например, если стоимость каждой единицы превышения составляла 0,1, а стоимость выбора пакета «25» была равна 1, а стоимость упаковки пакета «100» пачка 1.1., стоимость комплектации 1 x 100 пачка

(100 - 98) * .1 + 0 * 1 + 1 * 1.1

Это дешевле, чем комплектация 4 * Пакет 25

Предполагая, что существуют dicts pack_cost {} и pack_capacity {}, которые оба имеют имя пакета pack_name, например, pack_cost = {'25':1,'100':1.1} и, следовательно, list_of_pack_names = ['25','100']

Я пытаюсь это сделать:

lp_prob = pulp.LpProblem('PackSizes', pulp.LpMinimize)
packs_used = pulp.LpVariable.dicts("Packs",list_of_pack_names,lowBound=0,cat="Integer")
pack_cost = [pack_costs[pack_name]*packs_used[pack_name] for pack_name in list_of_pack_names]
excess_cost = cost_per_unit * ( sum([pack_sizes[pack_name]*packs_used[pack_name] for pack_name in list_of_pack_names])- original_qty)

lp_prob += pulp.lpSum(pack_cost) + pulp.lpSum(excess_cost)  #objective function

# and constraint: total picked >= needed
lp_prob +=   pulp.lpSum(sum([pack_sizes[pack_name]*packs_used[pack_name] for pack_name in list_of_pack_names]) >= target_qty)

Результаты:

 print("Status:",pulp.LpStatus[lp_prob.status])

показывает Оптимальный

lp_prob.objective равен 10*Packs_10 + 15*Packs_15 + 30*Packs_30 - 16.5

, но решение равно 0 для каждого размера упаковки

1 Ответ

1 голос
/ 17 марта 2020

Вы можете проверить свою проблему с помощью

print(lp_prob)

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

lp_prob += pulp.lpSum(sum([pack_sizes[pack_name]*packs_used[pack_name] for pack_name in list_of_pack_names])) >= target_qty
...