请教一个算法问题,给学生分配校车乘车路线

11 天前
 ivae

需要给学生分配校车乘车路线

if __name__ == '__main__':
    #每路车剩下的空位
    line_left_Num = {
        '5 路':6,
        '6 路':11,
        '9 路': 4,
        '10 路': 9,
        '11 路': 18,
        '12 路': 21,
        '17 路': 36,
        '18 路': 41,
        '21 路': 6,
        '60 路': 20
    }
    # 每个站点还需要分配的学生人数
    site_stu_num = {
        '江山里澜湾小区':21,
        '赞贤路小学、中航云府(赣康路)':30,
        '登峰大道中(城市家园)':7,
        '中海滨江壹号':13,
        '中海国际东郡 B 区(南康路)':30,
        '登峰大道南(中航公元)':64
    }
    # 会经过该站点的线路
    site_line = {
        '江山里澜湾小区': ['11 路','17 路'],
        '赞贤路小学、中航云府(赣康路)': ['5 路','9 路','12 路'],
        '登峰大道中(城市家园)': ['10 路','18 路'],
        '中海滨江壹号': ['6 路','21 路'],
        '中海国际东郡 B 区(南康路)': ['17 路','60 路'],
        '登峰大道南(中航公元)': ['11 路','17 路','18 路']
    }

怎么设计一个算法给在不超载的情况下尽可能把学生都安排上,得到每个站点的每条线路分配人数,比如江山里澜湾小区,11 路分配 6 人,17 路分配 15 人,

475 次点击
所在节点    算法
6 条回复
ivae
11 天前
尝试用贪心算法和动态规划去算,没有太多的思路
Sawyerhou
11 天前
给每个学生编个号,然后随便初始化一下,尝试让每个已经上车学生换车,看能不能让其他没上车的学生上车,如果能,继续遍历,如果不能,直接输出?
sillydaddy
11 天前
这个是线性规划。假设所有的站点分别为 s0, s1, s2, s3...sn ,共有 m 路车分别为 b0, b1, b2...bm 。然后 N_s0_b0 来表示 b0 路车在站点 s0 分配的人数。
那么可以针对所有的 N_si_bi ,列出一组线性不等式。
首先是在 s0 这个站点,m 路车一共分配的人数要大于该站点等待上车的人数,即 N_s0_b0 + N_s1_b0 + N_s2_b0 + ... + N_s0_bm >= s0 站等待人数
然后是对于 b0 路车,所有 n 个站点上这辆车的人数小于该路车的空位,即
N_s0_b0 + N_s1_b0 + ... + N_sn_b0 <= b0 路车空位

把上面的不等式同样应用到所有的 n 个站点和 m 路车,就可以得到 n + m 个线性不等式。
线性规划就是解决这种问题的。可以搜一下现有的线性规划库。英文叫 Linear Programming 。

举几个我考察的例子:
https://github.com/jvail/glpk.js
GPL ,似乎适合大规模的求解,比如上万的变量和约束?
https://www.npmjs.com/package/lpsolver
MIT ,最简洁,但只有标准形式
https://www.npmjs.com/package/lp_solve
LGPL ,比较受欢迎,包大小比较大 2MB ,性能好,规范
https://www.npmjs.com/package/yalps
MIT ,看起来很合适,性能也不错,上千的变量和约束只需要几十毫秒
https://www.npmjs.com/package/simple-simplex
MIT ,看起来也不错,使用友好
https://github.com/IainNZ/SimplexJS
js ,拿来就能用,但不规范
https://www.npmjs.com/package/@bygdle/javascript-lp-solver
似乎的新增加的,
来自 https://github.com/JWally/jsLPSolver ,300 多个 star ,性能也不错。
sillydaddy
11 天前
上面的有一个不等式列错了:
首先是在 s0 这个站点,m 路车一共分配的人数要大于该站点等待上车的人数,即 N_s0_b0 + N_s0_b1 + N_s0_b2 + ... + N_s0_bm >= s0 站等待人数
ivae
11 天前
@sillydaddy 谢谢,我试试
Sawyerhou
11 天前
如果是算法题,不建议调包,会和面试官手里的答案对不上。如果是生产问题,那楼上说的对,组合优化的包很好用。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1049798

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX