【问题标题】:Is there a faster way to define variables using pulp for linear programming?有没有一种更快的方法来使用纸浆进行线性规划来定义变量?
【发布时间】:2021-08-19 00:37:58
【问题描述】:

我试图建立一个涉及 3 个工厂和 4 个配送中心的线性规划问题。目标是最大限度地降低成本,但每个工厂配送中心组合都有不同的相关成本。

有没有更好的方法来使用纸浆或其他库创建变量,这样我就不必写那么多了。 目前我的看起来像这样。

from pulp import *  
#define the problem   
prob=LpProblem('transportation', LpMinimize)  
#create Variables  
plant1_center1 = LpVariable('plant1_center1', lowBound=0, cat='Integer')       
plant1_center2 = LpVariable('plant1_center2', lowBound=0, cat='Integer')  
plant1_center3 = LpVariable('plant1_center3', lowBound=0, cat='Integer')  
plant1_center4 = LpVariable('plant1_center4', lowBound=0, cat='Integer')  
plant2_center1 = LpVariable('plant2_center1', lowBound=0, cat='Integer')  
plant2_center2 = LpVariable('plant2_center2', lowBound=0, cat='Integer')   
plant2_center3 = LpVariable('plant2_center3', lowBound=0, cat='Integer')   
plant2_center4 = LpVariable('plant2_center4', lowBound=0, cat='Integer')   
plant3_center1 = LpVariable('plant3_center1', lowBound=0, cat='Integer')   
plant3_center2 = LpVariable('plant3_center2', lowBound=0, cat='Integer')   
plant3_center3 = LpVariable('plant3_center3', lowBound=0, cat='Integer')   
plant3_center4 = LpVariable('plant3_center4', lowBound=0, cat='Integer')  

它有效,但我讨厌每次都必须创建这样的变量。

【问题讨论】:

  • 您可以在字典中添加所有变量{'plant{}_center_{}'.format(p,c):LpVariable('plant3_center4', lowBound=0, cat='Integer') for p in range(1,5) for c in range(1,5)}
  • @Nagakiran 好建议,不过我认为应该是{f'plant{p}_center_{c}': LpVariable(f'plant{p}_center{c}', lowBound=0, cat='Integer') for p in range(1,4) for c in range(1,5)}

标签: python variables pulp


【解决方案1】:

如何对行(植物)和列(配送中心)使用字符串插值和几个循环:

from pulp import *

def make_var(i, j):
    return LpVariable(f"plant{i}_center{j}", lowBound=0, cat="Integer")

n_plants = 3
n_dist_centers = 4
prob = LpProblem("transportation", LpMinimize)
plants = [
    [make_var(i, j) for j in range(n_dist_centers)] 
    for i in range(n_plants)
]

for row in plants:
    print(row)

我已对其进行了零索引,因此您可以使用 plants[plant_number][dist_center_number] 访问特定的 plant,但如果您需要使用 range(1, n_plants + 1),您应该能够轻松地对其进行 1 索引。

请参阅A Transportation Problem,它提供了您可以尝试的类似模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    相关资源
    最近更新 更多