【MSWA交通流量分配】基于相继加权平均算法(MSWA)交通流量分配算法的仿真

218 篇文章 55 订阅

1.软件版本

matlab2021a

2.本算法理论知识

如图所示交通网络中,包含6个节点、11各路段、9个OD对。经枚举可得每个OD对间存在3条无折返有效路径,共27条。

各个OD对间的出行需求量如表所示:

O1

O2

O3

D1

80

50

20

D2

45

170

40

D3

30

20

25

每个路段的走行时间按照下式计算:

 其中,为路段a的流量

 

 利用相继加权平均算法(MSWA)求解配流结果,算法步骤如下:

 3.核心代码

clc
clear;
close all;
warning off;


%各个OD对间的出行需求量
qOD   = [80,50,20;
         45,170,40;
         30,20,25;];
[Rdo,Cdo] = size(qOD);

ta0   = [60 ,40,60 ,20 ,20 ,20 ,20 ,20 ,20 ,20 ,20];     
ca    = [100,40,160,300,300,300,300,300,300,300,300];     
Num   = length(ta0);%路段数量     

%迭代次数
Iter = 5000;
d    = 0.5;
es   = 0.1;

r     = zeros(1,Iter);
alpha = ones(1,Iter);
ya    = ones(Num,Iter);
xa    = zeros(Num,Iter);

