[英]Demand optimization planning using PULP
需要帮助解决工厂的需求优化计划。 工厂有可以生产一种或多种产品的机器。 每个产品需要时间来制造 1 个单位,这被称为“周期时间”。 因此,在循环时间为 5 的机器上制造 10 个产品/组件,总共需要 5*10=50 秒。 并非所有产品都可以在所有机器上生产。 因此,我们需要在有效的机器上以最有效的方式生产产品。 此外,每台机器都有一个可用性限制(以秒为单位),我们不能 go 超过它。
我们需要做的是:
如果我们能够使用方程式作为约束来解决这个问题(例如 model += ( x 1 * 0.055555555555556 <= 10000, "material_300005551211-2" )),我也很高兴。 但目前无法这样做。
样本数据:
我尝试优化 PULP,但这种方法无法正常工作 - 例如,如果需求太高,它不会最大程度地达到机器可用性的极限,但不确定我哪里出错了。
import pandas as pd
import pulp
factories = pd.read_csv('factory_machines_small.csv', index_col=['Component', 'Machine'])
print(factories)
demand = pd.read_csv('component_demand_small.csv', index_col=['Component'])
print(demand)
production = pulp.LpVariable.dicts("production",
((component, machine) for component, machine in factories.index),
lowBound=0,
#upBound=1,
cat='Integer')
factory_status = pulp.LpVariable.dicts("factory_status",
((component, machine) for component, machine in factories.index),
cat='Binary')
model = pulp.LpProblem("Cost minimising scheduling problem", pulp.LpMinimize)
model += pulp.lpSum(
[production[component, machine] * factories.loc[(component, machine), 'Cycle_Time'] for component, machine in factories.index]
)
# Production in any month must be equal to demand
components = demand.index
for component in components :
model += production[(component, 'IP01')] + production[(component, 'IP02')] + production[(component, 'IP03')] \
+ production[(component, 'IP04')] + production[(component, 'IP05')] == demand.loc[component, 'Demand']
# Production in any month must be between minimum and maximum capacity, or zero.
for component, machine in factories.index:
min_production = factories.loc[(component, machine), 'Min_Capacity']
max_production = factories.loc[(component, machine), 'Max_Capacity']
model += production[(component, machine)] >= min_production * factory_status[component, machine]
model += production[(component, machine)] <= max_production * factory_status[component, machine]
model.solve()
print(pulp.LpStatus[model.status])
output = []
for component, machine in production:
var_output = {
'Component': component,
'Machine': machine,
'Production': production[(component, machine)].varValue,
'Machine Status': factory_status[(component, machine)].varValue
}
output.append(var_output)
#print(output)
output_df = pd.DataFrame.from_records(output).sort_values(['Component', 'Machine'])
output_df.set_index(['Component', 'Machine'], inplace=True)
print(output_df)
output_df.to_csv('OUTPUT.csv')
# Print our objective function value (Total Costs)
print (pulp.value(model.objective))
首先要做的就是去掉production[(component, 'IP01')]+production[(component, 'IP02')]+production[(component, 'IP03')]+production[(component, 'IP04')]+production[(component, 'IP05')]
。 我希望你意识到这种硬编码有多么糟糕。 这仅适用于只有机器 IP01..IP05 的情况。 事实上,对于示例数据,情况并非如此。 你需要使这个数据驱动。 我们有一个sum
结构。
对于 model 短缺,供需约束的 rhs 需要变为
生产 == 需求 - 短缺
其中shortage
是一个额外的非负变量。 您还需要为此变量的目标添加成本项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.