python PuLP优化问题:将物品装入有限制的板条箱

bd1hkmkf  于 2022-12-21  发布在  Python
关注(0)|答案(1)|浏览(144)

我想在Python中的优化问题上得到一些帮助。
以下是一些背景:

  • 目标是在满足所需Unit_ids(u)的同时,使所需的Crates(c)的数目最小。
  • 每个板条箱包含任意数量(从0到inf)的不同类型的单位,每种单位的数量各不相同
  • 每个Unit_id都有一个需要从任意数量的板条箱中满足的需求......例如,如果需要Unit_id 123的10个物品,我们可以从板条箱A中获得所有10个物品,或者从板条箱X中获得2个物品,从板条箱Z中获得8个物品。为Unit_ID 123的10个物品选择板条箱取决于板条箱A与板条箱X和板条箱Z中存在的其他Unit_id的数量。
  • 有许多板条箱,但我们不需要每一个板条箱
Definitions:
Crates -> list of all crate_ids

Units -> list of all unit_ids

Unit_crates[u] -> keys are unit_ids, values are list of crates that contain unit u

Demand[u] -> keys are unit_ids, values are number units of demand required

Content[u][c] -> dictionary within dictionary, the number of a type of unit_id in a crate c


Code:

from pulp import *
import pandas as pd

Crates = [1, 2, 3, 4, 5]
Units = ['a', 'b', 'c', 'd']
Unit_crates = {'a': [1, 5], 'b': [1, 2], 'c': [1, 2, 3, 4],  'd': [2, 3, 4]}
Demand = { 'a': 2, 'b': 2, 'c': 4, 'd': 4}
Content = pd.DataFrame({'unit_id':['a','b','c','b','c','d','c','d','c','d','a'],'crate_id':[1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5],  'content':[1, 1, 1, 2, 2, 4, 3, 5,1,2,3]})
Content=(Content.groupby(['unit_id','crate_id']).agg(int).unstack(0).droplevel(0,1).agg(lambda x:dict(x.dropna())).to_dict())

Problem = LpProblem("Minimize_Number_of_Crates", LpMinimize)

Use = LpVariable.dicts('use', Crates, cat = 'Integer') 

Problem += lpSum(Use[c] for c in Crates) 

for u in Units:
   Problem += lpSum(Use[c] * Content[u][c] for c in Unit_crates[u]) >= Demand[u]

Problem.solve()
...

很难判断这是否真的按预期运行。而且,这只适用于将1个unit_id分配给一个crate_id ...它不能将1个unit_id分配给多个crate,这可能是也可能不是另一种将单位分配给crate的有效方式。

k5ifujac

k5ifujac1#

问题:
1.始终检查问题状态

print(f'Status: {LpStatus[Problem.status]}')

1.缺少打印解决方案

for c in Crates:
  v = value(Use[c])
    if v > 0.5: print(f'crate type {c}: {v}')
  1. Use应为非负数:
Use = LpVariable.dicts('use',  Crates, lowBound = 0, cat = 'Integer')

相关问题