在纸浆中制定线性编程分配



所以,这是我要解决的上下文:

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

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

变量为二进制类型。

假设我将优化的解决方案作为:

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

这意味着公司A将负责单位成本X1和X4以及B公司的其余费用。

这很好,我都正确地在纸浆上编码了。我还可以使用约束来限制特定公司的最高成本,这是所有这些开始的重点。系数的总和代表给定项目的总成本。因此,我将该数量用作目标函数的限制,以限制公司的成本

现在,我想做的是3个或更多公司。我不知道如何制定目标函数或功能,因为我认为它可能属于多目标函数问题,但实际上我不确定。

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

我会放置代码,但是在创建功能之前,我有更多的变量和一些基本数据准备,因此我创建了一个假设的示例,以使其更容易理解。

非常感谢您的任何帮助。

您可以定义一个二进制变量:

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
...

最新更新