for m = 1:Iter
    %计算各OD对间各条有效路径的总走行时间
    if m == 1
        for i = 1:Num
            ta(i) = ta0(i)*(1 + 0.15*(0/ca(i))^4);
        end
    else
        for i = 1:Num
            ta(i) = ta0(i)*(1 + 0.15*(xa(i,m-1)/ca(i))^4);
        end  
    end
    %计算各OD对间各条有效路径的总走行时间,这个需要根据图上的连接路径自己计算
    %OD对间存在3条无折返有效路径
    TkOD(1,1,1)=ta(1);
    TkOD(1,1,2)=sum(ta([4,5,3,10,11]));
    TkOD(1,1,3)=sum(ta([4,2,11]));
    
    TkOD(1,2,1)=sum(ta([4,2]));
    TkOD(1,2,2)=sum(ta([1,8]));
    TkOD(1,2,3)=sum(ta([4,5,3,10]));
    
    TkOD(1,3,1)=sum(ta([4,5,3]));
    TkOD(1,3,2)=sum(ta([4,2,9]));
    TkOD(1,3,3)=sum(ta([1,8,9]));
    
    
    TkOD(2,1,1)=sum(ta([7,1]));
    TkOD(2,1,2)=sum(ta([2,11]));
    TkOD(2,1,3)=sum(ta([5,3,10,11]));
    
    TkOD(2,2,1)=sum(ta([2]));
    TkOD(2,2,2)=sum(ta([5,3,10]));
    TkOD(2,2,3)=sum(ta([7,1,8]));
    
    TkOD(2,3,1)=sum(ta([5,3]));
    TkOD(2,3,2)=sum(ta([2,9]));
    TkOD(2,3,3)=sum(ta([7,1,8,9]));    
    
    
    TkOD(3,1,1)=sum(ta([3,10,11]));
    TkOD(3,1,2)=sum(ta([6,2,11]));
    TkOD(3,1,3)=sum(ta([6,7,1]));
    
    TkOD(3,2,1)=sum(ta([6,2]));
    TkOD(3,2,2)=sum(ta([3,10]));
    TkOD(3,2,3)=sum(ta([6,7,1,8]));
    
    TkOD(3,3,1)=sum(ta([3]));
    TkOD(3,3,2)=sum(ta([6,2,9]));
    TkOD(3,3,3)=sum(ta([6,7,1,8,9]));       
 
    %网络加载
    TkOD = TkOD/100;%加这个语句,使得expTkod的值稍微大点,这样曲线效果明显点,否则太小了,看上去不明显
    for k = 1:3
        tmps(k) = sum(sum(exp(-1*TkOD(:,:,k))));
    end
    for i = 1:Rdo
        for j = 1:Cdo
            for k = 1:3
                PkOD(i,j,k) = tmps(k)/sum(tmps)*qOD(i,j);
            end
        end
    end
    %计算yam
    ya(1,m) = ta(1) *(PkOD(1,1,1)/ta(1) + PkOD(1,2,2)/sum(ta([1,8])) + PkOD(1,3,3)/sum(ta([1,8,9])) + PkOD(2,3,3)/sum(ta([7,1,8,9])) + PkOD(2,3,3)/sum(ta([7,1,8,9])) + PkOD(3,2,3)/sum(ta([6,7,1,8])) + PkOD(3,3,3)/sum(ta([6,7,1,8,9])));
    ya(2,m) = ta(2) *(PkOD(1,1,3)/sum(ta([4,2,11])) +PkOD(1,2,1)/sum(ta([4,2])) + PkOD(1,3,2)/sum(ta([4,2,9]))+ PkOD(2,1,2)/sum(ta([2,11]))+ PkOD(2,2,1)/sum(ta([2]))+PkOD(2,3,2)/sum(ta([2,9])) + PkOD(3,1,2)/sum(ta([6,2,11]))+ PkOD(3,2,1)/sum(ta([6,2]))+ PkOD(3,3,2)/sum(ta([6,2,9])));
    ya(3,m) = ta(3) *(PkOD(1,1,2)/sum(ta([4,5,3,10,11]))+PkOD(1,2,3)/sum(ta([4,5,3,10]))+PkOD(1,3,1)/sum(ta([4,5,3]))+PkOD(2,1,3)/sum(ta([5,3,10,11]))+PkOD(2,2,2)/sum(ta([5,3,10]))+PkOD(2,3,1)/sum(ta([5,3]))+PkOD(3,1,1)/sum(ta([3,10,11]))+PkOD(3,2,2)/sum(ta([3,10]))+PkOD(3,3,1)/sum(ta([3])));
    ya(4,m) = ta(4) *(PkOD(1,1,2)/sum(ta([4,5,3,10,11]))+PkOD(1,1,3)/sum(ta([4,2,11]))+PkOD(1,2,1)/sum(ta([4,2]))+PkOD(1,2,3)/sum(ta([4,5,3,10]))+PkOD(1,3,1)/sum(ta([4,5,3]))+PkOD(1,3,2)/sum(ta([4,2,9])));
    ya(5,m) = ta(5) *(PkOD(1,1,2)/sum(ta([4,5,3,10,11]))+PkOD(1,2,3)/sum(ta([4,5,3,10]))+PkOD(1,3,1)/sum(ta([4,5,3]))+PkOD(2,1,3)/sum(ta([5,3,10,11]))+PkOD(2,2,2)/sum(ta([5,3,10]))+PkOD(2,3,1)/sum(ta([5,3])));
    ya(6,m) = ta(6) *(PkOD(3,1,2)/sum(ta([6,2,11]))+PkOD(3,1,3)/sum(ta([6,7,1]))+PkOD(3,2,1)/sum(ta([6,2]))+PkOD(3,2,3)/sum(ta([6,7,1,8]))+PkOD(3,3,2)/sum(ta([6,2,9]))+PkOD(3,3,3)/sum(ta([6,7,1,8,9])));
    ya(7,m) = ta(7) *(PkOD(2,1,1)/sum(ta([7,1]))+PkOD(2,2,3)/sum(ta([7,1,8]))+PkOD(2,3,3)/sum(ta([7,1,8,9]))+PkOD(3,1,3)/sum(ta([6,7,1]))+PkOD(3,2,3)/sum(ta([6,7,1,8]))+PkOD(3,3,3)/sum(ta([6,7,1,8,9])));
    ya(8,m) = ta(8) *(PkOD(1,2,2)/sum(ta([1,8]))+PkOD(1,3,3)/sum(ta([1,8,9]))+PkOD(2,2,3)/sum(ta([7,1,8]))+PkOD(2,3,3)/sum(ta([7,1,8,9]))+PkOD(3,2,3)/sum(ta([6,7,1,8]))+PkOD(3,3,3)/sum(ta([6,7,1,8,9])));
    ya(9,m) = ta(9) *(PkOD(1,3,2)/sum(ta([4,2,9]))+PkOD(1,3,3)/sum(ta([1,8,9]))+PkOD(2,3,2)/sum(ta([2,9]))+PkOD(2,3,3)/sum(ta([7,1,8,9]))+PkOD(3,3,2)/sum(ta([6,2,9]))+PkOD(3,3,3)/sum(ta([6,7,1,8,9])));
    ya(10,m)= ta(10)*(PkOD(1,1,2)/sum(ta([4,5,3,10,11]))+PkOD(1,2,3)/sum(ta([4,5,3,10]))+PkOD(2,1,3)/sum(ta([5,3,10,11]))+PkOD(2,2,2)/sum(ta([5,3,10]))+PkOD(3,1,1)/sum(ta([3,10,11]))+PkOD(3,2,2)/sum(ta([3,10])));  
    ya(11,m)= ta(11)*(PkOD(1,1,2)/sum(ta([4,5,3,10,11]))+PkOD(1,1,3)/sum(ta([4,2,11]))+PkOD(2,1,2)/sum(ta([2,11]))+PkOD(2,1,3)/sum(ta([5,3,10,11]))+PkOD(3,1,1)/sum(ta([3,10,11]))+PkOD(3,1,2)/sum(ta([6,2,11])));   
    
    if m == 1
       r(m)     = m^d;  
    else
       r(m)     = r(m-1) + m^d; 
       alpha(m) = m^d/r(m);
       xa(:,m)    = (1-alpha(m))*xa(:,m-1) + alpha(m)*ya(:,m);
    end
    
    if mean(abs(xa(:,m)-ya(:,m))) <= es & m > 1
       m%输出迭代次数
       break;
    end
    
    %27个路径迭代曲线图
    indx=0;
    for i = 1:Rdo
        for j = 1:Cdo
            for k = 1:3
                indx=indx+1;
                dss(indx,m) = PkOD(i,j,k);
            end
        end
    end
    
