在介绍了基本的TSP路径优化算法及简单示例后,针对现实中更加复杂的应用环境,其约束条件以及优化目标也将更加复杂,因此本文旨在更加复杂的VRP(Vehicle Routing Problem)数学模型下进行路径优化,帮助大家将模型与编程思想结合起来,希望能对各位有所帮助。
本文将以基于北斗的车辆路径问题动态规划研究为例进行论文的部分复现。
车辆路径规划数学模型
混沌优化算法
算法流程
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



链接:https://pan.baidu.com/s/1dZpO5B-WhnWKGAtxL0RKhQ?pwd=1111
提取码:1111
欢迎关注作者微信公众号:川子凯 不定时分享有趣的代码或日常
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行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
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如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
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
我正在处理旧代码的一部分。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_
我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作: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作为该等式的第二部分,但这仍然是主要问题。