四阶段法-出行分布计算 底特律法

底特律法计算未来出行分布

% trans_planning 计算未来出行量分布
function main()
clc;clear;
confirm = 0;
while confirm  == 0
    inner = 0; % 是否使用算例标识
    e = input('确定本次计算使用误差精度(推荐0.03):');
    OD = input('请输入当前交通量方阵(输入1使用算例1,输入2使用算例2):');
    if OD == 1
        inner = 1;confirm = 1;
        Gi1 = [2 1 4 3];% 产生量增长系数
        Gj1 = Gi1;       % 吸引量增长系数
        OD1 = [ 0 25 10 5;
        0 0 15 10;
        0 0 0 5;
        0 0 0 0];  
        OD1 = OD1 + OD1'; % 初始出行分布
        OD = OD1;
        Gi = Gi1;Gj = Gj1;
    elseif OD ==2
        inner = 1;confirm = 1;
        OD2 = [17 7 4;
        7 38 6;
        4 5 17];
        P_0 = sum(OD2,1);
        A_0 = sum(OD2,2)';
        P_f = [38.6 91.9 36];
        A_f = [39.3 90.3 36.9];
        Gi2 = P_f./P_0;
        Gj2 = A_f./A_0;
        OD = OD2;Gi = Gi2;Gj = Gj2;
    else
        choice = input('以预测交通量输入选1,以增长系数输入选2:');
        if choice == 1
            P_f = input('请输入发生量向量,格式为行向量:');
            A_f = input('请输入吸引量向量,格式为行向量:');
            P_0 = sum(OD,1);
            A_0 = sum(OD,2)';
            Gi = P_f./P_0;
            Gj = A_f./A_0;
        elseif choice == 2
            Gi = input('请输入发生量增长系数向量,格式为行向量:');
            Gj = input('请输入吸引量增长系数向量,格式为行向量:');
        else
            disp('选择发生错误');
            return;
        end
    end
    if inner == 0
        disp('确认输入:');
        disp('当前交通量分布矩阵:');disp(OD);
        if choice == 1
            disp('预测各区发生量分布');disp(P_f);
            disp('预测各区吸引量分布');disp(A_f);
        else
            disp('预测各区发生量增长系数');disp(Gi);
            disp('预测各区吸引量增长系数');disp(Gj);
        end
        confirm = input('确认数据输入1,重新录入数据输入0:');
    end
end

[OD_f alpha m] = MyDetroit(OD,Gi,Gj,e);
disp('未来交通量分布:');
disp(OD_f);
for i = 1:size(OD_f,2)
OD_f{i}
end
disp(['当前精度:',num2str(e),'    迭代次数:',num2str(m)]);
printfile = input('是否打印结果报告(1是,2否):');
if printfile == 1
    OD_f = cell2mat(OD_f);
    file = fopen('report.txt','w+'); 
    fprintf(file,'%s\n','未来交通量分布:');
    [row col] = size(OD_f);
    for i = 1:row
        for j = 1:col
            if j == col
                fprintf(file,'%g\n',OD_f(i,j));
            else
                fprintf(file,'%g\t',OD_f(i,j));
            end
        end
    end
    fprintf(file,'当前精度:%d\t迭代次数:%d',e,m);
    fclose(file);
else
    return;
end
end

function [OD_f alpha m] = MyDetroit(OD,Gi,Gj,e)
%% 参数计算
if size(OD,1) ~= length(Gi) || size(OD,2) ~= length(Gj)
    disp("增长系数维度与出行量矩阵维度不符");
    return;
end
Gavg = sum(OD,1)*Gi'/sum(sum(OD,1)); % 计算出行分布的平均增长系数

P_0 = sum(OD,1); %计算各区当前发生量
A_0 = sum(OD,2)'; %计算各区当前吸引量

P_f0 = P_0.*Gi; % 计算未来各区发生量
A_f0 = A_0.*Gj; % 计算未来各区吸引量

flag = 0;
m = 0;
while(flag == 0 && m < 100)
    %计算分区之间未来分布量
    for i = 1:size(OD,1)
        for j = 1:size(OD,2)
            OD(i,j) = OD(i,j)*Gi(i)*Gj(j)/Gavg;
        end
    end
    %计算调整系数
    P_f = sum(OD,1);
    A_f = sum(OD,2)';
    %alpha1 = Gi.*P_0./P_f;
    %alpha2 = Gj.*A_0./A_f;
    alpha1 = P_f0./P_f;
    alpha2 = A_f0./A_f;
    Gi = alpha1;Gj = alpha2;
    Gavg = sum(P_f0)/sum(P_f);
    %检验alpha是否符合要求
    for k = 1:length(alpha1)
        if alpha1(k)<=1+e && alpha1(k) >= 1-e
            flag = 1;
        else
            flag =0;
            break;
        end
    end
    for k = 1:length(alpha2)
        if alpha2(k)<=1+e && alpha2(k) >= 1-e
            flag = 1;
        else
            flag =0;
            break;
        end
    end
    m = m+1;
    alpha(m,:) = alpha1;
    pf(m) = sum(P_f);
    OD_f{m} = OD;
end
if m >= 100 && flag == 0
    disp("算法发散,计算失败");
    return;
end
end

你可能感兴趣的:(matlab,数据结构与算法,四阶段法,交通规划,底特律法)