阿里巴巴2018校园招聘运筹优化算法工程师编程题

本文介绍了阿里巴巴2018年校园招聘中的两道编程题,涉及带信号灯的最短路问题和仓库货架储位编号问题。针对前者,通过分析表明Dijkstra算法可以适应信号灯约束,并提供了算法实现和算例。后者通过迭代方法解决,给出了计算给定数位数的策略。
摘要由CSDN通过智能技术生成

对于考试向来都是后知后觉,过后留下一堆不甘与遗憾——然而不行就是不行,再接再厉。

声明:涉及阿里校招笔试,如有侵权,请联系我删除。

一、带信号灯的最短路问题

1. 题目描述

现在城市有N个路口,每个路口有自己的编号,从0到N-1,每个路口还有自己的交通控制信号,例如0,3表示0号路口的交通信号每3个时刻变化一次,即0到3时刻0号路口允许通过,3到6时刻不允许通过,而6到9时刻又允许通过;以此类推,所有路口的允许通行都从时刻0开始。同时城市中存在M条道路将这N个路口相连接起来,确保从一个路口到另一个路口都可达,每条路由两个端点加上通行所需要的时间表示。现在给定起始路口和目的路口,从0时刻出发,请问最快能在什么时刻到达?

2. 分析思路

如果没有信号灯。
要在网络中找到从 一点到另外一点的最短路径,我们可以使用现有的最短路算法,可参考http://blog.csdn.net/murmured/article/details/19281031

在加入信号灯约束之后,要考虑到达中间某个路口后的等待时间,而等待时间与到达路口的时刻和路口信号灯变化周期有关。如果是按照Floyd算法来看,需要遍历每一个节点k,如果d[i, j] > d[i, k] + d[k, j]则更新d[i, j]。但是每一个d[i, j]都是考虑以i为起点j为终点计算的通行时间,所以应比较d[i, j]与d[i, k]+w[k, j]+从通过k路口后时刻算起到达j路口的时间。由此看来Floyd算法在本题行不通。

再考虑Dijkstra算法。题目要求计算的是从给定起点到终点的最短时间,这与Dijkstra算法计算其实节点到终节点的特性类似。现在回顾一下Dijkstra算法:

给定一个网络有节点集V,有向边集E,权重矩阵W,起点和终点分别为s和t。
初始化:标记节点集合为M,仅包含s;M中节点到V-M中节点的距离设为无穷大,初始节点到各标记节点的最短路径记为T,T[s]=0;
step1:检查标记节点中是否包含t,如果是则终止,否则进入step2;
step2:计算从M中各节点到V-M中各节点距离的最小值,找到V-M中对应最小值的节点并将其添加为标记节点,对应的最短距离为找到的最小值。用i遍历M中各节点,j遍历V-M中各节点,min = min{T[i] + W[i, j]}。

由于Dijkstra算法每一步计算的都是从初始点到达各标记几点之间的最短距离,这使得我们能够很容易计算在有信号灯的情况下通过路口需要在路口等待信号灯的时间,因此加入信号灯约束之后可对Dijkstra算法做如下改动即可:

给定一个网络有节点集V,有向边集E,权重矩阵W,起点和终点分别为s和t,各路口信号灯变化周期为C。
初始化:标记节点集合为M,仅包含s;M中节点到V-M中节点的距离设为无穷大,初始节点到各标记节点的最短时间径记为T,T[s]=0;
step1:检查标记节点中是否包含t,如果是则终止,否则进入step2;
step2:计算从M中各节点到V-M中各节点通行时间最小值,找到V-M中对应最短通行时间的节点并将其添加为标记节点,对应的最短通行时间为找到的最小值。用i遍历M中各节点,j遍历V-M中各节点,min = min{T[i] + W[i, j] + waittime[i, j]},其中waittime为从i路口到通过j路口需要等待信号灯时间,计算方法为:如果j为终节点则等待时间为0,否则计算m = (T[i] + W[i, j])%2*C[j],如果m小于C[j]则无需等待直接通过,否则需等待2C[j]-m。

3. 代码实现

# -*- coding: UTF-8 -*-.
#!/bin
  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值