草庐IT

Matlab | 车辆路径规划应用实例(含源码)

KAU的云实验台 2023-04-18 原文

在介绍了基本的TSP路径优化算法及简单示例后,针对现实中更加复杂的应用环境,其约束条件以及优化目标也将更加复杂,因此本文旨在更加复杂的VRP(Vehicle Routing Problem)数学模型下进行路径优化,帮助大家将模型与编程思想结合起来,希望能对各位有所帮助。

本文将以基于北斗的车辆路径问题动态规划研究为例进行论文的部分复现。

00 目录

车辆路径规划数学模型

混沌优化算法

算法流程

MATLAB程序实现

01 车辆路径规划数学模型

(来源于文献)

以用时最少建立车辆路径模型适度值函数:

02 混沌优化算法

 

03 算法流程

 

 04 MATLAB程序实现

4.1 算例说明

 

 4.2 MATLAB程序实现

本文只对第一部分的问题进行求解,后面的规则修改其实也是在第一部分基础上稍作修改,因此以第一部分为主即可。


% <problem><路径动态规划>
%---------------------------     Date      ---------------------------------
% 2022/5/10 - - > 2022
%---------------------------------------------------------------------------

clear all
clc

%% 参数

ST = xlsread('参数.xlsx','F2:G28');  %路径标号
X_Y = xlsread('参数.xlsx','A2:B14'); %坐标
N = size(X_Y,1);                       %路段个数
RV = xlsread('参数.xlsx','C2:C28');  %安全性
RV = transfer(RV,ST,N,1);
SV = xlsread('参数.xlsx','D2:D28');  %突发事件
SV = transfer(SV,ST,N);
TV = xlsread('参数.xlsx','E2:E28');  %延误
TV = transfer(TV,ST,N);
DS = Distanse(X_Y);                  %生成距离矩阵
X = zeros(N,N);                      %路径是否连通  0-12 连通赋1
for i=1:size(ST,1)
    X(ST(i,1)+1,ST(i,2)+1) = 1;
    X(ST(i,2)+1,ST(i,1)+1) = 1;
end
BL = double( RV==0 | SV==1 | TV==1); %受损路段
CT = [];                             %优化路径存储
m  = 1000;                           %最大搜索次数
T0 = 1;TD = 12;                      %出发与目标路段


%% 遗传参数

NIND   = 100;  %种群大小
MAXGEN = m;    %最大遗传代数
Pc     = 0.9;  %交叉概率
Pm     = 0.05; %变异概率
GGAP   = 0.9;  %代沟

%% 初始化种群

Chrom = InitPop(NIND,N,X,T0,TD);

%% 画出随机解的路径图

DrawPath(Chrom(1,:),X_Y);hold off
pause(0.0001)

%% 输出随机解的路径和总用时

disp('初始种群中的一个随机值:')
OutputPath(Chrom(1,:));
Rlength = Fitness(DS,RV,TV,SV,X,N,Chrom(1,:));
disp(['总距离:',num2str(Rlength)]);
disp('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')

%% GA优化

gen = 0;

for i=1:size(Chrom,1)
    ObjV(i) = Fitness(DS,RV,TV,SV,X,N,Chrom(i,:));  %计算路径长度
end
preObjV=min(ObjV);

while gen<MAXGEN
    %% 计算适应度
    
    for i=1:size(Chrom,1)
        ObjV(i) = Fitness(DS,RV,TV,SV,X,N,Chrom(i,:));  %计算路径长度
    end
    
    
    preObjV = min(ObjV);
    FitnV   = 1./ObjV;
    
    %% 选择
    
    SelCh = Select(Chrom,FitnV,GGAP);
    
    %% 产生混沌序列
    p=2;
    x = abs(rand);
    u=4;
    for i=1:N
        x(p) = u*x(p-1)*(1-x(p-1));
        p=p+1;
    end
    
    %% 混沌优化
    b = rand;
    if b>=0.5
        % 交叉操作
        SelCh = Recombin(SelCh,Pc,X,TD,T0,x);
    else
        % 变异
        SelCh = Mutate(SelCh,Pm,X,TD,T0,x);
        
    end
    
    %% 重插入子代的新种群
    
    Chrom = Reins(Chrom,SelCh,ObjV);
    
    %% 更新迭代次数
    
    gen=gen+1 ;
    
end
%% 画出最优解的路径图
for i=1:size(Chrom,1)
    ObjV(i) = Fitness(DS,RV,TV,SV,X,N,Chrom(i,:));  %计算路径长度
end

[minObjV,minInd]=min(ObjV);
DrawPath(Chrom(minInd(1),:),X_Y)

%% 输出最优解的路径和总距离

disp('最优解:')
p=OutputPath(Chrom(minInd(1),:));
disp(['总距离:',num2str(ObjV(minInd(1)))]);
disp('-------------------------------------------------------------')

其中,比较困难的是初始种群的产生规则,下面将贴出初始种群产生程序,并作了详细注释,本人能力有限,欢迎各位大佬一起讨论。

InitPop.m

%% 初始化种群
%输入:
% NIND:种群大小
% N:   个体染色体长度(这里为城市的个数)
%输出:
%初始种群
function Way = InitPop(NIND,N,X,T0,TD)

Way=zeros(NIND,N);%用于存储种群

for i=1:NIND

    flag = 1;% 判定标志 若flag==1则产生的路径不符合约束 flag==0符合约束
    while flag==1 
        Way(i,1)=T0; % 出发点
        p=2;  % p为下一个点

        newway = T0; %下一个路径的代号
        while newway~=TD % 如果下一个路径不是终点
            % 约束1 判断是否有路可走
            if wayjuge(newway,X,Way(i,:)) %判断这个路径后可选择的路径有哪些 如果有可选择的就随机选择一个
                %还有空余成员能选择
                newway = Randomway(newway,X,Way(i,:)); % 更新下一个路径
                Way(i,p) = newway; % 代入路径矩阵
                p = p+1; % 更新下一个点
            else
                %无路可走 重新来
                Way(i,:) = zeros(1,N); % 该点后面没有可选路径 重新赋0
                Way(i,1)=T0; %从初始点开始
                p=2; %同上
                newway = T0;%同上
            end
            
        end
        % 最终约束 包括不能包含重复节点 不少于最小节点数 最后一个点是终点
        % Way包含了不同路径,长度也不同
        flag = test(Way(i,:),TD); % 如果满足约束 赋值0 否则继续循环
    end
    
end

4.3 优化结果

一个随机的路径如下:

经过算法优化后的路径如下,可以看到和原文中的初始路径结果保持一致。

以上就是本文的全部内容,任何问题欢迎大家积极讨论,代码地址:

链接:https://pan.baidu.com/s/1dZpO5B-WhnWKGAtxL0RKhQ?pwd=1111 
提取码:1111

欢迎关注作者微信公众号:川子凯 不定时分享有趣的代码或日常

有关Matlab | 车辆路径规划应用实例(含源码)的更多相关文章

  1. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  2. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  3. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  4. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  5. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  6. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  7. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  8. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  9. ruby-on-rails - RSpec:避免使用允许接收的任何实例 - 2

    我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_

  10. ruby-on-rails - 使用 ruby​​ 将多个实例变量转换为散列的更好方法? - 2

    我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。

随机推荐