ACO解决VRPTW

算法设计

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

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

符号定义

信息素浓度 ( au_{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{[ au_{i,j}]^alpha[1/{dis_{i,j}}]^eta[1/width_j]^gamma[1/wait_j]^sigma}{sumlimits_{j}([ au_{i,j}]^alpha[1/{dis_{i,j}}]^eta[1/width_j]^gamma[1/wait_j]^sigma)})

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

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

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

参数选择

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

另外,取 (alpha =1.0, eta=3.0,gamma=2.0,sigma=3.0, ho=0.9, Delta = 600.0)

运行效果

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

Solomon C101.25 最优解191.3

Solomon R101.25 最优解 617.1

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

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

调参太玄学了

参考资料

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

当你走进这欢乐场
原文地址:https://www.cnblogs.com/YoungNeal/p/14835748.html