1. 程式人生 > 其它 >【元胞自動機】基於元胞自動機模擬和改進遺傳演算法的動態網路分配模型分析matlab模擬

【元胞自動機】基於元胞自動機模擬和改進遺傳演算法的動態網路分配模型分析matlab模擬

一、模型簡介

二、交通路網元胞自動機模型改進

在動態網路分配的過程就是將同一節點或者路段具有相同起訖點的車輛分配到相應路 段中去,主要考慮的是交通路網上的幾何限制以及交叉口的轉向限制。研究動態交通網路 分配的重要環節就是研究交叉口的訊號控制對交通流產生的決策影響,在車流運動中找尋 最佳決策方案是該研究需要達到的目標。為了有效模擬微觀車輛在交通路網上的通行情況 以及在交叉口的轉向情況,需要提出合適的元胞自動機模型,此外還需要保證流量計算的 約束以及滿足流量守恆的條件。元胞自動機的執行中產生的實際數值方便理論分析,故接 下來介紹本文用於研究動態網路分配的元胞自動機模型。

2.1車道的元胞自動機模型

2.2 交叉口的元胞自動機模型

2.4雙目標網路流分配方法

三、NSGA-II演算法簡介

NSGA—II 演算法的基本思想為:初始時,隨機產生規模為 N 的初始種群,根據問題範 圍和約束初始化總體,非支配排序後通過遺傳演算法的選擇、交叉、變異三個基本操作得到 第一代子代種群;從第二代開始,將已初始化的群體按照非支配標準的進行分類,進行快 速非支配排序,排序完成後,擁擠距離值正面分配,根據等級和擁擠距離選擇種群中的個 體,同時計算每個非支配層中的個體的擁擠度,選取合適的個體組成新的父代種群,計算 方式以非支配關係以及個體的擁擠度為根據;使用具有擁擠比較運算子的二元錦標賽選擇 來執行個體的選擇;使用模擬二進位制交叉和多項式變異的實數編碼 GA;將後代種群和當 代世代種群組合,並通過選擇來設定下一代的個體,隨後每個陣營填補新一代,直到種群 規模超過當前種群規模。相應的程式流程圖如圖 3.1 所示。

四、基於元胞自動機的城市動態網路分配的數值模擬

五、部分程式碼

%% 執行所有程式執行及畫圖
%% 主指令碼程式
clear;clc;

o = 0;
pa = [0.8,0.5,0.3];
T = [5,5];
N = 500;
vmax = 5;
k = [0.05,0.15];
draw = 1;

tic
[JL,JL_in,r,alloc_info]= CAtraffic(o,pa,T,N,vmax,k,draw);
toc
xlswrite('final_data.xlsx',alloc_info,1);%輸出最終的分配以及阻抗延誤資料
%% 二維時空分佈圖
str_data = ['k.';'b.';'c.';'g.';'m.';'r.';'y.'];
tic
figure(2);
cnt = 1;
set(gcf,'outerposition',get(0,'screensize'));
set(gca,'looseInset',[0 0 0 0]);
for i = 1 : N
    str = str_data(mod(ceil(10 * rand())+1,7)+1 );
for j = 1:90
    for k = 1 : 120
        if JL{i,1}{1,1}(j,k) > 0
            plot3(j,k,i,[str,'.']);
            hold on;
        end
     if ~mod(cnt,10000)
         clc;
        fprintf('二維時空分佈圖繪製 %2.2f%%  completed\n',(cnt/(N*90*120))*100);
     end
     cnt = cnt +1;
    end
end
end
set(gca,'FontSize',24,'Fontname', 'Times New Roman');
xlabel('南北方向');
ylabel('東西方向');
zlabel('時間');
set(get(gca,'XLabel'),'Fontsize',24,'Fontname', '宋體');
set(get(gca,'YLabel'),'Fontsize',24,'Fontname', '宋體');
set(get(gca,'ZLabel'),'Fontsize',24,'Fontname', '宋體');
fprintf('開始儲存\n');
set(gca,'looseInset',[0 0 0 0]);
print(2,'-dpng','-r300','二維時空分佈圖');
toc

%% 流量密度時間圖
tic
disp('流量密度時間圖繪製')
flow = zeros(1,N);
density = zeros(1,N);
for i = 1:N
    flow(i) = sum(JL{i,1}{1,2}(16,:))/120;
    density(i) = sum(JL{i,1}{1,1}(16,:))/120;
end
time = 1:N;
PlotGriddata(density',time',flow');
toc

六、模擬結果