靜態交通分配(Dail 演算法)

2021-09-19 10:45:55 字數 2297 閱讀 1876

先附上**

%%輸入初始資訊

o=[1,1,2,2,3,4,4,5,5,6,7,8,9];%網路節點

d=[2,4,3,5,6,5,7,6,8,9,8,9,9];%網路節點

w=[2,2,2,2,2,1,2,1,2,2,2,2,0];%權重

linkweight=sparse(o,d,w);%構建稀疏矩陣

%起點origin=1;

destination=9;

num_nodes=length(o);

%求起點到終點最短路

%dis=zeros(9,9);

for i=1:9 %可改

for j=1:9

[dist,path]=graphshortestpath(linkweight,i,j);%最短路工具箱

dis(i,j)=dist;

end

end

r=dis(1,:);%起點到任何一節點的最短路

s=dis(:,9);%任何一點到終點的最短路

%定義發點

for i=1:9

m=find(o==i);

oi=[d(m)];

end

%定義收點

for i=1:9

m=find(d==i);

di=[o(m)];

end di=1;

%計算likelihood

theta=1;

for i=1:9

for j=1:9

if r(i)s(j)

l(i,j)=exp(theta*(r(j)-r(i)-linkweight(i,j)));

end

end

end

l(9,:)=zeros(1,9);%補全矩陣

%setp 2 先前計算權重,將l變為稀疏矩

for i=1:length(o)

l(i,1)=l(o(i),d(i))

endlsparse=sparse(o,d,l(1:length(d)));

%前向計算路段權重

wi=weight(lsparse,o,di,d,oi,origin,destination);

%反向裝載路段流量

q=1000;destination=9;

xi=flow(o,di,d,oi,wi,q,destination,origin);

定義路段權重函式

function wi=weight(lsparse,o,di,d,oi,origin,destination)

wi=sparse(o,d,zeros(1,length(o)));

for k=1:10

for i=1:destination

if di==origin

%if di==1

wi(i,oi)=lsparse(i,oi);

else

wi(i,oi)=lsparse(i,oi)*sum(wi(di,i));

endend

end

end

定義似然估計函式

function lsparse=likelihood(r,s,theta,w,o,d)

l=zeros(1,length(o));

for k=1:length(o)

if r(o(k))s(d(k))

l(k)=exp(theta*(r(d(k))-r(o(k))-w(k)));

endendlsparse=sparse(o,d,l);

end

路段流量計算

function xi=flow(o,di,d,oi,wi,q,destination,origin)

xi=sparse(o,d,zeros(1,length(o)));

for k=1:150

for i=max(o):-1:origin

%if oi==9

if oi==destination

xi(i,oi)=q*wi(i,oi)/sum(wi(di,oi));

xi(di,i)=wi(di,i)*sum(xi(i,oi))/sum(wi(di,i));

endif wi(di,i)~=0

xi(di,i)=wi(di,i)*sum(xi(i,oi))/sum(wi(di,i));

endend

endend

that』s! all

後續再介紹原理。

參考《交通規劃原理》

靜態分配和動態分配

記憶體的靜態分配和動態分配的區別主要是兩個 一是時間不同。靜態分配發生在程式編譯和連線的時候。動態分配則發生在程式調入和執行的時候。二是空間不同。堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式 靜態分配和動態分配。靜態分配是編譯器完成的,比如區域性變數的分配。動態分配由函式malloc進行分配...

記憶體分配靜態陣列

include include 靜態陣列 void main1 增加 查詢 刪除 修改 int a 10 int length 10 void main2 int num 3 刪除陣列裡的3 for int i 0 i length i 判定要刪除的物件是不是最後乙個,是的話直接長度 1 else ...

動態分配與靜態分配記憶體

記憶體的靜態分配和動態分配的區別主要是兩個 一是時間不同。靜態分配發生在程式編譯和連線的時候。動態分配則發生在程式調入和執行的時候。二是空間不同。堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式 靜態分配和動態分配。靜態分配是編譯器完成的,比如區域性變數的分配。動態分配由函式malloc進行分配...