clc clear syms u x r1 r2 r3 r4 r5 r6 r7 g g1 g2 g3 g4 g5 g6 g7 g8 g9 x2=sym('[x1 x2 x3 x4 x5 x6 x7]'); gm=sym('[x(1) x(2) x(3) x(4)]'); g=sym('[g1 g2 g3 g4]'); S=sym('[s1 s2]'); R=sym('[r1 r2 r3 r4]');%绿信比 R1=sym('[r1 r2 r3 r4 r5 r6 r7]'); UR=sym('[u r1 r2]'); Q=sym('[q1 q2]'); B_total=sym('[r1 r2 r3 r4 q1 q2]'); cunchu=cell(1,2); ta=[2 1 2 3 1 2 1]; %自有流行驶时间 c=[24 30 30 35 24 30 30]; %路段通行能力 demand=[18 6]; split=[r1 r2 r3 r4 r5 r6 r7]; linkpath=[1 0 1 0 0 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 1 1 0 0 0 0 1]; linkpath1=cell(1,2); linkpath1{1,1}=linkpath(:,1:3); linkpath1{1,2}=linkpath(:,4); routeOD=[1 1 1 0;0 0 0 1]; n=1; diff_R=[]; diff_C=[]; diff_Q=[]; linkflow_cunchu=[]; routeflow_cunchu=[]; jieguo_cunchu=[]; jieguo1_cunchu=[]; jieguoF_cunchu=[]; % transpose(x)=relate*transpose(g) y1=linkpath*transpose(g); for i=1:7 t(i)=ta(i)*(1+0.5*(x2(i)/(split(i)*c(i)))^2); %给出各个路段的行驶时间函数 end r1_value=0.5; r2_value=0.5; r3_value=0.5; r4_value=0.5; u_value=1;%设定初始的OD需求乘子为1 u_cha=0.1; r1_cha=0.1; r2_cha=0.1; theta=1; % normal_dis=normrnd(0,1,500000,3); % save('normal','normal_dis'); jacobian_linktime=jacobian(t,x2); routetime_function=t*linkpath; % diff_linkflow_R= while r1_cha>0.0001 | r2_cha>0.0001 Rvalue1=[r1_value r2_value r3_value r4_value 1 1 1]; Rvalue=[r1_value r2_value]; split_value=subs(split,R1,Rvalue1); [P_route,x]=MSA1(theta, Rvalue1,demand);%求得最优路径解 routeflow=x; linkflow=linkpath*routeflow'; link_time1=subs(t,x2,linkflow); link_time=subs(link_time1,R1,Rvalue1); routetime=link_time*linkpath; routeflow_cunchu(n,:)=routeflow; linkflow_cunchu(n,:)=linkflow'; jacobian_linktimeValue1=subs(jacobian_linktime,R1,Rvalue1); jacobian_linktimeValue=subs(jacobian_linktimeValue1,x2,linkflow); diff_R=[];diff_C=[];diff_Q=[]; routetime=link_time*linkpath; route_cov=[link_time(1)+link_time(5) 0 link_time(1) 0 link_time(2)+link_time(6) link_time(6) link_time(1) link_time(6) link_time(1)+link_time(4)+link_time(6)]*theta;%求得路径行驶时间相关系数 route_cov1=inv(route_cov); routetime_cov1=routetime(1:3)*route_cov1; differP_route=differP_route1(routetime(1:3),route_cov1,routetime_cov1,route_cov); %求得路径选择概率Jacobian矩阵 doublediff_target=demand(1)*jacobian_linktimeValue*linkpath1{1,1}*(-differP_route)*(jacobian_linktimeValue*linkpath1{1,1})'+jacobian_linktimeValue;%求得目标函数对路段流量的二次导数 diffN_Q(1,:)=-P_route(1:3)*linkpath1{1,1}'*jacobian_linktimeValue;%求得路段对AB需求量的敏感性N diffN_Q(2,:)=-P_route(4)*linkpath1{1,2}'*jacobian_linktimeValue;%求得路段对CD需求量的敏感性N diff_Q(:,1)=-inv(doublediff_target)*diffN_Q(1,:)';%求得路段对AB需求量的敏感性 diff_Q(:,2)=-inv(doublediff_target)*diffN_Q(2,:)';%求得路段对AB需求量的敏感性 for i=1:4 %路段对绿信比的灵敏度 diffroute_split=diff(routetime_function,R(i)); diffroute_splitV=subs(diffroute_split,R1,Rvalue1); diffroute_splitV=subs(diffroute_splitV,x2,linkflow); diffroute_splitV=double(diffroute_splitV); diff_R1(i,:)=demand(1)*jacobian_linktimeValue*linkpath1{1,1}*(-differP_route)*diffroute_splitV(1:3)'; diff_R(i,:)=-inv(doublediff_target)*diff_R1(i,:)'; end diff_R=diff_R'; guji_link1=sym('[]');guji_link2=sym('[]');guji_link3=sym('[]'); s1=0;s2=0;s3=0; for i=1:4 for j=1:4 s1=s1+diff_R(i,j)*(R1(j)-Rvalue1(j)); end guji_link1(i,1)=0; guji_link1(i,1)=s1; s1=0; end for i=1:4 for j=1:2 s3=s3+diff_Q(i,j)*(Q(j)-demand(j)); end guji_link3(i,1)=0; guji_link3(i,:)=s3; s3=0; end liner_xinhao=linkflow(1:4)+guji_link1+guji_link3; liner_xinhao_cs=subs(liner_xinhao,B_total,zeros(1,6)); liner_xinhao_bl=liner_xinhao-liner_xinhao_cs; liner_xinhao_xishu=[]; B_val=zeros(1,6); for i=1:6 B_val(i)=1; liner_xinhao_xishu(i,:)=double(subs(liner_xinhao_bl,B_total,B_val));%抽取路段线性估计函数的系数 B_val=zeros(1,6); end liner_xinhao_xishu=liner_xinhao_xishu'; youbian=0.9*split(1,1:4).*c(1,1:4); youbian_cs=subs(youbian,R,zeros(1,4)); youbian_bl=youbian-youbian_cs; B_val2=zeros(1,4); youbian_xishu=[]; for i=1:4 B_val2(i)=1; youbian_xishu(i,:)=subs(youbian_bl,R,B_val2);%抽取不等式右边的系数 B_val2=zeros(1,4); end youbian_xishu=youbian_xishu'; linkflow_target_xishu=liner_xinhao_xishu; linkflow_target_xishu=linkflow_target_xishu(:,1:4)-youbian_xishu; linkflow_target_xishu=cat(2,linkflow_target_xishu,liner_xinhao_xishu(:,5:6));%4个进入信号路段的系数 linkflow_target_changshu=youbian_cs'- liner_xinhao_cs; up_F=[0;0;0;0;-1;-1]; A1=linkflow_target_xishu; b1=double(linkflow_target_changshu); Aeq1=[1 0 1 0 0 0;0 1 0 1 0 0]; beq1=[1;1]; lb1=[0.05;0.05;0.05;0.05;18;6]; ub1=[0.95;0.95;0.95;0.95;200;200]; [x3,fval2,a4,b4]=linprog(up_F,A1,b1,Aeq1,beq1,lb1,ub1) jieguo_cunchu(n,:)=x3; r1_cha=max(max(x3(1:4)'-Rvalue1(1:4))./Rvalue1(1:4)); r2_cha=max(max(abs(demand-x3(5:6)')./demand)); r1_value=x3(1); r2_value=x3(2); r3_value=x3(3); r4_value=x3(4); demand(1)=x3(5); demand(2)=x3(6); n=n+1; if n>10 break end end %% the following are codes for function MSA1 function [x,y,p_route]=MSA1(theta,Rvalue1) syms u x r1 r2 r3 r4 r5 r6 r7 g g1 g2 g3 g4 g5 g6 g7 g8 g9 x2=sym('[x1 x2 x3 x4 x5 x6 x7]'); R=sym('[r1 r2 r3 r4]');%绿信比 R1=sym('[r1 r2 r3 r4 r5 r6 r7]'); s=sym('[s1 s2]'); d=sym('[d1 d2]'); ta=[2 1 2 3 1 2 1]; %自有流行驶时间 c=[24 30 30 35 24 30 30]; %路段通行能力 demand=[18 6]; split=[r1 r2 r3 r4 r5 r6 r7]; linkpath=[1 0 1 0 0 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 1 1 0 0 0 0 1]; routeOD=[1 1 1 0;0 0 0 1]; n=1; shoulian1=1; shoulian2=1; for i=1:7 t(i)=ta(i)*(1+0.5*(x2(i)/(split(i)*c(i)))^2); %给出各个路段的行驶时间函数 end SS=[2 5]; for i=1:2 D(i)=(50-(i-1)*20)*exp(-s(i)/SS(i)); end % for i=1:2 % D(i)=(50-(i-1)*20)*(SS(i)/s(i))^3; % end linkflow(n,:)=linkpath*[[1/3 1/3 1/3]*demand(1) demand(2)]'; pathflow(n,:)=[[1/3 1/3 1/3]*demand(1) demand(2)]'; a11=[1 2 3]; link_time1=subs(t,R1,Rvalue1); while shoulian1>0.001 & shoulian2>0.001 link_time2(n,:)=double(subs(link_time1,x2,linkflow(n,:))); link_time2(n,:)=double(link_time2(n,:)); routetime(n,:)=link_time2(n,:)*linkpath; route_cov1=[link_time2(n,1)+link_time2(n,5) 0 link_time2(n,1) 0 link_time2(n,2)+link_time2(n,6) link_time2(n,6) link_time2(n,1) link_time2(n,6) link_time2(n,1)+link_time2(n,4)+link_time2(n,6)]*theta; [P_route1,SF]=MNP3(routetime(n,1:3),route_cov1); routeflow1=P_route1*demand(n,1); routeflow1(4)=demand(n,2); SF(1)=SF; SF(2)=routetime(n,4); demand1=double(subs(D,s,SF)); pathflow(n+1,:)=pathflow(n,:)+1/n*(routeflow1-pathflow(n,:)); demand(n+1,:)=demand(n,:)+1/n*(demand1-demand(n,:)); linkflow(n+1,:)=linkpath*pathflow(n+1,:)'; shoulian1=max(abs(pathflow(n+1,:)'-pathflow(n,:)')); shoulian2=max(abs(demand(n+1,:)'-demand(n,:)')); n=n+1; end n; x=pathflow(n,:); y=SF; p_route=[P_route1 1]; %% the following are codes for function MNP3 function [MNP,SF]=MNP3(c1,route_cov3) length1=length(route_cov3); fenjie1=chol(route_cov3); fenjie1=fenjie1'; normal_dis1=load('normal','normal_dis'); normal_dis1=double(normal_dis1.normal_dis); N=length(normal_dis1); fenjie2=cell(1,length1); for i=1:length1 fenjie2{1,i}=repmat(fenjie1(i,:),N,1); end gailv_sum=[]; gailv_sum1(1,length1)=0; for i=1:length1 gailv_sum(:,i)=sum((fenjie2{1,i}.*normal_dis1)')-c1(i); end % for i=1:N % for j=1:length1 % gailv_sum(i,j)=sum(sum(fenjie1(j,:).*normal_dis1(i,:)))-c1(j); % end % end [m,n]=max(gailv_sum'); for i=1:length1 gailv_sum1(i)=sum(n'==i); end for i=1:length1 a1(i)=gailv_sum1(i)/N; end MNP=a1; SF=-mean(m);