我想在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的有效方式。
1条答案
按热度按时间k5ifujac1#
问题:
1.始终检查问题状态
1.缺少打印解决方案
Use
应为非负数: