<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          最短路問題與標號算法(label correcting algorithm)研究(4)

          共 17296字,需瀏覽 35分鐘

           ·

          2020-05-10 23:20

          1429281fe12de59f54ee508c8e10f2cd.webp

          前文回顧

          這是全文第三章label correcting algorithm的第二節(jié)。本章圍繞Label Correcting Algorithms展開。上一節(jié)已經介紹了最短路徑算法Generic Label Correcting Algorithm以及Modified Label Correcting Algorithm,本節(jié)將介紹在前兩個算法上改進得到的FIFO Label Correcting Algorithm以及Deque Label Correcting Algorithm。點擊下方鏈接回顧往期內容:

          最短路問題與標號算法(label setting algorithm)研究(1) - 開篇介紹

          最短路問題與標號算法(label correcting algorithm)研究(2) - 最短路徑問題簡介

          最短路問題與標號算法(label correcting algorithm)研究(3)

          6802229b743579fc6484d74a324854ea.webp

          3.4 FIFO Label Correcting Algorithm

          3.4.1 算法介紹

          同樣我們再次回顧一下Modified Label Correcting Algorithm的關鍵步驟:引入SE_LIST記錄距離標簽更新的節(jié)點編號,并在下一次迭代時檢查SE_LIST內某一節(jié)點發(fā)出的所有弧,即表3-5第7行與第13行。我們可以看出算法并沒有給出從SE_LIST中選擇節(jié)點以及向SE_LIST添加節(jié)點的具體規(guī)則,因此我們在相應代碼實現時以隨機的方式選取節(jié)點,并將新的節(jié)點添加到SE_LIST的尾部,即表3-6第48-50行與58-60行,表3-7第49-52行與63-65行。這種隨機方式是否會對算法效率產生影響呢?前邊我們已經知道,當最大網絡弧長非常大時Modified Label Correcting Algorithm的迭代次數為。現在假設我們其將應用到一個病態(tài)的數據集上(這類數據集往往含有非常大的值),且每次迭代時從SE_LIST中選取節(jié)點或向SE_LIST中添加節(jié)點的順序不合適時,算法總的迭代次數會隨著網絡節(jié)點數成指數式增長。顯然,為了保證算法效率的可靠性我們必須設計出較為合理的規(guī)則對SE_LIST中節(jié)點進行操作。這里介紹一種基于FIFO(FirstInFirstOut,先進先出)的節(jié)點處理規(guī)則,我們稱其為FIFO Label Correcting Algorithm。

          這里我們嘗試對中的弧進行排序以解決Generic Label Correcting Algorithm中弧掃描規(guī)則不明確問題(或者說SE_LIST中節(jié)點操作順序問題):將弧集合中的所有弧以某種特定的方式排序,然后在每次迭代中逐個檢查中的弧,如果某條弧滿足條件:,則更新相應的距離標簽:,及節(jié)點的前向節(jié)點。當某步迭代后,中所有弧都滿足最優(yōu)性條件時,結束算法。接下來我們回顧一下3.3.1小節(jié)的內容,在引入SE_LIST時我們提到只有當節(jié)點的距離標簽更新時才需要在后續(xù)迭代時檢查從節(jié)點發(fā)出的所有弧是否滿足最優(yōu)性條件。所以上述嘗試還需進一步改進。我們將弧集合中的弧按照它們的尾節(jié)點升排序,以便所有具有相同尾節(jié)點的弧都連續(xù)出現在集合中。這樣在掃描弧時,我們可以一次考慮一個節(jié)點發(fā)出的所有弧,比如節(jié)點,掃描中的弧,并判斷其是否滿足最優(yōu)性條件。假設在某次迭代遍歷過程中,算法沒有更新節(jié)點的距離標簽,那么在下一步迭代中,始終存在,因此沒有必要再次檢查中的弧。根據以上分析,我們同樣引入可掃描列表SE_LIST,記錄在一次迭代過程中距離標簽發(fā)生更新的所有節(jié)點,并在下一次迭代中只考慮該列表中節(jié)點發(fā)出的所有弧。具體細節(jié)為:從SE_LIST一端(這里以左端為例)取出一個節(jié)點,檢查中的所有弧是否滿足最優(yōu)性條件;從SE_LIST另一端(右端)添加新的節(jié)點以便后續(xù)迭代檢查判斷。我們稱為FIFO規(guī)則,即先進先出。采用這類規(guī)則的算法稱為FIFO Label Correcting Algorithm,其算法步驟如下:

          d95368dd89a2ce052b0145c82a22f3e9.webp

          表3-8 ?FIFO Label Correcting Algorithm學習到這里你可能會發(fā)現,Modified Label Correcting Algorithm和FIFO Label Correcting Algorithm的步驟幾乎一樣。事實也是如此,如果Modified Label Correcting Algorithm采取"從SE_LIST的頭部選擇節(jié)點,并將新的節(jié)點添加到SE_LIST的尾部"的策略,這和我們本節(jié)提出的FIFO Label Correcting Algorithm是相同的,你也可以認為FIFO Label Correcting Algorithm是Modified Label Correcting Algorithm的一種特例。復雜度分析FIFO Label Correcting Algorithm以FIFO方式處理對SE_LIST進行操作,有效避免了最大弧長值對算法效率產生的影響。我們已經知道Modified Label Correcting Algorithm總的迭代次數為,所以FIFO Label Correcting Algorithm總的迭代次數為。

          3.4.2 算法實現

          首先給出Python版本的FIFO Label Correcting Algorithm實現(求解附錄2中源節(jié)點1到其他節(jié)點的最短路徑)。
          """導入相關基礎包,定義全局變量"""
          import?pandas?as?pd
          import?numpy?as?np
          import?copy
          g_node_list=[]?#網絡節(jié)點集合
          g_node_zone={}?#網絡節(jié)點類別集合
          g_link_list=[]?#網絡弧集合
          g_adjacent_arc_list={}#節(jié)點鄰接弧集合(從節(jié)點i發(fā)出的弧集合)
          g_shortest_path=[]#最短路徑集合
          g_node_status=[]#網絡節(jié)點狀態(tài)
          g_number_of_nodes=0#網絡節(jié)點個數
          g_origin=None???#網絡源節(jié)點
          node_predecessor=[]#前向節(jié)點集合
          node_label_cost=[]#距離標簽集合
          SE_LIST=[]#可掃描節(jié)點集合
          Max_label_cost=99999#初始距離標簽
          """導入網絡數據文件,構建基礎網絡并初始化相關變量"""
          #讀取網絡節(jié)點數據
          df_node=pd.read_csv('./input_file/node.csv')
          df_node=df_node.iloc[:,:].values
          for?i?in?range(len(df_node)):
          ????g_node_list.append(df_node[i,0])
          ????g_node_zone[df_node[i,?0]]?=?df_node[i,?-1]
          ????g_number_of_nodes+=1
          ????g_adjacent_arc_list[df_node[i,0]]=[]
          ????if?df_node[i,?3]?==?1:
          ????????g_origin?=?df_node[i,?0]
          g_node_status=[0?for?i?in?range(g_number_of_nodes)]?#初始化網絡節(jié)點狀態(tài)
          Distance=np.ones((g_number_of_nodes,g_number_of_nodes))\
          *Max_label_cost?#距離矩陣
          node_predecessor=[-1]*g_number_of_nodes
          node_label_cost=[Max_label_cost]*g_number_of_nodes
          node_predecessor[g_origin-1]=0
          node_label_cost[g_origin-1]?=?0
          #讀取網絡弧數據
          df_link=pd.read_csv('./input_file/road_link.csv')
          df_link=df_link.iloc[:,:].values
          for?i?in?range(len(df_link)):
          ????g_link_list.append((df_link[i,1],df_link[i,2]))
          ????Distance[df_link[i,1]-1,df_link[i,2]-1]=df_link[i,3]
          ????g_adjacent_arc_list[df_link[i,1]].append(df_link[i,2])
          SE_LIST=[g_origin]
          g_node_status[g_origin-1]=1
          """最短路徑求解:掃描網絡弧,依據檢查最優(yōu)性條件更新距離標簽"""
          while?len(SE_LIST):
          ????head=SE_LIST[0]#從可掃描列表中取出第一個元素
          ????SE_LIST.pop(0)#從可掃描列表中刪除第一個元素
          ????g_node_status[head-1]=0
          ????adjacent_arc_list=g_adjacent_arc_list[head]#獲取當前節(jié)點的鄰接弧集合
          ????for?tail?in?adjacent_arc_list:
          ????????if?node_label_cost[tail-1]>\
          node_label_cost[head-1]+Distance[head-1,tail-1]:
          ????????????node_label_cost[tail-1]=\
          node_label_cost[head-1]+Distance[head-1,tail-1]
          ????????????node_predecessor[tail-1]=head
          ????????????if?g_node_status[tail-1]==0:
          ????????????????SE_LIST.append(tail)#將新節(jié)點添加到可掃描列表尾部,append方法實現從列表尾部添加元素
          ????????????????g_node_status[tail-1]=1
          """依據前向節(jié)點生成最短路徑"""
          agent_id=1
          o_zone_id=g_node_zone[g_origin]
          for?destination?in?g_node_list:
          ????if?g_origin!=destination:
          ????????d_zone_id=g_node_zone[destination]
          ????????if?node_label_cost[destination-1]==Max_label_cost:
          ????????????path="?"
          ????????????g_shortest_path.append([agent_id,?o_zone_id,d_zone_id,path,?node_label_cost[destination?-?1]])
          ????????else:
          ????????????to_node=copy.copy(destination)
          ????????????path=?"%s"?%?to_node
          ????????????while?node_predecessor[to_node-1]!=g_origin:
          ????????????????path="%s;"%?node_predecessor[to_node?-?1]?+?path
          ????????????????g=node_predecessor[to_node-1]
          ????????????????to_node=g
          ????????????path="%s;"%g_origin+path
          ????????????g_shortest_path.append([agent_id,?o_zone_id,d_zone_id,path,?node_label_cost[destination?-?1]])
          ????????agent_id+=1
          """將求解結果導出到csv文件"""
          #將數據轉換為DataFrame格式方便導出csv文件
          g_shortest_path=np.array(g_shortest_path)
          col=['agent_id','o_zone_id','d_zone_id','node_sequence','distance']
          file_data?=?pd.DataFrame(g_shortest_path,?index=range(len(g_shortest_path)),columns=col)
          file_data.to_csv('./3_fifo_label_correcting/agent.csv',index=False)
          表3-9 Python實現FIFO Label Correcting Algorithm(頁面可滑動)接下來給出MATLAB版本的FIFO Label Correcting Algorithm實現(求解附錄2中源節(jié)點1到其他節(jié)點的最短路徑)。
          %%?clear
          clc
          clear

          %%?設置變量
          g_node_list?=?[];?%網絡節(jié)點集合
          g_link_list?=?[];?%網絡弧集合
          g_origin?=?[];???%網絡源節(jié)點
          g_number_of_nodes?=?0;%網絡節(jié)點個數
          node_predecessor?=?[];%前向節(jié)點集合
          node_label_cost?=?[];%距離標簽集合
          Max_label_cost?=?inf;?%初始距離標簽
          g_adjacent_arc_list={};?%節(jié)點鄰接弧集合(從節(jié)點i發(fā)出的弧集合)
          g_node_status=[];?%網絡節(jié)點狀態(tài)
          SE_LIST=[];?%可掃描節(jié)點集合

          %%?導入網絡數據文件,構建基礎網絡并初始化相關變量
          %讀取網絡節(jié)點數據
          df_node?=?csvread('node.csv',1,0);
          g_number_of_nodes?=?size(df_node,1);
          g_node_list?=?df_node(:,1);
          g_node_status?=?zeros(1,g_number_of_nodes);
          for?i?=?1?:?g_number_of_nodes
          ????if?df_node(i,4)==1
          ????????g_origin=df_node(i,1);
          ????????o_zone_id?=?df_node(i,5);
          ????end
          end
          Distance?=?ones(g_number_of_nodes,g_number_of_nodes)*Max_label_cost;?
          %距離矩陣
          node_predecessor?=?-1*ones(1,g_number_of_nodes);
          node_label_cost?=?Max_label_cost*ones(1,g_number_of_nodes);
          node_predecessor(1,g_origin)?=?0;
          node_label_cost(1,g_origin)?=?0;
          g_adjacent_arc_list?=?cell(1,?g_number_of_nodes);
          %讀取網絡弧數據
          df_link?=?csvread('road_link.csv',1,0);
          g_link_list?=?df_link(:,2:3);
          for?i?=?1?:?size(df_link,?1)?
          ????Distance(df_link(i,2),df_link(i,3))?=?df_link(i,4);
          ????g_adjacent_arc_list{df_link(i,2)}?=?[g_adjacent_arc_list{df_link(i,2)},?df_link(i,3)];
          end

          %%?最短路徑求解:掃描網絡弧,依據檢查最優(yōu)性條件更新距離標簽
          SE_LIST=[g_origin];
          g_node_status(g_origin)=1;
          while?~isempty(SE_LIST)
          ????head=SE_LIST(1);?%從可掃描列表中取出第一個元素
          ????SE_LIST(1)=[];?%從可掃描列表中刪除第一個元素
          ????g_node_status(head)=0;
          adjacent_arc_list?=?g_adjacent_arc_list(head);?
          %獲取當前節(jié)點的鄰接弧
          ????adjacent_arc_list?=?cell2mat(adjacent_arc_list);
          ????for?i?=?1?:?length(adjacent_arc_list)
          ????????tail?=?adjacent_arc_list(i);
          ????????if?node_label_cost(tail)>…
          node_label_cost(head)+Distance(head,tail)
          ????????????node_label_cost(tail)=…
          node_label_cost(head)+Distance(head,tail);
          ????????????node_predecessor(tail)=head;
          ????????????if?g_node_status(tail)==0
          ????????????????SE_LIST?=?[SE_LIST,tail];
          ????????????????g_node_status(tail)?=?1;
          ????????????end
          ????????end
          ????end???
          end

          %%?依據前向節(jié)點生成最短路徑
          distance_column?=?[];
          path_column?=?{};
          o_zone_id_column?=?o_zone_id?*?ones(g_number_of_nodes-1,?1);
          d_zone_id_column?=?[];
          agent_id_column?=?[1:(g_number_of_nodes-1)]';
          for?i?=?1:?size(g_node_list,?1)
          ????destination?=?g_node_list(i);
          ????if?g_origin?~=?destination
          ????????d_zone_id_column?=?[d_zone_id_column;?df_node(i,5)];
          ????????if?node_label_cost(destination)==Max_label_cost
          ????????????path="";
          ????????????distance?=?99999;
          ????????????distance_column?=?[distance_column;?99999];
          ????????else
          ????????????to_node=destination;
          ????????????path=num2str(to_node);
          ????????????while?node_predecessor(to_node)~=g_origin
          ????????????????path=strcat(';',path);
          ????????????????path=strcat(num2str(node_predecessor(to_node)),path);
          ????????????????g=node_predecessor(to_node);
          ????????????????to_node=g;
          ????????????end
          ????????????path=strcat(';',path);
          ????????????path=strcat(num2str(g_origin),path);
          ????????????distance_column?=?[distance_column;?node_label_cost(i)];
          ????????end
          ????????path_column=[path_column;path];
          ????end
          end

          title?=?{'agent_id','o_zone_id','d_zone_id','node_sequence','distance'};
          result_table=table(agent_id_column,o_zone_id_column,…
          d_zone_id_column,path_column,distance_column,'VariableNames',title);
          writetable(result_table,?'agent.csv',…
          'Delimiter',',','QuoteStrings',true)
          表3-10 MATLAB實現FIFO Label Correcting Algorithm(頁面可滑動)6802229b743579fc6484d74a324854ea.webp

          3.5 Deque Label Correcting Algorithm

          3.5.1算法介紹

          同樣,我們先回顧一下已學的三個Label Correcting Algorithms的特點:Generic Label Correcting Algorithm提出了一種新的算法框架,即Label Correcting,它允許我們以更有效、靈活的方式求解最短路問題,但它的靈活性也正是它缺點,由于規(guī)則的缺失導致算法效率不能保證;因此Modified Label Correcting Algorithm引入了可掃描列表SE_LIST來明確應該掃描哪些弧,算法雖有改進但卻帶來了新的問題,以何種規(guī)則處理SE_LIST中節(jié)點?最后FIFO Label Correcting Algorithm提出了FIFO規(guī)則來明確SE_LIST中節(jié)點的操作規(guī)則,即表3-8第7行和第13行,在相應代碼實現中體現在表3-9第46-48行和第56-59行,表3-10第49-51行和第62-64行。這里請思考下除了FIFO是最好的么?還有其他規(guī)則可以選擇么?
          接下來我們介紹另一種規(guī)則:將SE_LIST作為Deque處理。如圖3-4(a)所示,Deuqe以Left-front標記隊列的左端頭部,Left-rear標記隊列的左端尾部,Right-front標記隊列的右端頭部,Right-rear標記隊列的右端尾部,當需要進行刪除或者插入操作時可以選擇在兩端進行。

          3d5acfb935bef3d93665bab72b9e752a.webp

          圖3-4 Deque數據結構Deque Label Correcting Algorithm將SE_LIST看作一個Deque數據結構,并且規(guī)定遍歷節(jié)點時從SE_LIST的一端頭部開始(這里我們以左端頭部為例),添加節(jié)點時,如果該節(jié)點已在SE_LIST出現過中,則將其添加到SE_LIST的左端頭部,否則將其添加到SE_LIST右端尾部尾端。接下來進一步分析采用Deque數據結構的原因。假設在前次迭代中,節(jié)點已在SE_LIST中出現過,且某些節(jié)點可能將其作為前向節(jié)點。第次迭代時,已在SE_LIST中,如果節(jié)點的距離標簽再次更新后,節(jié)點將被加入SE_LIST中:如果將節(jié)點添加到SE_LIST的右端尾部,則隨后迭代時則會依次檢查等節(jié)點,并更新其他節(jié)點的距離標簽,當算法檢查到節(jié)點時,又會更新節(jié)點的距離標簽,因此建立在舊標簽基礎之上時其他距離標簽將會失效,因此降低了算法效率。而對在次迭代中從未在SE_LIST中出現的節(jié)點來說,節(jié)點將SE_LIST已有的節(jié)點作為其可能的前向節(jié)點,因此應加到SE_LIST右端尾部。因此這種處理規(guī)則是合適的。Deque Label Correcting Algorithm步驟如下。

          a3152fdd76e8117fe545b3851b11e8e9.webp

          表3-11 Deque Label Correcting Algorithm關于Deque Label Correcting Algorithm也可以參考文獻[5]進一步學習。
          復雜度分析大量研究表明,Deque方法檢查的節(jié)點數量比大多數其他標簽校正算法要少。雖然該算法時間復雜度不是多項式,但在實際應用中卻很有效。而且,該算法被證明是解決稀疏和交通網絡最短路問題最快的算法之一。

          3.5.2 算法實現

          首先給出Python版本的Deque Label Correcting Algorithm實現(求解附錄2中源節(jié)點1到其他節(jié)點的最短路徑)。
          """導入相關基礎包,定義全局變量"""
          import?pandas?as?pd
          import?numpy?as?np
          import?copy
          g_node_list=[]?#網絡節(jié)點集合
          g_node_zone={}?#網絡節(jié)點類別集合
          g_link_list=[]?#網絡弧集合
          g_adjacent_arc_list={}#節(jié)點鄰接弧集合(從節(jié)點i發(fā)出的弧集合)
          g_shortest_path=[]#最短路徑集合
          g_node_status=[]#網絡節(jié)點狀態(tài)
          g_number_of_nodes=0#網絡節(jié)點個數
          g_origin=None???#網絡源節(jié)點
          node_predecessor=[]#前向節(jié)點集合
          node_label_cost=[]#距離標簽集合
          SE_LIST=[]#可掃描節(jié)點集合
          Max_label_cost=99999#初始距離標簽
          """導入網絡數據文件,構建基礎網絡并初始化相關變量"""
          #讀取網絡節(jié)點數據
          df_node=pd.read_csv('./input_file/node.csv')
          df_node=df_node.iloc[:,:].values
          for?i?in?range(len(df_node)):
          ????g_node_list.append(df_node[i,0])
          ????g_node_zone[df_node[i,?0]]?=?df_node[i,?-1]
          ????g_number_of_nodes+=1
          ????g_adjacent_arc_list[df_node[i,0]]=[]
          ????if?df_node[i,?3]?==?1:
          ????????g_origin?=?df_node[i,?0]
          g_node_status=[0?for?i?in?range(g_number_of_nodes)]?#初始化網絡節(jié)點狀態(tài)
          Distance=np.ones((g_number_of_nodes,g_number_of_nodes))\
          *Max_label_cost?#距離矩陣
          node_predecessor=[-1]*g_number_of_nodes
          node_label_cost=[Max_label_cost]*g_number_of_nodes
          node_predecessor[g_origin-1]=0
          node_label_cost[g_origin-1]?=?0
          #讀取網絡弧數據
          df_link=pd.read_csv('./input_file/road_link.csv')
          df_link=df_link.iloc[:,:].values
          for?i?in?range(len(df_link)):
          ????g_link_list.append((df_link[i,1],df_link[i,2]))
          ????Distance[df_link[i,1]-1,df_link[i,2]-1]=df_link[i,3]
          ????g_adjacent_arc_list[df_link[i,1]].append(df_link[i,2])
          SE_LIST=[g_origin]
          g_node_status[g_origin-1]=1
          """最短路徑求解:掃描網絡弧,依據檢查最優(yōu)性條件更新距離標簽"""
          while?len(SE_LIST):
          ????head=SE_LIST[0]#從可掃描列表中取出第一個元素
          ????SE_LIST.pop(0)#從可掃描列表中刪除第一個元素
          ????g_node_status[head-1]=0
          ????adjacent_arc_list=g_adjacent_arc_list[head]#獲取當前節(jié)點的鄰接弧集合
          ????for?tail?in?adjacent_arc_list:
          ????????if?node_label_cost[tail-1]>\
          node_label_cost[head-1]+Distance[head-1,tail-1]:
          ????????????node_label_cost[tail-1]=\
          node_label_cost[head-1]+Distance[head-1,tail-1]
          ????????????node_predecessor[tail-1]=head
          ????????????if?g_node_status[tail-1]==0:
          ????????????????SE_LIST.append(tail)#將新節(jié)點添加到可掃描列表尾部,append方法實現從列表尾部添加元素
          ????????????????g_node_status[tail-1]=1
          """依據前向節(jié)點生成最短路徑"""
          agent_id=1
          o_zone_id=g_node_zone[g_origin]
          for?destination?in?g_node_list:
          ????if?g_origin!=destination:
          ????????d_zone_id=g_node_zone[destination]
          ????????if?node_label_cost[destination-1]==Max_label_cost:
          ????????????path="?"
          ????????????g_shortest_path.append([agent_id,?o_zone_id,d_zone_id,path,?node_label_cost[destination?-?1]])
          ????????else:
          ????????????to_node=copy.copy(destination)
          ????????????path=?"%s"?%?to_node
          ????????????while?node_predecessor[to_node-1]!=g_origin:
          ????????????????path="%s;"%?node_predecessor[to_node?-?1]?+?path
          ????????????????g=node_predecessor[to_node-1]
          ????????????????to_node=g
          ????????????path="%s;"%g_origin+path
          ????????????g_shortest_path.append([agent_id,?o_zone_id,d_zone_id,path,?node_label_cost[destination?-?1]])
          ????????agent_id+=1
          """將求解結果導出到csv文件"""
          #將數據轉換為DataFrame格式方便導出csv文件
          g_shortest_path=np.array(g_shortest_path)
          col=['agent_id','o_zone_id','d_zone_id','node_sequence','distance']
          file_data?=?pd.DataFrame(g_shortest_path,?index=range(len(g_shortest_path)),columns=col)
          file_data.to_csv('./3_fifo_label_correcting/agent.csv',index=False)
          表3-12 Python實現Deque Label Correcting Algorithm(頁面可滑動)接下來給出MATLAB版本的Deque Label Correcting Algorithm實現(求解附錄2中源節(jié)點1到其他節(jié)點的最短路徑)。
          %%?clear
          clc
          clear

          %%?設置變量
          g_node_list?=?[];?%網絡節(jié)點集合
          g_link_list?=?[];?%網絡弧集合
          g_origin?=?[];???%網絡源節(jié)點
          g_number_of_nodes?=?0;%網絡節(jié)點個數
          node_predecessor?=?[];%前向節(jié)點集合
          node_label_cost?=?[];%距離標簽集合
          Max_label_cost?=?inf;?%初始距離標簽
          g_adjacent_arc_list={};?%節(jié)點鄰接弧集合(從節(jié)點i發(fā)出的弧集合)
          g_node_status=[];?%網絡節(jié)點狀態(tài)
          SE_LIST=[];?%可掃描節(jié)點集合

          %%?導入網絡數據文件,構建基礎網絡并初始化相關變量
          %讀取網絡節(jié)點數據
          df_node?=?csvread('node.csv',1,0);
          g_number_of_nodes?=?size(df_node,1);
          g_node_list?=?df_node(:,1);
          g_node_status?=?zeros(1,g_number_of_nodes);
          for?i?=?1?:?g_number_of_nodes
          ????if?df_node(i,4)==1
          ????????g_origin=df_node(i,1);
          ????????o_zone_id?=?df_node(i,5);
          ????end
          end
          Distance?=?ones(g_number_of_nodes,g_number_of_nodes)*Max_label_cost;?
          %距離矩陣
          node_predecessor?=?-1*ones(1,g_number_of_nodes);
          node_label_cost?=?Max_label_cost*ones(1,g_number_of_nodes);
          node_predecessor(1,g_origin)?=?0;
          node_label_cost(1,g_origin)?=?0;
          g_adjacent_arc_list?=?cell(1,?g_number_of_nodes);
          %讀取網絡弧數據
          df_link?=?csvread('road_link.csv',1,0);
          g_link_list?=?df_link(:,2:3);
          for?i?=?1?:?size(df_link,?1)?
          ????Distance(df_link(i,2),df_link(i,3))?=?df_link(i,4);
          ????g_adjacent_arc_list{df_link(i,2)}?=?[g_adjacent_arc_list{df_link(i,2)},?df_link(i,3)];
          end

          %%?最短路徑求解:掃描網絡弧,依據檢查最優(yōu)性條件更新距離標簽
          SE_LIST=[g_origin];
          g_node_status(g_origin)=1;
          while?~isempty(SE_LIST)
          ????head=SE_LIST(1);?%從可掃描列表中取出第一個元素
          ????SE_LIST(1)=[];?%從可掃描列表中刪除第一個元素
          ????g_node_status(head)?=?2;
          adjacent_arc_list?=?g_adjacent_arc_list(head);?
          %獲取當前節(jié)點的鄰接弧
          ????adjacent_arc_list?=?cell2mat(adjacent_arc_list);
          ????for?i?=?1?:?length(adjacent_arc_list)
          ????????tail?=?adjacent_arc_list(i);
          ????????if?node_label_cost(tail)>…
          node_label_cost(head)+Distance(head,tail)
          ????????????node_label_cost(tail)=…
          node_label_cost(head)+Distance(head,tail);
          ????????????node_predecessor(tail)=head;
          ????????????if?g_node_status(tail)==0
          ????????????????SE_LIST?=?[SE_LIST,?tail];
          ????????????????g_node_status(tail)?=?1;
          ????????????elseif?g_node_status(tail)?==?2
          ????????????????SE_LIST?=?[tail,?SE_LIST];
          ????????????????g_node_status(tail)?=?1;
          ????????????end
          ????????end
          ????end???
          end

          %%?依據前向節(jié)點生成最短路徑
          destination_column?=?[];
          distance_column?=?[];
          path_column?=?{};
          o_zone_id_column?=?o_zone_id?*?ones(g_number_of_nodes-1,?1);
          d_zone_id_column?=?[];
          agent_id_column?=?[1:(g_number_of_nodes-1)]';
          for?i?=?1:?size(g_node_list,?1)
          ????destination?=?g_node_list(i);
          ????if?g_origin?~=?destination
          ????????destination_column?=?[destination_column;?destination];
          ????????d_zone_id_column?=?[d_zone_id_column;?df_node(i,5)];
          ????????if?node_label_cost(destination)==Max_label_cost
          ????????????path="";
          ????????????distance?=?99999;
          ????????????distance_column?=?[distance_column;?99999];
          ????????else
          ????????????to_node=destination;
          ????????????path=num2str(to_node);
          ????????????while?node_predecessor(to_node)~=g_origin
          ????????????????path=strcat(';',path);
          ????????????????path=strcat(num2str(node_predecessor(to_node)),path);
          ????????????????g=node_predecessor(to_node);
          ????????????????to_node=g;
          ????????????end
          ????????????path=strcat(';',path);
          ????????????path=strcat(num2str(g_origin),path);
          ????????????distance_column?=?[distance_column;?node_label_cost(i)];
          ????????end
          ????????path_column=[path_column;path];
          ????end
          end

          title?=?{'agent_id','o_zone_id','d_zone_id','node_sequence','distance'};
          result_table=table(agent_id_column,o_zone_id_column,…
          d_zone_id_column,path_column,distance_column,'VariableNames',title);
          writetable(result_table,?'agent.csv',…
          'Delimiter',',','QuoteStrings',true)
          表3-13 MATLAB實現Deque Label Correcting Algorithm(頁面可滑動)

          欲下載本文代碼資料,請移步留言區(qū)






          周學松教授?是亞利桑那州立大學(ASU)可持續(xù)工程與建筑環(huán)境學院教授,目前是Transportation Research Part C的副主編,城市軌道交通urbanrail transit 執(zhí)行主編,Transportation Research Part B的編委。主要研究大規(guī)模多模式交通系統優(yōu)化和仿真算法。

          文案&編輯:崔贊揚、李崇楠(北京交通大學)審稿人:鄧發(fā)珩、周航、向柯瑋(華中科技大學管理學院)指導老師:周學松(Arizona State University)如對文中內容有疑問,歡迎交流。(PS:部分資料來自網絡)
          如有需求,可以聯系崔贊揚(北京交通大學博士:[email protected]李崇楠(北京交通大學本科:[email protected]周學松(Arizona State University Professor:? [email protected]鄧發(fā)珩(華中科技大學本科三年級:? [email protected]、個人公眾號:程序猿聲)周航(華中科技大學本科一年級:[email protected]向柯瑋(華中科技大學本科一年級:[email protected]排版:程欣悅([email protected]



          推薦閱讀:

          干貨 | 想學習優(yōu)化算法,不知從何學起?

          干貨 | 運籌學從何學起?如何快速入門運籌學算法?

          干貨 | 學習算法,你需要掌握這些編程基礎(包含JAVA和C++)

          干貨 | 算法學習必備訣竅:算法可視化解密

          干貨 | 模擬退火、禁忌搜索、迭代局部搜索求解TSP問題Python代碼分享
          記得點個在看支持下哦~c2e1a251e5b3d0c0837ea1d65169e3c3.webp
          瀏覽 97
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  男插女视频网站 | 色婷婷在线小视频 | 三级欧美视频麻豆传媒 | 无码Aⅴ | g国产欧美一区二区精品性色超碰 |