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

基于Pyomo的MINLP优化未达预期最大化问题咨询

生产优化模型问题与改进方案

决策变量

  • X:二进制变量,标记是否生产某产品(共10种产品)
  • Y:各产品的生产工时,需满足单产品最大工时约束

目标函数

期望最大化二进制变量X与产品优先级(urgency)的乘积之和,以此选中最紧急的产品并尽可能多生产。

约束条件

  1. 总生产工时 ≤ 35小时(因未来可能出现单产品最大工时总和不足35的情况,不使用等式约束)
  2. 优先满负荷生产单个产品,而非少量生产多个产品(暂未加入约束)
  3. 单个产品生产工时 ≤ 其最大允许工时(max_hours)

当前问题

模型未实现预期效果:未选中最紧急产品并满负荷生产,总工时也未接近或达到35小时,需确认建模正确性并获取优化建议。

现有代码

# import pyomo.environ as pyo
from pyomo.environ import *
from pyomo.opt import SolverFactory

line=[3]
product=[1,2,3,4,5,6,7,8,9,10]

data={3: {1: {'urgency': 0.0, 'max_hours': 0},
  2: {'urgency': 0.0, 'max_hours': 0},
  3: {'urgency': 0.36, 'max_hours': 5},
  4: {'urgency': 0.23, 'max_hours': 2},
  5: {'urgency': 0.32, 'max_hours': 6},
  6: {'urgency': 0.67, 'max_hours': 10},
  7: {'urgency': 10, 'max_hours': 22},
  8: {'urgency': 0.73, 'max_hours': 4},
  9: {'urgency': 0.81, 'max_hours': 3},
  10: {'urgency': 0.43,  'max_hours': 4}}}

model = pyo.ConcreteModel()

model.x = pyo.Var(line,product, domain=pyo.Binary)
model.y = pyo.Var(line,product, within=Integers, bounds=(0,None))

model.cost = pyo.Objective(expr = sum([model.x[l,p]*data[l][p]['urgency'] for l in [3] for p in product]),sense=maximize)

model.c3 = pyo.Constraint(expr =sum(model.x[l,p]*model.y[l,p] for l in [3] for p in product)<=35)

model.constraint_prod = pyo.ConstraintList()
for l in [3]:
    for p in product:
        model.constraint_prod.add(expr=data[l][p]['max_hours']>=model.x[l,p]*model.y[l,p])
        

solver = SolverFactory('bonmin', executable='/libraries/Default_env_39400/bin/bonmin')
solver.solve(model)
model.pprint()

建模问题分析与改进方案

核心问题

  1. 目标函数无生产激励:当前目标仅最大化X*urgency的和,模型只需让高优先级产品的X=1即可达到最优,完全没有动力去提高Y(生产工时)——比如产品7的urgency=10,只要X7=1,不管Y7取1还是22,目标值都是10。
  2. X与Y约束关联缺失:现有约束允许X=1时Y=0(选中产品却不生产),也未限制X=0时Y必须为0,可能出现无效解。
  3. 未体现“优先满负荷单产品”规则:没有约束支撑该需求,模型可能分散生产多个低工时产品。

具体改进措施

1. 修改目标函数,加入生产激励

将目标调整为优先级加权的总生产工时,让模型在选中高优先级产品后,有动力尽可能多生产:

# 优化后的目标函数:最大化优先级×生产工时的总和
model.cost = pyo.Objective(
    expr = sum(model.x[l,p] * data[l][p]['urgency'] * model.y[l,p] for l in line for p in product),
    sense=maximize
)

此时,生产的工时越多、产品优先级越高,目标值越大,模型会自然倾向满负荷生产高优先级产品。

2. 修正X与Y的约束关联

  • 强制X=0时Y=0,避免无效解
  • 明确X=1时Y的取值范围(至少生产1单位工时,或直接强制满负荷)
# 替换原单产品工时约束:同时实现X=0时Y=0,以及X=1时Y≤max_hours
model.constraint_prod = pyo.ConstraintList()
for l in line:
    for p in product:
        model.constraint_prod.add(expr=model.y[l,p] <= model.x[l,p] * data[l][p]['max_hours'])
        # 可选:强制选中产品至少生产1工时
        # model.constraint_prod.add(expr=model.y[l,p] >= model.x[l,p] * 1)

# 如果需求是选中产品必须满负荷生产,直接替换为:
# model.constraint_prod.add(expr=model.y[l,p] == model.x[l,p] * data[l][p]['max_hours'])

3. 强化“优先满负荷单产品”的逻辑

如果需要严格保证先满负荷生产高优先级产品,再考虑下一个,可以通过优先级约束实现:

# 按优先级降序排列产品
sorted_products = sorted(product, key=lambda p: -data[3][p]['urgency'])

model.full_prod = pyo.Var(line, product, domain=pyo.Binary)  # 标记产品是否已满负荷生产

model.constraint_priority = pyo.ConstraintList()
for l in line:
    for i in range(len(sorted_products)-1):
        high_p = sorted_products[i]
        low_p = sorted_products[i+1]
        # 若高优先级产品未满负荷,则低优先级产品不能生产
        model.constraint_priority.add(expr=model.x[l, low_p] <= model.full_prod[l, high_p])
        # 满负荷生产则标记为1
        model.constraint_priority.add(expr=model.y[l, high_p] >= data[l][high_p]['max_hours'] * model.full_prod[l, high_p])

若使用优化后的目标函数,模型会自然优先分配工时给高优先级产品,多数情况下无需额外约束即可满足需求。

4. 变量类型优化

如果生产工时允许非整数,将Y的within=Integers改为within=NonNegativeReals,降低模型复杂度,提升求解效率。

改进后效果验证

调整后模型会:

  1. 优先选中优先级最高的产品(如产品7,urgency=10)并满负荷生产(Y7=22)
  2. 剩余工时(35-22=13小时)会分配给下一个优先级最高且能容纳剩余工时的产品(如产品6满负荷10小时,剩余3小时分配给产品9)
    最终总工时会接近35小时,符合预期需求。

内容的提问来源于stack exchange,提问作者Jeffin Jacob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 06:04:58