Pyomo中新增决策变量C:基于A总和递减startNum的约束实现咨询
Pyomo模型新增决策变量C的实现方案
步骤1:更新.dat数据文件
先在你的.dat文件中添加startNum参数:
set VALS := 1 2 3; param maxNum := 10000; param startNum := 500;
步骤2:修正基础模型的集合名称笔误
你的基础模型中集合定义为model.VALS,但变量A、B却引用了未定义的model.WEEKS,需统一改为model.VALS。
步骤3:新增参数、变量与约束
在模型中补充以下核心内容:
- 声明
startNum参数 - 新增决策变量C
- 编写约束规则,确保C的取值符合
startNum - 所有A值总和的逻辑
完整模型代码
from pyomo.environ import * # 创建模型实例 model = ConcreteModel() # 定义集合 model.VALS = Set() # 定义参数 model.maxNum = Param() model.startNum = Param() # 新增startNum参数 # 决策变量 model.A = Var(model.VALS, within=NonNegativeIntegers, bounds=(0, 100)) model.B = Var(model.VALS, within=NonNegativeIntegers, bounds=(100, 200)) model.C = Var(within=NonNegativeIntegers) # 新增决策变量C # 约束1:A+B总和不超过maxNum def maxNum_rule(model): return sum(model.A[t] + model.B[t] for t in model.VALS) <= model.maxNum model.maxNumCalc = Constraint(rule=maxNum_rule) # 约束2:C的取值规则 def C_calc_rule(model): return model.C == model.startNum - sum(model.A[t] for t in model.VALS) model.CCalc = Constraint(rule=C_calc_rule) # 目标函数:最大化A+B的总和 def objective_rule(model): return sum(model.A[t] + model.B[t] for t in model.VALS) model.maxNumObj = Objective(rule=objective_rule, sense=maximize) # 加载数据并求解(示例) data = DataPortal() data.load(filename='your_data_file.dat') model.load(data) # 创建求解器并求解 solver = SolverFactory('glpk') # 可按需更换求解器 result = solver.solve(model) # 打印结果 print("目标函数值:", model.maxNumObj()) print("C的值:", model.C()) for t in model.VALS: print(f"A[{t}] = {model.A[t]()}, B[{t}] = {model.B[t]()}")
关键说明
- 约束
C_calc_rule通过等式直接定义C的逻辑,完全匹配你要求的计算方式。 - 代码中给C添加了
NonNegativeIntegers的范围限制,避免当A值总和超过startNum时C出现负数,若不需要该限制可删除此参数。
内容的提问来源于stack exchange,提问作者r0bt
相关产品推荐
相关产品推荐

