繁体   English   中英

使用 PULP 进行需求优化计划

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM