在纸浆中制定线性规划分配

时间:2018-03-26 11:31:21

标签: python linear-programming pulp

所以,这是我想要解决的问题的背景:

我想将成本单位划分为两个或更多公司。现在,我已经解决了两家具有以下目标功能的公司:

20*x1 + 30*x2 + 100*x3 + 20*x4 + 30*x5

变量为二进制类型。

假设我得到了优化的解决方案:

x1 = 1
x2 = 0
x3 = 0
x4 = 1
x5 = 0

这意味着A公司将负责单位成本x1和x4以及B公司的剩余成本。

这个工作正常,我已经正确编码了纸浆。我也可以使用约束来限制特定公司的最高成本,这是所有这一切的开始。系数的总和代表给定项目的总成本。因此,我使用该金额作为目标函数的约束来限制公司A的成本

现在,我想做的事情与3家或更多公司的做法相同。我不知道如何制定目标函数或函数,因为我认为它可能属于多目标函数问题,但我实际上并不确定。

我在线性规划方面不是很有经验,所以如果我错放了这个问题,我很抱歉。我还没有找到任何可以帮助我实现这一目标的东西。

我会把代码放进去,但是在创建函数之前我有更多的变量和一些基本的数据准备,所以我创建了一个假设的例子来让它更容易理解。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您可以按如下方式定义二进制变量:

x_{i,j} = 1 if Company i is responsible for Unit Cost j

并为每个单位成本j添加一个约束,告知一个公司必须对该成本负责 请考虑以下示例。

# data
companies = ["company1", "company2", ...]
products = ["prod1", "prod2", ...]
cost = {"prod1": cost1, "prod2": cost2, ...}

x = pulp.LpVariable.dicts("responsability",[(company, product) for company in companies for product in products], cat=pulp.LpBinary)    
prob = pulp.LpProblem("ilp", pulp.LpMinimize)

# objective function - assuming the cost is the same for all the companies
prob += pulp.LpSum(cost[product] * sum(x[(company, product)] for company in companies) for product in products)

# each product assigned to one company
for product in products:
   prob+= pulp.LpSum(x[(company, product)] for company in companies) == 1

# additional constraints
...