外点惩罚函数法 matlab 程序,禁忌搜索算法求解带时间窗的车辆路径问题(惩罚函数版 附MATLAB代码)...

本周应小伙伴要求继续学习TS求VRPTW,不过这次通过使用惩罚约束的形式允许解违反时间窗约束和容量约束,不过要给违反约束的解加以惩罚。

这次我们的目标函数就不单单只有车辆总行驶距离了,还要包括当前解中各条路径违反的容量约束之和,还包括所有顾客违反的时间窗约束之和,具体计算公式如下:

56979254a700af486582eefcdd6867c1.png

6c405f6ab23cee5f0c974c51f52a30f7.png表示车辆总行驶距离,

b0402dbd2118a73130c0a5b86eac1c78.png表示各条路径违反的容量约束之和,

60cb17b09d22cad6fd7654d6acde3a49.png表示所有顾客违反的时间窗约束之和。

1ab5f415cf7bd6e8b3cff1cf4eb4f063.png

5bba2e0723b05cbc769f47c10dd69161.png表示车辆到达顾客i的时间,

9f8538a24db05fb7a7b076f400c801f3.png表示顾客i的右时间窗。

邻域的设计与禁忌搜索算法求解带时间窗的车辆路径问题(下 附MATLAB代码)这篇推文中的设计相类似,不过去掉了时间窗约束和容量约束,并且只能将某一条路径上的某个顾客插入到使

eba3fc8d6c27555af1b76c66ef330122.png增加最少的另一条路径上,比如说当前解中共有10条路径,100个顾客,那么当前解邻域的数目为100*(10-1),因为每个顾客都必须插到其他路径上,并且不能插回原来路径中。

论文中初始解的构造方式为:

c4bfbf78174442f9c9c50fba6f62c64e.png

但小编在实际编写程序的过程中,用这种方式构造初始解所求得的结果实在是太差了,所以小编还是用原来的CW法构造初始解(具体可参考CW节约算法构造VRPTW初始解(附MATLAB代码))。

然后论文中提到为了使邻域中的解保持多样性,提到了如下的惩罚措施:

论文中的主程序的伪代码为:

但小编看了post-optimization方法,觉得有点费事就把这步省略了。

小编在代码中将邻域结构这样设计

1%% 当前解S的邻域,用[i,j,k,p,TD]表示可行邻域,表示将顾客i从路径j移动到路径k的第p个位置,TD表示该邻域解的车辆行驶总距离

2%输入curr_vc                          当前解

3%输入L                                仓库时间窗

4%输入a,b                              顾客时间窗

5%输入s                                对顾客的服务时间

6%输入dist                             距离矩阵

7%输入demands:表示由集配中心运送到顾客的配送量

8%输入cap                              车辆负荷

9%输入权重alpha,belta,lamda

10%输出NS

11function [NS] = neighborhood(curr_vc,cusnum,a,b,s,L,dist,demands,cap,alpha,belta,lamda)

12NS=[];

13NV=size(curr_vc,1);             %车辆数

14fcurr=costFuction(curr_vc,a,b,s,L,dist,demands,cap,alpha,belta);

15vc_copy=curr_vc;

16%思路是遍历所有顾客,将顾客从当前路径移除,然后依次插入到其他路径可行位置

17for i=1:cusnum

18    for j=1:NV

19        route=vc_copy{j};

20        pos=find(route==i,1,'first');       %顾客i在当前路径位置

21        %如果pos非空,则顾客i在路径j上

22        if ~isempty(pos)

23            break

24        end

25    end

26    for k=1:NV

27        vc_copy=curr_vc;

28        if (k~=j)&&(~isempty(curr_vc{k}))

29            route=vc_copy{k};   %当前路径所经过的顾客

30            route_copy=route;

31            lr=length(route);   %当前路径所经过的顾客的数目,如果不考虑约束,就意味着有lr+1个插入位置

32            for p=1:lr+1

33                %先不考虑约束,将顾客i插入到路径k的任意可能插入位置

34                if p==1

35                    route=[i route_copy];

36                elseif p==lr+1

37                    route=[route_copy i];

38                else

39                    route=[route_copy(1:p-1) i route_copy(p:end)];

40                end

41                route_before=vc_copy{j};

42                route_before(route_before==i)=[];             %将顾客i从路径j中移除

43                vc_copy{j}=route_before;

44                route_k=vc_copy{k};

45                vc_copy{k}=route;

46                vc_c=deal_vehicles_customer(vc_copy);

47                f=costFuction(vc_c,a,b,s,L,dist,demands,cap,alpha,belta);

48                % 如果f>=fcurr,则给当前解加惩罚

49                if f>=fcurr

50                    c=travel_distance(vc_c,dist);

51                    ps=lamda*c*(cusnum*size(vc_c,1))^0.5;

52                    f=f+ps;

53                end

54                NS=[NS;i,j,k,p,f];

55                vc_copy{k}=route_k;

56            end

57        end

58    end

59    vc_copy=curr_vc;

60    nr=NV+1;        %如果新建一条路径,把该顾客插到新建路径中

61    route=i;

62    vc_copy{nr}=route;

63    vc_c=deal_vehicles_customer(vc_copy);

64    f=costFuction(vc_c,a,b,s,L,dist,demands,cap,alpha,belta);

65    % 如果f>=fcurr,则给当前解加惩罚

66    if f>=fcurr

67        c=travel_distance(vc_c,dist);

68        ps=lamda*c*(cusnum*size(vc_c,1))^0.5;

69        f=f+ps;

70    end

71    NS=[NS;i,j,nr,1,f];

72    vc_copy=curr_vc;

73end

74end

相比于禁忌搜索算法求解带时间窗的车辆路径问题(下 附MATLAB代码)这篇推文中设计的邻域结构,这篇推文设计的邻域结构其实就是去掉时间窗约束和容量约束,然后给违反约束的解加以惩罚,这是小编对惩罚的理解,当然可能不太对,请各位小伙伴后台与小编交流讨论。

最后用matlab跑了几个solomn测试算例,发现求解的质量比上一篇推文求解的质量差好一些,但是求解时间有点长。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值