如何使用Pyomo求解指定线性优化问题?附数据与约束模型
使用Pyomo求解线性规划问题
前置准备
首先确保安装Pyomo和线性求解器(比如GLPK或CBC),可以通过以下命令安装:
pip install pyomo # 安装GLPK求解器(Windows环境示例,其他系统可参考Pyomo官方文档调整) pip install glpk
完整代码实现
import pyomo.environ as pyo import pandas as pd # 加载用户提供的DataFrame d = {'Doctors': [20, 19,25], 'Nurses': [151, 131,160],'Outpatients':[100,150,160],'Inpatients':[90,50,55]} df = pd.DataFrame(data=d) # 创建Pyomo模型实例 model = pyo.ConcreteModel() # 定义决策变量:v1、v2、u1、u2,均满足非负约束 model.v1 = pyo.Var(within=pyo.NonNegativeReals) model.v2 = pyo.Var(within=pyo.NonNegativeReals) model.u1 = pyo.Var(within=pyo.NonNegativeReals) model.u2 = pyo.Var(within=pyo.NonNegativeReals) # 定义目标函数:最大化100u1 + 90u2 model.obj = pyo.Objective(expr=100*model.u1 + 90*model.u2, sense=pyo.maximize) # 定义约束条件 # 第一个等式约束 model.const_eq = pyo.Constraint(expr=20*model.v1 + 151*model.v2 == 1) # 批量生成三个不等式约束(基于DataFrame的行数据) model.constraints = pyo.ConstraintList() for _, row in df.iterrows(): lhs = row['Outpatients']*model.u1 + row['Inpatients']*model.u2 rhs = row['Doctors']*model.v1 + row['Nurses']*model.v2 model.constraints.add(expr=lhs - rhs <= 0) # 调用求解器求解 solver = pyo.SolverFactory('glpk') result = solver.solve(model) # 输出求解结果 print("求解状态:", result.solver.status) print("最优目标函数值:", pyo.value(model.obj)) print("最优变量取值:") print(f"v1 = {pyo.value(model.v1):.4f}") print(f"v2 = {pyo.value(model.v2):.4f}") print(f"u1 = {pyo.value(model.u1):.4f}") print(f"u2 = {pyo.value(model.u2):.4f}")
关键说明
- 变量约束:通过
within=pyo.NonNegativeReals直接限定变量非负,贴合问题要求。 - 约束批量生成:利用DataFrame循环遍历生成不等式约束,避免重复编写代码,适配数据行数变化。
- 求解器替换:示例使用GLPK,也可替换为CBC、Gurobi等其他线性求解器(需提前安装对应工具)。
内容的提问来源于stack exchange,提问作者Reza
相关产品推荐
相关产品推荐