end     
       
 
figure;
plot(dss(1,:),'r','linewidth',2);hold on;
plot(dss(2,:),'k','linewidth',2);hold on;
plot(dss(3,:),'b','linewidth',2);hold on;
plot(dss(4,:),'m','linewidth',2);hold on;
plot(dss(5,:),'g','linewidth',2);hold on;
plot(dss(6,:),'c','linewidth',2);hold on;
legend('路径1','路径2','路径3','路径4','路径5','路径6');
xlabel('迭代次数');
ylabel('收敛值');
grid on
 
    
figure;
plot(dss(7,:),'r','linewidth',2);hold on;
plot(dss(8,:),'k','linewidth',2);hold on;
plot(dss(9,:),'b','linewidth',2);hold on;
plot(dss(10,:),'m','linewidth',2);hold on;
plot(dss(11,:),'g','linewidth',2);hold on;
plot(dss(12,:),'c','linewidth',2);hold on;
legend('路径7','路径8','路径9','路径10','路径11','路径12');
xlabel('迭代次数');
ylabel('收敛值');
grid on


figure;
plot(dss(13,:),'r','linewidth',2);hold on;
plot(dss(14,:),'k','linewidth',2);hold on;
plot(dss(15,:),'b','linewidth',2);hold on;
plot(dss(16,:),'m','linewidth',2);hold on;
plot(dss(17,:),'g','linewidth',2);hold on;
plot(dss(18,:),'c','linewidth',2);hold on;
legend('路径13','路径14','路径15','路径16','路径17','路径18');
xlabel('迭代次数');
ylabel('收敛值');
grid on


figure;
plot(dss(19,:),'r','linewidth',2);hold on;
plot(dss(20,:),'k','linewidth',2);hold on;
plot(dss(21,:),'b','linewidth',2);hold on;
plot(dss(22,:),'m','linewidth',2);hold on;
plot(dss(23,:),'g','linewidth',2);hold on;
plot(dss(24,:),'c','linewidth',2);hold on;
legend('路径19','路径20','路径21','路径22','路径23','路径24');
xlabel('迭代次数');
ylabel('收敛值');
grid on

figure;
plot(dss(25,:),'r','linewidth',2);hold on;
plot(dss(26,:),'k','linewidth',2);hold on;
plot(dss(27,:),'b','linewidth',2);hold on;
legend('路径25','路径26','路径27');
xlabel('迭代次数');
ylabel('收敛值');
grid on


     

4.操作步骤与仿真结论

 

 5.参考文献

A06-50

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值