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

如何在Python的Pulp中为电机优化添加OR约束

电机最优成本计算问题

参数与需求

  • 电机1:功率范围100-300(可选择停机,功率为0),单价5000
  • 电机2:功率范围400-1000(可选择停机,功率为0),单价5500
  • 电机3:功率范围50-250(可选择停机,功率为0),单价5250
  • 目标总功率:恰好600
  • 求满足条件的最低成本组合

错误尝试

直接在Pulp约束中使用or逻辑(如x >= 100 or x == 0),但该写法无法被线性规划求解器识别,导致约束失效。


正确实现方案

线性规划工具(包括Pulp)不支持直接处理or这类逻辑约束,需要通过二进制辅助变量将逻辑转化为线性约束。核心思路是给每个电机加一个“运行标记”变量(0=停机,1=运行),再通过约束限定:要么停机(功率为0),要么在额定功率范围内运行。

完整修正代码

from pulp import LpProblem, LpVariable, LpMinimize, LpBinary

def find_lowest_cost():
    # 定义问题:最小化成本
    problem = LpProblem("Motor Optimization", LpMinimize)

    # 决策变量:
    # 各电机的输出功率(整数)
    x = LpVariable("Motor1_Power", lowBound=0, cat='Integer')  # 初始下限设为0,后续通过约束限定范围
    y = LpVariable("Motor2_Power", lowBound=0, cat='Integer')
    z = LpVariable("Motor3_Power", lowBound=0, cat='Integer')
    
    # 各电机的运行标记(二进制:0=停机,1=运行)
    x_run = LpVariable("Motor1_Run", cat=LpBinary)
    y_run = LpVariable("Motor2_Run", cat=LpBinary)
    z_run = LpVariable("Motor3_Run", cat=LpBinary)

    # 目标函数:总成本 = 各电机功率 * 单价
    problem += x * 5000 + y * 5500 + z * 5250

    # 约束条件:
    # 电机1:要么停机(x=0),要么功率在100-300之间
    problem += x >= 100 * x_run
    problem += x <= 300 * x_run
    # 电机2:要么停机(y=0),要么功率在400-1000之间
    problem += y >= 400 * y_run
    problem += y <= 1000 * y_run
    # 电机3:要么停机(z=0),要么功率在50-250之间
    problem += z >= 50 * z_run
    problem += z <= 250 * z_run

    # 总功率约束:恰好600
    problem += x + y + z == 600

    # 求解问题
    problem.solve()

    # 提取结果
    lowest_cost = problem.objective.value()
    best_combination = (x.value(), y.value(), z.value())
    return lowest_cost, best_combination

cost, combination = find_lowest_cost()
print("最低成本:", cost)
print("电机功率组合:", combination)

约束逻辑说明

以电机1为例:

  • 当x_run=1(运行)时,约束变为x>=100和x<=300,符合额定功率范围
  • 当x_run=0(停机)时,约束变为x>=0和x<=0,即x=0,实现停机逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:55:01