Pyomo是一个基于Python的优化建模工具,可用于构建线性、非线性和混合整数优化模型。它提供了一组建模组件,可以通过不同的优化求解器进行求解,如GLPK、Cplex和Gurobi等。在本文中,我们将介绍Pyomo在生产规划、供应链管理、能源系统分析等方面的应用案例,并提供相应的代码和输出结果。
简单案例
from pyomo.environ import *
# 创建模型对象
model = ConcreteModel()
# 定义决策变量
model.x = Var(['A', 'B'], within=NonNegativeReals)
# 定义目标函数
model.profit = Objective(expr=6*model.x['A'] + 7*model.x['B'] - 3*model.x['A'] - 4*model.x['B'], sense=maximize)
# 定义约束条件
model.machine_constraint = Constraint(expr=1*model.x['A'] + 2*model.x['B'] <= 48)
model.time_constraint = Constraint(expr=1*model.x['A'] + 2*model.x['B'] <= 24)
model.x['A'].value = 0
model.x['B'].value = 0
# 求解模型
solver = SolverFactory('glpk')
solver.solve(model)
# 输出结果
print('Profit: ', model.profit())
print('x_A: ', model.x['A']())
print('x_B: ', model.x['B']())
Profit: 72.0
x_A: 24.0
x_B: 0.0
生产规划
from pyomo.environ import *
# 定义数据
products = ['prod1', 'prod2', 'prod3']
hours = ['hr1', 'hr2', 'hr3', 'hr4', 'hr5']
profit = {'prod1': 10, 'prod2': 6, 'prod3': 8}
time = {'prod1': [1, 2, 0, 3, 1], 'prod2': [2, 0, 1, 0, 2], 'prod3': [0, 1, 2, 2, 1]}
available_time = {'hr1': 8, 'hr2': 10, 'hr3': 7, 'hr4': 12, 'hr5': 8}
# 定义模型
model = ConcreteModel()
# 定义变量
model.x = Var(products, hours, within=NonNegativeIntegers)
# 定义目标函数
def obj_rule(model):
return sum(profit[p] * model.x[p, h] for p in products for h in hours)
model.obj = Objective(rule=obj_rule, sense=maximize)
# 定义约束条件
def time_rule(model, h):
return sum(time[p][i] * model.x[p, h] for p in products for i in range(5)) <= available_time[h]
model.time_constr = Constraint(hours, rule=time_rule)
# 求解模型
solver = SolverFactory('glpk')
solver.solve(model)
# 输出结果
for p in products:
for h in hours:
print(p, h, model.x[p, h].value)
print('Profit:', model.obj())
x[p,h]
来表示生产每个产品 p
在每个小时 h
中的数量,通过线性目标函数来最大化总利润,同时通过线性约束条件来限制每个小时生产时间的总和。prod1 hr1 1.0
prod1 hr2 0.0
prod1 hr3 1.0
prod1 hr4 1.0
prod1 hr5 1.0
prod2 hr1 0.0
prod2 hr2 2.0
prod2 hr3 0.0
prod2 hr4 1.0
prod2 hr5 0.0
prod3 hr1 0.0
prod3 hr2 0.0
prod3 hr3 0.0
prod3 hr4 0.0
prod3 hr5 0.0
Profit: 58.0
能源系统分析
from pyomo.environ import *
# 定义数据
sources = ['source1', 'source2', 'source3']
loads = ['load1', 'load2', 'load3']
cost = {'source1': 5, 'source2': 6, 'source3': 4}
capacity = {'source1': 100, 'source2': 150, 'source3': 120}
demand = {'load1': 80, 'load2': 70, 'load3': 90}
# 定义模型
model = ConcreteModel()
# 定义变量
model.x = Var(sources, loads, within=NonNegativeIntegers)
# 定义目标函数
def obj_rule(model):
return sum(cost[s] * model.x[s, l] for s in sources for l in loads)
model.obj = Objective(rule=obj_rule, sense=minimize)
# 定义约束条件
def demand_rule(model, l):
return sum(model.x[s, l] for s in sources) == demand[l]
model.demand_constr = Constraint(loads, rule=demand_rule)
def capacity_rule(model, s):
return sum(model.x[s, l] for l in loads) <= capacity[s]
model.capacity_constr = Constraint(sources, rule=capacity_rule)
# 求解模型
solver = SolverFactory('glpk')
solver.solve(model)
# 输出结果
for s in sources:
for l in loads:
print(s, l, 'Produced:', model.x[s, l].value)
print('Total Cost:', model.obj())
x[s,l]
来表示从每个能源来源 s
到每个负载 l
的传输量,通过线性目标函数来最小化总成本,同时通过线性约束条件来限制每个负载的需求量和每个能源来源的容量限制。source1 load1 Produced: 80.0
source1 load2 Produced: 20.0
source1 load3 Produced: 0.0
source2 load1 Produced: 0.0
source2 load2 Produced: 20.0
source2 load3 Produced: 0.0
source3 load1 Produced: 0.0
source3 load2 Produced: 30.0
source3 load3 Produced: 90.0
Total Cost: 1100
微信公众号后台回复
加群:加入全球华人OR|AI|DS社区硕博微信学术群
资料:免费获得大量运筹学相关学习资料
人才库:加入运筹精英人才库,获得独家职位推荐
电子书:免费获取平台小编独家创作的优化理论、运筹实践和数据科学电子书,持续更新中ing...
加入我们:加入「运筹OR帷幄」,参与内容创作平台运营
知识星球:加入「运筹OR帷幄」数据算法社区,免费参与每周「领读计划」、「行业inTalk」、「OR会客厅」等直播活动,与数百位签约大V进行在线交流
文章须知
文章作者:用户007
微信编辑:疑疑
文章转载自『Python学习杂记』公众号,原文链接:Pyomo:强大的优化建模工具库
关注我们
FOLLOW US