You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 22:33:19