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

Gurobi机场航班起降约束未生效问题技术问询

单机场每小时起降航班数约束未生效的排查与修复

1. 先修正阈值错误

代码里所有约束的上限写的是3,但需求是单机场每小时处理5架次,这是明显的数值错误——先把所有<= 3改成<= 5,这是基础修正项。

2. 排查约束逻辑的核心问题

起飞航班约束(Atk系列)

看你的起飞约束逻辑:

gp.quicksum(xf[f, t + tf[f]] for f in F if (t + tf[f] <= 96) and af[f] == k)

要确认三个关键点:

  • af[f]是否确实是航班f的起飞机场?如果变量定义搞反了,约束就会绑错机场。
  • t + tf[f]是否是航班f的实际起飞时段?如果tf[f]是航班的准备时长,那你得确认这个时段计算是否和模型里的起飞时间定义一致——比如如果t是航班的计划生成时段,加上准备时间才是实际起飞时段,那逻辑没问题;但如果t本身就是起飞时段,那这里的t + tf[f]就完全错了。
  • 有没有漏掉航班?比如部分航班的t + tf[f]超过96被排除,但如果这些航班的实际起飞时段其实在T范围内,那约束就没覆盖到这些航班。

降落航班约束(Dtk系列)

降落约束的逻辑:

gp.quicksum(xf[f, t] for f in F if df[f] == k)

这里最容易踩坑的是变量定义:

  • xf[f,t]如果代表的是航班f在时段t起飞,那你用它来统计降落航班数就完全错了!得确认是否有专门的降落变量(比如xf_land[f,t]),或者xf的第二个维度是否是降落时段。
  • df[f]是否是航班f的降落机场?同样要核对变量定义,别搞反起飞/降落机场的标识。

3. 场景变量(Omega)的约束检查

针对yfOmega的约束,和上面的逻辑一致:

  • 确认yfOmega[f, t + tf[f], omega]是否对应场景omega下航班f的实际起飞时段。
  • 确认yfOmega[f, t, omega]是否对应场景omega下航班f的实际降落时段。

4. 验证约束是否生效的实用技巧

  • 给每个约束加上name参数(比如示例里的name=f"Atk_{k}_{t}"),这样求解后如果有约束违反,能直接定位到具体的机场、时段和约束类型。
  • 求解前,随机选几个机场和时段,打印约束的表达式和上限,确认统计的航班范围是否正确。
  • 求解后,输出所有违反起降上限的机场和时段的实际航班数,对比约束的逻辑,看是约束没覆盖到这些航班,还是变量统计错了。

修改后的代码示例(修正阈值+添加约束名称)

# 起飞航班约束:单机场每小时起飞≤5
for t in T:
    for k in A:
        model.addConstr(
            gp.quicksum(xf[f, t + tf[f]] for f in F if (t + tf[f] <= 96) and af[f] == k) 
            <= 5, 
            name=f"Atk_{k}_{t}"
        )

# 降落航班约束:单机场每小时降落≤5
for t in T:
    for k in A:
        model.addConstr(
            gp.quicksum(xf[f, t] for f in F if df[f] == k) 
            <= 5, 
            name=f"Dtk_{k}_{t}"
        )

# 场景omega下的起飞约束
for omega in Omega:
    for t in T:
        for k in A:
            model.addConstr(
                gp.quicksum(yfOmega[f, t + tf[f], omega] for f in F if t + tf[f] <= 96 and af[f] == k) 
                <= 5, 
                name=f"AtkOmega_{k}_{t}_{omega}"
            )

# 场景omega下的降落约束
for omega in Omega:
    for t in T:
        for k in A:
            model.addConstr(
                gp.quicksum(yfOmega[f, t, omega] for f in F if df[f] == k) 
                <= 5, 
                name=f"DtkOmega_{k}_{t}_{omega}"
            )

内容的提问来源于stack exchange,提问作者Berk Bozdağ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:53:17