使用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
相关产品推荐
相关产品推荐

