是否存在可最小化未乘车人数的人员与出租车最优匹配算法?
存在可以最小化未乘车人数的最优匹配算法,你的场景属于典型的带容量约束的二分图最大匹配问题,有成熟的工业级解法可以保证得到全局最优结果。
问题建模
你可以直接把场景映射为标准的图论模型:
- 二分图左侧为10名乘客节点,每个节点最多匹配1次(1个乘客只能坐1辆车)
- 二分图右侧为5辆出租车节点,每个节点最多匹配3次(1辆车最多载3人)
- 乘客和出租车之间存在连接边,当且仅当该乘客选择了对应出租车
你要的「最小化未乘车人数」等价于求这个二分图的最大容量匹配,匹配的总规模就是最多可乘车的乘客数。
现有贪心方案的局限性
你当前用的「按顺序遍历乘客,分配到第一辆有空位的可选出租车」的贪心策略无法保证得到最优解,举个极简反例:
场景:2名乘客A、B,2辆出租车1、2,每辆车容量1。乘客A可选车辆为[1,2],乘客B仅可选车辆为[1]。
按你的贪心策略如果先遍历A,A会占用车辆1,B无车可坐,总乘车人数为1;最优分配方案是A坐2、B坐1,总乘车人数为2,两者结果有明显差距。
这类问题的贪心策略很容易出现「可选范围大的乘客挤占了仅能选择特定车辆的乘客的名额」的情况,最终整体乘车人数远低于最优值。
可选的最优算法
有两种成熟的算法可以直接实现你的需求:
- 最大流解法:将上述二分图转换为单源单汇的流网络求解,步骤非常固定:
- 新增虚拟源点S、虚拟汇点T
- 源点S向所有乘客节点连边,边容量为1
- 所有出租车节点向汇点T连边,边容量为3
- 乘客和自己选定的出租车之间连边,边容量为1
- 求解S到T的最大流,流的大小就是最多可乘车的人数,顺着有流量的边就能得到完整的分配方案
你这个规模的场景用Dinic、ISAP等常见最大流算法都能毫秒级出结果,实现逻辑非常通用。
- 带容量扩展的匈牙利算法:在标准匈牙利算法的基础上修改右侧节点的最大匹配上限为3即可,适合不想额外搭建流网络的场景,求解效率同样很高。
内容的提问来源于stack exchange,提问作者Nick Pap
相关产品推荐
相关产品推荐

