Cplex共享单车再平衡问题:如何约束调度车首站为缺车/溢出站
约束实现方案
你当前写的带if判断的赋值逻辑不能直接用于CPLEX约束块,因为e[i]作为决策变量,无法在约束定义阶段直接用条件判断赋值,需要通过大M法线性化0-1变量的逻辑关系,再补充首站的关联约束,具体实现步骤如下:
步骤1:定义大M参数
取足够大的正整数M,取值大于所有站点的最大可容纳车辆数即可,示例:int M = max(i in stations) cap[i] * 2; 其中cap[i]为站点i的最大容量。
步骤2:线性化sSurplus、sShortage的定义约束
因为车辆数为整数,可直接用如下约束实现你想要的判断逻辑:
// 溢出站点标记:sSurplus[i]=1 当且仅当 e[i] > U[i] forall(i in stations) { e[i] - U[i] <= M * sSurplus[i]; e[i] - U[i] >= 1 - M * (1 - sSurplus[i]); } // 缺车站点标记:sShortage[i]=1 当且仅当 e[i] < L[i] forall(i in stations) { L[i] - e[i] <= M * sShortage[i]; L[i] - e[i] >= 1 - M * (1 - sShortage[i]); } // 可选补充:同一站点不能同时溢出和缺车 forall(i in stations) { sSurplus[i] + sShortage[i] <= 1; }
步骤3:补充首站约束
新增如下约束,保证首个停靠站点必须是溢出或缺车站点:
forall(i in stations) { firstStation[i] <= sSurplus[i] + sShortage[i]; }
逻辑说明:如果站点i是首个停靠站(
firstStation[i]=1),则必须满足sSurplus[i] + sShortage[i] >=1,也就是该站点要么溢出要么缺车,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Bernardo Martins
相关产品推荐
相关产品推荐

