算法设计
借助蚁群算法解决带时间窗的路径规划问题。
需要注意的是 所谓时间窗 ([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))
调参太玄学了