tsp算法代码
Ⅰ 求一个TSP的matlab程序
蚂蚁算法实现tsp。其中city是n行2列的矩阵,表示n个城市的经纬度,iter_max是最大循环次数,其余是蚂蚁算法的参数。
function [Shortest_Route,Shortest_Length]=anttsp(city,iter_max,m,Alpha,Beta,Rho,Q)
n=size(city,1);
d=zeros(n,n);
d=squareform(pdist(city));
Eta=1./d;
Tau=ones(n,n);
Tabu=zeros(m,n);
nC=1;
R_best=zeros(iter_max,n);
L_best=inf.*ones(iter_max,1);
while nC<=iter_max
route=[];
for i=1:ceil(m/n)
route=[route,randperm(n)];
end
Tabu(:,1)=(route(1,1:m))';
for j=2:n
for i=1:m
visited=Tabu(i,1:(j-1));
J=zeros(1,(n-j+1));
P=J;
Jc=1;
for k=1:n
if isempty(find(visited==k, 1))
J(Jc)=k;
Jc=Jc+1;
end
end
for k=1:length(J)
P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta);
end
P=P/(sum(P));
Pcum=cumsum(P);
Select=find(Pcum>=rand);
if isempty(Select)%是不是一定能保证Select不为空
Tabu(i,j)=round(1+(n-1)*rand);
else
next_visit=J(Select(1));
Tabu(i,j)=next_visit;
end
end
end
if nC>=2
Tabu(1,:)=R_best(nC-1,:);
end
L=zeros(m,1);
for i=1:m
R=Tabu(i,:);
for j=1:(n-1)
L(i)=L(i)+d(R(j),R(j+1));
end
L(i)=L(i)+d(R(1),R(n));
end
L_best(nC)=min(L);
pos=find(L==L_best(nC));
R_best(nC,:)=Tabu(pos(1),:);
nC=nC+1;
Delta_Tau=zeros(n,n);
for i=1:m
for j=1:(n-1)
Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);
end
Delta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);
end
Tau=(1-Rho).*Tau+Delta_Tau;
Tabu=zeros(m,n);
end
Pos=find(L_best==min(L_best));
Shortest_Route=R_best(Pos(1),:);
Shortest_Length=L_best(Pos(1));
end
Ⅱ TSP遗传算法的求问!!!!
知道每个城市间距离就可以了,先把40乘40的距离矩阵列到excel里面,然后套入经典的遗传算法代码中运行就可以了。 软件中的Lingo有经典的tsp代码,下载破解版的lingo,然后运行就可以了。那个经典代码只能解决小规模的tsp,大规模的tsp需要用智能算法。100个城市只需要2分钟。40个只要几秒。 你可以到网上搜代码。
Ⅲ 急求tsp问题算法的源代码(c++)
将k=0,lb,x[1:n]=0存入PT
while(PT不为空)
{ 从PT中取出lb值最小元素
k=k+1;
for(i=1; i<=n; i++)
{ x[k]=i;
if(c[i][x[k-1]<+∞)
{ die=0;计算 lb ;
for(j=1; j<k; j++)
if (x[j]=x[k]) {die=1; break; }
if(die=0 and lb<up) 将k,lb,x[1:n]存入PT
}
}
if(k=n) { lb=c[x[1]][x[2]]+…+c[x[n-1]][x[n]]+c[x[1]][x[n]]
if (lb 是PT中最小值) 输出解,结束
else{ up=lb;删除 PT中lb>=up元素 }
}
}
哈哈,楼上对了
Ⅳ 贪心算法TSP问题,有代码但是看不懂,求注释
int[] part = new int[3];//这里定义了3个int数组空间 { 0,1,2}
pat[1]=2;//数据的第二位设置为2
Ⅳ 在MATLAB中用蚁群算法求解TSP问题,在经典的代码中有Tabu(1,:)=R_best(NC-1,:)。不明白代码的目的。
正在做。我是这样理解的:
if NC >= 2
Tabu(1,:) = R_best(NC-1,:);
%把上一次迭代中最佳路线经历的城市放到本次Tabu的第一行
%相当是加了一个约束条件,如果本次迭代的情况不好,至少不会按照不好的最优解去更新信息素,让下次的情况更差
end
Ⅵ 遗传算法tsp 城市100个 种群个数应该是多少
个体基因数为100,建议种群数为100*(3~5)
遗传代数为100*(8~10)
Ⅶ 遗传算法求解tsp问题的matlab程序
把下面的(1)-(7)依次存成相应的.m文件,在(7)的m文件下运行就可以了
(1) 适应度函数fit.m
function fitness=fit(len,m,maxlen,minlen)
fitness=len;
for i=1:length(len)
fitness(i,1)=(1-(len(i,1)-minlen)/(maxlen-minlen+0.0001)).^m;
end
(2)个体距离计算函数 mylength.m
function len=myLength(D,p)
[N,NN]=size(D);
len=D(p(1,N),p(1,1));
for i=1:(N-1)
len=len+D(p(1,i),p(1,i+1));
end
end
(3)交叉操作函数 cross.m
function [A,B]=cross(A,B)
L=length(A);
if L<10
W=L;
elseif ((L/10)-floor(L/10))>=rand&&L>10
W=ceil(L/10)+8;
else
W=floor(L/10)+8;
end
p=unidrnd(L-W+1);
fprintf('p=%d ',p);
for i=1:W
x=find(A==B(1,p+i-1));
y=find(B==A(1,p+i-1));
[A(1,p+i-1),B(1,p+i-1)]=exchange(A(1,p+i-1),B(1,p+i-1));
[A(1,x),B(1,y)]=exchange(A(1,x),B(1,y));
end
end
(4)对调函数 exchange.m
function [x,y]=exchange(x,y)
temp=x;
x=y;
y=temp;
end
(5)变异函数 Mutation.m
function a=Mutation(A)
index1=0;index2=0;
nnper=randperm(size(A,2));
index1=nnper(1);
index2=nnper(2);
%fprintf('index1=%d ',index1);
%fprintf('index2=%d ',index2);
temp=0;
temp=A(index1);
A(index1)=A(index2);
A(index2)=temp;
a=A;
end
(6)连点画图函数 plot_route.m
function plot_route(a,R)
scatter(a(:,1),a(:,2),'rx');
hold on;
plot([a(R(1),1),a(R(length(R)),1)],[a(R(1),2),a(R(length(R)),2)]);
hold on;
for i=2:length(R)
x0=a(R(i-1),1);
y0=a(R(i-1),2);
x1=a(R(i),1);
y1=a(R(i),2);
xx=[x0,x1];
yy=[y0,y1];
plot(xx,yy);
hold on;
end
end
(7)主函数
clear;
clc;
%%%%%%%%%%%%%%%输入参数%%%%%%%%
N=50; %%城市的个数
M=100; %%种群的个数
C=100; %%迭代次数
C_old=C;
m=2; %%适应值归一化淘汰加速指数
Pc=0.4; %%交叉概率
Pmutation=0.2; %%变异概率
%%生成城市的坐标
pos=randn(N,2);
%%生成城市之间距离矩阵
D=zeros(N,N);
for i=1:N
for j=i+1:N
dis=(pos(i,1)-pos(j,1)).^2+(pos(i,2)-pos(j,2)).^2;
D(i,j)=dis^(0.5);
D(j,i)=D(i,j);
end
end
%%如果城市之间的距离矩阵已知,可以在下面赋值给D,否则就随机生成
%%生成初始群体
popm=zeros(M,N);
for i=1:M
popm(i,:)=randperm(N);
end
%%随机选择一个种群
R=popm(1,:);
figure(1);
scatter(pos(:,1),pos(:,2),'rx');
axis([-3 3 -3 3]);
figure(2);
plot_route(pos,R); %%画出种群各城市之间的连线
axis([-3 3 -3 3]);
%%初始化种群及其适应函数
fitness=zeros(M,1);
len=zeros(M,1);
for i=1:M
len(i,1)=myLength(D,popm(i,:));
end
maxlen=max(len);
minlen=min(len);
fitness=fit(len,m,maxlen,minlen);
rr=find(len==minlen);
R=popm(rr(1,1),:);
for i=1:N
fprintf('%d ',R(i));
end
fprintf('\n');
fitness=fitness/sum(fitness);
distance_min=zeros(C+1,1); %%各次迭代的最小的种群的距离
while C>=0
fprintf('迭代第%d次\n',C);
%%选择操作
nn=0;
for i=1:size(popm,1)
len_1(i,1)=myLength(D,popm(i,:));
jc=rand*0.3;
for j=1:size(popm,1)
if fitness(j,1)>=jc
nn=nn+1;
popm_sel(nn,:)=popm(j,:);
break;
end
end
end
%%每次选择都保存最优的种群
popm_sel=popm_sel(1:nn,:);
[len_m len_index]=min(len_1);
popm_sel=[popm_sel;popm(len_index,:)];
%%交叉操作
nnper=randperm(nn);
A=popm_sel(nnper(1),:);
B=popm_sel(nnper(2),:);
for i=1:nn*Pc
[A,B]=cross(A,B);
popm_sel(nnper(1),:)=A;
popm_sel(nnper(2),:)=B;
end
%%变异操作
for i=1:nn
pick=rand;
while pick==0
pick=rand;
end
if pick<=Pmutation
popm_sel(i,:)=Mutation(popm_sel(i,:));
end
end
%%求适应度函数
NN=size(popm_sel,1);
len=zeros(NN,1);
for i=1:NN
len(i,1)=myLength(D,popm_sel(i,:));
end
maxlen=max(len);
minlen=min(len);
distance_min(C+1,1)=minlen;
fitness=fit(len,m,maxlen,minlen);
rr=find(len==minlen);
fprintf('minlen=%d\n',minlen);
R=popm_sel(rr(1,1),:);
for i=1:N
fprintf('%d ',R(i));
end
fprintf('\n');
popm=[];
popm=popm_sel;
C=C-1;
%pause(1);
end
figure(3)
plot_route(pos,R);
axis([-3 3 -3 3]);
Ⅷ matlab 模拟退火算法求解TSP问题源代码
我这有飞机巡航的代码,本质上和旅行商问题一样,代码如下(非原创):
functionmySim()
disp('模拟退火求巡航路径');
data=xlsread('飞机巡航数据.xlsx','sheet1','C4:J28');
x=data(:,1:2:8);x=x(:);
y=data(:,2:2:8);y=y(:);
si=[xy];d1=[70,40];
si=[d1;si;d1];
sj=si;
sj=sj*pi/180;%经纬度化为弧度制
d=zeros(102);%距离矩阵d
fori=1:101
forj=i+1:102
temp=cos(sj(i,1)-sj(j,1))*cos(sj(i,2))*cos(sj(j,2))+sin(sj(i,2))*sin(sj(j,2));
d(i,j)=6370*acos(temp);
end
end
d=d+d';%生成距离矩阵
S0=[];%用于存放最优路径
Sum=inf;%用于存放最优解
rand('state',sum(clock));%设随机种子
forj=1:1000
S=[11+randperm(100),102];%randperm(n)用于随机生成1到n的一个排列
temp=0;
fori=1:101
temp=temp+d(S(i),S(i+1));
end
iftemp<Sum
S0=S;Sum=temp;
end
end
e=0.1^30;L=20000;at=0.999;T=1;
%退火过程
fork=1:L
%产生新解
c=2+floor(100*rand(1,2));%floor向下取整,rand(m,n)生成m*n阶(0,1)随机矩阵
c=sort(c);%顺序排列
c1=c(1);c2=c(2);
%计算代价函数值
df=d(S0(c1-1),S0(c2))+d(S0(c1),S0(c2+1))-d(S0(c1-1),S0(c1))-d(S0(c2),S0(c2+1));
%接受准则
ifdf<0
S0=[S0(1:c1-1),S0(c2:-1:c1),S0(c2+1:102)];
Sum=Sum+df;
elseifexp(-df/T)>rand(1)
S0=[S0(1:c1-1),S0(c2:-1:c1),S0(c2+1:102)];
Sum=Sum+df;
end
T=T*at;
ifT<e
break;
end
end
%输出巡航路径及路径长度
S0,Sum
%巡航时间
v=xlsread('飞机巡航数据.xlsx','sheet1','A2');
time=Sum/v(1,1)
%画出路径图
r=size(sj,1);
fori=1:r-1;
plot([si(S0(i),1)si(S0(i+1),1)],[si(S0(i),2)si(S0(i+1),2)],'*');
line([si(S0(i),1)si(S0(i+1),1)],[si(S0(i),2)si(S0(i+1),2)]);
holdon
end
Ⅸ C语言遗传算法在求解TSP问题 毕业论文+源代码
目
录
摘要
I
Abstract
II
引
言
1
第一章
基本遗传算法
2
1.1
遗传算法的产生及发展
3
1.2
基本原理
3
1.3
遗传算法的特点
3
1.4
基本遗传算法描述
5
1.5
遗传算法构造流程
6
第二章
遗传算法的实现技术
6
2.1
编码方法
7
2.1.1
二进制编码
7
2.1.2
格雷码编码
7
2.1.3
符点数编码
8
2.1.4
参数编码
8
2.2
适应度函数
10
2.3
选择算子
10
2.4
交叉算子
10
2.4.1
单点交叉算子
10
2.4.2
双点交叉算子
11
2.4.3
均匀交叉算子
11
2.4.4
部分映射交叉
11
2.4.5
顺序交叉
12
2.5
变异算子
12
2.6
运行参数
12
2.7
约束条件的处理方法
13
2.8
遗传算法流程图
14
第三章
遗传算法在TSP上的应用
15
3.1
TSP问题的建模与描述
15
3.2
对TSP的遗传基因编码方法
16
3.3
针对TSP的遗传操作算子
17
3.3.1
选择算子
17
3.3.1.1
轮盘赌选择
17
3.3.1.2
最优保存策略选择
17
3.3.2
交叉算子
20
3.3.2.1
单点交叉
20
3.3.2.2
部分映射交叉
21
3.3.3
变异算子
23
3.4
TSP的混和遗传算法
26
第四章
实例分析
27
4.1
测试数据
27
4.2
测试结果
27
4.3
结果分析
27
摘
要
TSP
(Traveling
Salesman
Problem)旅行商问题是一类典型的NP完全问题,遗传算法是解决NP问题的一种较理想的方法。文章首先介绍了基本遗传算法的基本原理、特点及其基本实现技术;接着针对TSP
问题,论述了遗传算法在编码表示和遗传算子(包括选择算子、交叉算子变异算子这三种算子)等方面的应用情况,分别指出几种常用的编码方法的优点和缺点,并且结合TSP的运行实例详细分析了基本遗传算法的4个运行参数群体大小、遗传算法的终止进化代数、交叉概率、变异概率,对遗传算法的求解结果和求解效率的影响,经过多次的测试设定出了它们一组比较合理的取值。最后,简单说明了混合遗传算法在求解TSP问题中的应用并对遗传算法解决TSP问题的前景提出了展望。
关键词:TSP
遗传算法
遗传算子
编码
@@@需要的话按我的名字找我吧
Ⅹ 谁能帮我编个贪心算法求解TSP问题的C++源代码
AC代码,132kb,0ms 记得给分哦~~ #include #include using namespace std; int a[12],n,k,visit[12]; __int64 sum=0; void dfs(int num,int x,int j) { if(num==k) { sum+=x; return; } for(int i=1;ij) { visit[i]=1; if(!x) dfs(num+1,a[i],i...