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

使用Python Pulp实现含航段运力约束的行程收益最大化优化

解决Pulp中添加航段运力约束的方法

首先假设你的辅助表格leg_capacity_df包含两列:Leg(航段名称)和Capacity(对应运力),我们可以按以下步骤添加约束:

步骤1:整理所有涉及的航段

先从base表的Leg1和Leg2列中提取所有唯一航段,确保覆盖所有需要约束的航段:

# 获取所有唯一航段
all_legs = pd.concat([base['Leg1'], base['Leg2']]).unique()

步骤2:为每个航段添加运力约束

遍历每个航段,找到所有使用该航段的行程(无论是作为Leg1还是Leg2),然后对这些行程对应的乘客变量求和,约束其不超过该航段的运力:

# 遍历每个航段
for leg in all_legs:
    # 找到所有包含该航段的行程索引
    leg_indices = base[(base['Leg1'] == leg) | (base['Leg2'] == leg)].index
    # 提取对应变量
    leg_vars = [xs[i] for i in leg_indices]
    # 获取该航段的运力
    leg_capacity = leg_capacity_df[leg_capacity_df['Leg'] == leg]['Capacity'].values[0]
    # 添加约束
    prob += lp.lpSum(leg_vars) <= leg_capacity, f"Leg_{leg}_Capacity_Constraint"

完整代码示例

把约束添加到现有代码中,完整代码如下:

import pulp as lp
import pandas as pd

# 假设base和leg_capacity_df已提前加载
prob = lp.LpProblem("testproblem", lp.LpMaximize)

# 定义变量:修正原代码upBound为Demand,符合需求约束
xs = [lp.LpVariable(f"Passengers_{i+1}", lowBound=0, upBound=base.loc[i,'Demand']) for i in range(len(base))]

# 目标函数:最大化总收益
prob += lp.lpSum(x * price for x, price in zip(xs, base["Price"])), "Total_Revenue"

# 添加航段运力约束
all_legs = pd.concat([base['Leg1'], base['Leg2']]).unique()
for leg in all_legs:
    leg_indices = base[(base['Leg1'] == leg) | (base['Leg2'] == leg)].index
    leg_vars = [xs[i] for i in leg_indices]
    leg_capacity = leg_capacity_df[leg_capacity_df['Leg'] == leg]['Capacity'].values[0]
    prob += lp.lpSum(leg_vars) <= leg_capacity, f"Constraint_Leg_{leg}"

# 求解模型
prob.solve()

# 输出结果
for var in xs:
    print(f"{var.name}: {var.varValue}")
print(f"总收益: {lp.value(prob.objective)}")

注意事项

  • 原代码中变量的upBound用的是Capacity,根据问题描述的需求约束,应改为Demand,确保每条行程乘客数不超过对应Demand值。
  • 如果leg_capacity_df中存在航段重复,建议先做去重处理,避免重复添加约束或获取错误运力值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 05:25:57