【问题标题】:How to automatize the variables definition in PuLP如何自动化 PuLP 中的变量定义
【发布时间】:2020-06-25 01:16:24
【问题描述】:

我正在尝试在 PuLP自动化模型定义。 现在,我有以下模型:

import pulp as pl

" Cost parameters"
p1 = 200  # Cost per unit 1
p2 = 300  # Cost per unit 2

" VARIABLES"
k0101 = pl.LpVariable("k0101", 0, 1, pl.LpInteger) 
k0102 = pl.LpVariable("k0102", 0, 1, pl.LpInteger) 

k0201 = pl.LpVariable("k0201", 0, 1, pl.LpInteger) 
k0202 = pl.LpVariable("k0202", 0, 1, pl.LpInteger) 

###### DEMAND
x010101 = pl.LpVariable("x010101", lowBound = 0) 
x010102 = pl.LpVariable("x010102", lowBound = 0) 
x010103 = pl.LpVariable("x010103", lowBound = 0) 
x010104 = pl.LpVariable("x010104", lowBound = 0) 

x010201 = pl.LpVariable("x010201", lowBound = 0)
x010202 = pl.LpVariable("x010202", lowBound = 0)
x010203 = pl.LpVariable("x010203", lowBound = 0)
x010204 = pl.LpVariable("x010204", lowBound = 0)

x020101 = pl.LpVariable("x020101", lowBound = 0) 
x020102 = pl.LpVariable("x020102", lowBound = 0) 
x020103 = pl.LpVariable("x020103", lowBound = 0) 
x020104 = pl.LpVariable("x020104", lowBound = 0)

x020201 = pl.LpVariable("x020201", lowBound = 0) 
x020202 = pl.LpVariable("x020202", lowBound = 0) 
x020203 = pl.LpVariable("x020203", lowBound = 0) 
x020204 = pl.LpVariable("x020204", lowBound = 0) 

# Problem
z = pl.LpProblem("optimizator", pl.LpMinimize)

"OBJECTIVE FUNCTION"
z += ((p1) * (x010101 + x010102 + x010103 + x010104) + (p1) * (x010201 + x010202 + x010203 + x010204) + (p2) * (x020101 + x020102 + x020103 + x020104) + (p2) * (x020201 + x020202 + x020203 + x020204) + (p1) * (x010101 + x010102 + x010103 + x010104) + (p1) * (x010201 + x010202 + x010203 + x010204) + (p2) * (x020101 + x020102 + x020103 + x020104) + (p2) * (x020201 + x020202 + x020203 + x020204))

" CONSTRAINTS "
z += x010101 + x020101 >= 15 * k0101

" SOLUTION "
print(z)
estado = z.solve()
print(pl.LpStatus[estado]) 

"TOTAL COST:"
print(pl.value(z.objective))

我想简化这个变量的定义,以便能够在更简单的描述中定义更多的变量。

现在有谁可以将我的变量和参数定义为字典,并在目标函数和约束中考虑?

【问题讨论】:

  • variable_names = { "x010101", ..., "x020204" }; variables = { var: pl.LpVariable(var, lowBound = 0) for var in variable_names }
  • 你知道如何将它作为 for 包含在目标函数中吗?
  • 告诉我你的尝试。 :-)

标签: python optimization linear-programming pulp


【解决方案1】:

这将有助于更多地解释问题。现在写的目标函数有重复的术语,很难从概念上理解你试图最小化的内容。

话虽如此,您可以使用 lpSum 来表示变量 * 成本的总和。

# create the variables
k_variable_names = ('k0101', 'k0102', 'k0201', 'k0202')
k_variables = {var: pl.LpVariable(var, cat=pl.LpBinary)
               for var in k_variable_names}

x_variables_names = ('x010101' ...)
x_variables = {var: pl.LpVariable(var, lowBound=0)
               for var in x_variable_names}

# objective function
z += (
  lpSum([var * 2 * p1 for var_name, var in x_variables.items() if 'x010' in var_name]) +
  lpSum([var * 2 * p2 for var_name, var in x_variables.items() if 'x020' in var_name])

)

【讨论】:

猜你喜欢
  • 2020-05-25
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 2022-08-14
相关资源
最近更新 更多