ByskyXie / PSO-for-VRPTW

Using improved PSO(Particle Swarm Optimization) algorithm resolve VRPTW question.
48 stars 11 forks source link

请问有没有相关的论文? #1

Open Yongzide opened 4 years ago

ByskyXie commented 4 years ago

知网上有几篇,外国文献也比较少。 国内相关论文在实现细节上语焉不详,照着paper来实现算法不太现实。

victor-calculus commented 2 years ago

请问在readme中你提到的‘’结合了两篇paper的长处‘’,是参考的哪两篇paper呢?我也想参考一下。

ByskyXie commented 2 years ago

吴耀华的《带时间窗车辆路径问题的改进粒子群算法研究》 李宁老师的《带时间窗车辆路径问题的粒子群算法》

目前只找到这两篇,我记得还有英文论文,不过没保存。 这位同学的毕业论文是关于VRPTW的,可惜现在google上搜不到了,也可以参考下: https://github.com/KrupaPrag/VRPTW

victor-calculus commented 2 years ago

吴耀华的《带时间窗车辆路径问题的改进粒子群算法研究》 李宁老师的《带时间窗车辆路径问题的粒子群算法》

目前只找到这两篇,我记得还有英文论文,不过没保存。 这位同学的毕业论文是关于VRPTW的,可惜现在google上搜不到了,也可以参考下: https://github.com/KrupaPrag/VRPTW

非常感谢!!

victor-calculus commented 2 years ago

函数dot_improve中num>selection[2]这个看不懂额(⊙o⊙)

victor-calculus commented 2 years ago

函数dot_improve中num>selection[2]这个看不懂额(⊙o⊙)

看到一篇遗传算法轮盘赌的交叉算子。额但selection[2]不就是1吗

ByskyXie commented 2 years ago

函数dot_improve中num>selection[2]这个看不懂额(⊙o⊙)

看到一篇遗传算法轮盘赌的交叉算子。额但selection[2]不就是1吗

这段if语句应该分别是num>selection[0]和num>selection[1]。 我居然把1当起始索引了,真丢人...

victor-calculus commented 2 years ago

函数dot_improve中num>selection[2]这个看不懂额(⊙o⊙)

看到一篇遗传算法轮盘赌的交叉算子。额但selection[2]不就是1吗

这段if语句应该分别是num>selection[0]和num>selection[1]。 我居然把1当起始索引了,真丢人...

O(∩_∩)O还想问下重编码,solution[1][i]都是1,solution[0][i]依次增大,是每站不同车吗,不理解喔

070720121 commented 1 year ago

受益颇多,感谢分享!

Lestersjw commented 6 months ago

您好,我对您的代码有两处疑问,不知您可否解答? 1.您的代码中轮盘赌的部分好像可能没有起到效果,目前只是random.random()的值对比后选择其中一个,本质上好像还是在用随机数来进行选择变异方向。 2.关于run()函数部分注释您写到,生成两两重叠的粒子群,但我发现其实代码中应该只用了一个粒子群呀,或者您是不是想表达不断更新的这个solution和dot_best是两个重叠的粒子群呢,但我个人认为这两者其实表达为一个粒子群的两个不同状态更合适,因为如果说使用两个粒子群,应该是要彼此产生信息共享和引导变异方向的吧。

nudtdyk commented 6 months ago

Best solution: [0, 1, 2, 3, 4, 4, 3, 2, 4, 5, 2, 6, 7, 7, 5, 6, 1, 8, 8, 7, 2, 8, 7, 3, 0, 1, 8, 0, 6, 9, 3, 10, 9, 0, 7, 10, 5, 7, 2, 9, 1, 3, 5, 1, 10, 6, 0, 9, 6, 8, 8] [1, 1, 1, 1, 1, 2, 2, 2, 3, 1, 3, 1, 1, 2, 2, 2, 2, 1, 2, 3, 4, 3, 4, 3, 2, 3, 4, 3, 3, 1, 4, 1, 2, 4, 5, 2, 3, 6, 5, 3, 4, 5, 4, 5, 3, 4, 5, 4, 5, 5, 6] 请问这个结果分别是什么意思

ByskyXie commented 6 months ago

您好,我对您的代码有两处疑问,不知您可否解答? 1.您的代码中轮盘赌的部分好像可能没有起到效果,目前只是random.random()的值对比后选择其中一个,本质上好像还是在用随机数来进行选择变异方向。 2.关于run()函数部分注释您写到,生成两两重叠的粒子群,但我发现其实代码中应该只用了一个粒子群呀,或者您是不是想表达不断更新的这个solution和dot_best是两个重叠的粒子群呢,但我个人认为这两者其实表达为一个粒子群的两个不同状态更合适,因为如果说使用两个粒子群,应该是要彼此产生信息共享和引导变异方向的吧。

你提的问题很关键:

  1. VRPTW任务的解空间并不是连续的,需要重新定义离散空间下PSO的新解产生策略。 换句话说,假设已有订单分配方案A、B,我们无法像在连续空间中一样通过αA+βB(其中α、β为权重)的形式产生新的解。因此具体在代码实现中粒子群中的 “惯性方向、个体最优方向、群体最优方向” 被分别定义为dot_improve()中为任一订单“随机分配、复用个体最优方案、服用全局最优方案”,从而实现离散空间的新解产生问题。事实上这部分也是应用PSO解决VRPTW任务的核心,本问题前面提到的所有paper都对此语焉不详。
  2. “生成两两重叠的粒子群” 其实是后续考虑结合的改进策略,就像代码TODO部分还有很多后续的改进思路(然而本人太懒了,一直没处理。
ByskyXie commented 6 months ago

Best solution: [0, 1, 2, 3, 4, 4, 3, 2, 4, 5, 2, 6, 7, 7, 5, 6, 1, 8, 8, 7, 2, 8, 7, 3, 0, 1, 8, 0, 6, 9, 3, 10, 9, 0, 7, 10, 5, 7, 2, 9, 1, 3, 5, 1, 10, 6, 0, 9, 6, 8, 8] [1, 1, 1, 1, 1, 2, 2, 2, 3, 1, 3, 1, 1, 2, 2, 2, 2, 1, 2, 3, 4, 3, 4, 3, 2, 3, 4, 3, 3, 1, 4, 1, 2, 4, 5, 2, 3, 6, 5, 3, 4, 5, 4, 5, 3, 4, 5, 4, 5, 5, 6] 请问这个结果分别是什么意思

参考line 28 "最好方案[Xv各任务车辆编号,Xr各任务在对应车辆路径执行次序]" 你给的列表长度为51,则分别对应需要解决的51个订单。 其中Xv代表执行该订单的车辆编号,Xr代表该订单是这辆车接的第几单。 所以你给的 Xv=[0, 1, 2, 3, 4, 4, ....] Xr=[1, 1, 1, 1, 1, 2, ....] 中index=0时表示第1个订单由编号0的车处理,该订单是编号0车处理的第1个订单。index=1,2,3,4时同理所以Xr均为1。当index=5时,第6个订单还由编号4车处理,此时该订单就是编号4的车处理的第2个订单(因为第5个订单是编号4车处理的第1个订单)。