ACO解决VRPTW

算法设计

借助蚁群算法解决带时间窗的路径规划问题。

需要注意的是 所谓时间窗 \([a,b]\) ,表示车辆需要在 \([a,b]\) 时间内到达顾客处,而不是在 \([a,b]\) 内服务完毕。

符号定义

信息素浓度 \(\tau_{i,j}\)

顾客之间距离 \(dis_{i,j}\)

顾客 \(j\) 的左、右时间窗 \(start_j,due_j\)

到达顾客 \(j\) 的时间 \(arrive_j\)

蚂蚁在顾客 \(j\) 的等待时间 \(wait_j=\max\{(start_j-arrive_j),0\} + 0.01\) (加 \(0.01\) 是为了防止除以 \(0\) 出错)

顾客 \(j\) 的紧急程度 \(width_j=due_j-arrive_j\)

算法流程

对于每只蚂蚁,记录当前时间,当前载重量,访问顺序,以及还有哪些顾客尚未访问。

在每次迭代开始,令每只蚂蚁位于场站。

只有当蚂蚁服务完 \(n\) 个顾客后,才算该蚂蚁完成任务。

假设蚂蚁当前在顾客 \(i\),向下一个顾客 \(j\) 转移的概率为 \(\large P_j=\frac{[\tau_{i,j}]^\alpha[1/{dis_{i,j}}]^\beta[1/width_j]^\gamma[1/wait_j]^\sigma}{\sum\limits_{j}([\tau_{i,j}]^\alpha[1/{dis_{i,j}}]^\beta[1/width_j]^\gamma[1/wait_j]^\sigma)}\)

如果蚂蚁找不到下一个顾客服务(指没有顾客可以满足时间窗要求或载重量要求),那么令该蚂蚁返回场站,时间归零,载重装满。

当所有蚂蚁完成任务后,找到总路程长度最小的蚂蚁,使用该蚂蚁更新答案。

信息素更新公式为 \(\large \tau_{i,j}=\tau_{i,j}\times \rho\;+\frac{\Delta}{nowdis}\) ,其中 \(\Delta\) 为常数,\(nowdis\) 为该蚂蚁的总路程。

参数选择

对于信息素,我令其初值为 \(\large \frac1{ave\_sum}\),其中 \(ave\_sum\) 表示所有道路长度的平均值。

另外,取 \(\alpha =1.0, \beta=3.0,\gamma=2.0,\sigma=3.0,\rho=0.9, \Delta = 600.0\)

运行效果

对于不同数据,需要对参数进行较大调整,方可获得令人满意的答案。

Solomon C101.25 最优解191.3

Solomon R101.25 最优解 617.1

Solomon C101.50 最优解362.4 (这里我令 \(\rho=0.8\)

Solomon C101.100 最优解827.3 (这里我令 \(\rho=0.6\)

调参太玄学了

参考资料

蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题 - 知乎 (zhihu.com)

posted @ 2021-06-01 09:30  YoungNeal  阅读(379)  评论(0编辑  收藏  举报