纸浆调度优化问题-一段时间内有多个供应输入

时间:2020-02-18 17:33:04

标签: python optimization linear-programming pulp

我目前正在制定纸浆调度计划,但是由于数据包含在多索引数据框中,因此我难以理解如何表示纸浆的供应变量。

问题 我正在尝试最小化任何增量,以使按工厂,按月的供应与需求匹配。请注意,并非所有工厂都生产必需的产品

当前电源数据

enter image description here

我知道纸浆接受变量字典作为输入,即:

LpVariable.dicts("Route",(plant, output)

但是我不确定如何将供应表示为:

(月,工厂,产品,生产产出)

任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

我认为您想要做的是拥有决策变量,即每个在每个工厂每种产品的供应量>。换句话说,您具有以下指数:(月,植物,产品)。

这当然将创建总共len(months)*len(plants)*len(products)个变量,在示例中为12 * 5 * 4 = 240个变量。

我会处理无法生产某种产品的工厂的情况,方法是将该工厂的产品的生产能力设置为零。

import pulp

months = range(1,12)
plants = ['A', 'B', 'C', 'D', 'E']
products = ['AFS', 'GDF', 'POD', 'PPI']

supply = pulp.LpVariable.dicts("supply", (months, plants, products))
print(supply)

这将返回可以引用的变量,例如:supply[3]['A']['POD']

答案 1 :(得分:1)

您可以将月份,工厂和产品的元组用作变量字典的键,也可以使用它从数据框中获取生产输出Mt。

import pulp

months = range(1,12)
plants = ['A', 'B', 'C', 'D', 'E']
products = ['AFS', 'GDF', 'POD', 'PPI']

# set up binary variables for plant-month-product
var_dict = {}
for month in months:
    for plant in plants:
        for product in product:
            combo = (month, plant, product)
            var_name = '_'.join([str(c) for c in combo])
            var_dict[combo] = LpVariable(var_name, cat=LpBinary)

prob = LpProblem('Schedule', LpMinimize)

# objective function
# assume data in df and has index of month, plant, and product
prob += lpSum([var * df.loc[('at', k), 'Production Output (Mt)']
               for k, v in var_dict.items()]

# then add the relevant constraints
# for example, one and only one product per plant per month
# remember that in var_dict the key is a tuple of month, plant, product
# and the value is the binary variable
for month in months:
    for plant in plants:
        prob += lpSum([v for k, v in var_dict.items()
                       if k[0] == month and k[1] == plant]) == 1