旅行商问题
    旅行商问题(TSP 问题)。假设有一个旅行商人要拜访全国31个省会城市,他需要选择所要走的路径,路径的限制是每个城市只能拜访-一次, 而且最后要回到原来出发的城市。路径的选择要求是:所选路径的路程为所有路径之中的最小值。

免疫算法原理
     见链接:
万字长文了解免疫算法原理 及求解复杂约束问题(源码实现)

二进制编码
免疫算法(二进制)算例(源码实现)

MATLAB版求解
注意事项:由于旅行商问题中,各个个体不存在相同个体,所以无需计算浓度。

%%%%%%%%%%%%%%%%%%%%%%%免疫算法求解决TSP问题%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;                        %清除所有变量
close all;                        %清图
clc;                              %清屏
C=[1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;...3238 1229;4196 1044;4312  790;4386  570;3007 1970;2562 1756;...2788 1491;2381 1676;1332  695;3715 1678;3918 2179;4061 2370;...3780 2212;3676 2578;4029 2838;4263 2931;3429 1908;3507 2376;...3394 2643;3439 3201;2935 3240;3140 3550;2545 2357;2778 2826;...2370 2975];                  %31个省会城市坐标
N=size(C,1);                     %TSP问题的规模,即城市数目
D=zeros(N);                      %任意两个城市距离间隔矩阵
%%%%%%%%%%%%%%%%%%%%%求任意两个城市距离间隔矩阵%%%%%%%%%%%%%%%%%%%%%
for i=1:Nfor j=1:ND(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5;end
end
NP=200;                           %免疫个体数目
G=1000;                           %最大免疫代数
f=zeros(N,NP);                    %用于存储种群
for i=1:NPf(:,i)=randperm(N);           %随机生成初始种群
end
len=zeros(NP,1);                  %存储路径长度
for i=1:NPlen(i)=func(D,f(:,i),N);     %计算路径长度
end
[Sortlen,Index]=sort(len);
Sortf=f(:,Index);                 %种群个体排序
gen=0;                            %免疫代数
Ncl=10;                            %克隆个数
%%%%%%%%%%%%%%%%%%%%%%%%%%%免疫循环%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
while gen<Gfor i=1:NP/2%%%%%%%%%%%%选激励度前NP/2个体进行免疫操作%%%%%%%%%%%%%%%a=Sortf(:,i);Ca=repmat(a,1,Ncl);for j=1:Nclp1=floor(1+N*rand());p2=floor(1+N*rand());while p1==p2p1=floor(1+N*rand());p2=floor(1+N*rand());endtmp=Ca(p1,j);Ca(p1,j)=Ca(p2,j);Ca(p2,j)=tmp;endCa(:,1)=Sortf(:,i);            %保留克隆源个体%%%%%%%%%%%%克隆抑制,保留亲和度最高的个体%%%%%%%%%%%%%%for j=1:NclCalen(j)=func(D,Ca(:,j),N);end[SortCalen,Index]=sort(Calen);SortCa=Ca(:,Index); af(:,i)=SortCa(:,1);alen(i)=SortCalen(1);end%%%%%%%%%%%%%%%%%%%%%%%%%%种群刷新%%%%%%%%%%%%%%%%%%%%%%%%%%for i=1:NP/2bf(:,i)=randperm(N);          %随机生成初始种群blen(i)=func(D,bf(:,i),N);   %计算路径长度end  %%%%%%%%%%%%%%%%%%%%免疫种群与新种群合并%%%%%%%%%%%%%%%%%%%%%f=[af,bf];len=[alen,blen];[Sortlen,Index]=sort(len);Sortf=f(:,Index);gen=gen+1;trace(gen)=Sortlen(1);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%输出优化结果%%%%%%%%%%%%%%%%%%%%%%%%%%%
Bestf=Sortf(:,1);                 %最优变量
Bestlen=trace(end);               %最优值
figure
for i=1:N-1plot([C(Bestf(i),1),C(Bestf(i+1),1)],...[C(Bestf(i),2),C(Bestf(i+1),2)],'bo-');hold on;
end
plot([C(Bestf(N),1),C(Bestf(1),1)],...[C(Bestf(N),2),C(Bestf(1),2)],'ro-');
title(['优化最短距离:',num2str(trace(end))]);
figure,plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('亲和度进化曲线')%%%%%%%%%%%%%%%%%%%%%%%%%%%%计算路线总长度%%%%%%%%%%%%%%%%%%%%%%%%function len=func(D,f,N)len=D(f(N),f(1));for i=1:(N-1)len=len+D(f(i),f(i+1));endend

python版求解


import numpy as np
import pandas as pd
from tqdm import tqdm#进度条设置
import matplotlib.pyplot as plt
from pylab import *
import matplotlib; matplotlib.use('TkAgg')
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = Falsecity_num = 31  # 城市的数量
#############1.数据集 城市坐标
C=[1304 ,2312,3639 ,1315,4177 ,2244,3712 ,1399,3488, 1535,3326, 1556,3238 ,1229,4196 ,1044,4312,790,4386,570,3007,1970,2562 ,1756,2788, 1491,2381 ,1676,1332,695,3715 ,1678,3918,2179,4061,2370,3780, 2212,3676, 2578,4029,2838,4263,2931,3429,1908,3507,2376,3394 ,2643,3439,3201,2935,3240,3140,3550,2545,2357,2778,2826,2370 ,2975]                 #31个省会城市坐标
C=np.array(C).reshape(-1,2)#shape=(31, 2)###############相关函数:距离和亲和度函数(路程) 路径画图函数####################.函数:计算城市之间的距离
def calculate_distance(X, Y):"""计算城市两辆之间的欧式距离,结果用numpy矩阵存储:param X: 城市的X坐标,np.array数组:param Y: 城市的Y坐标,np.array数组"""distance_matrix = np.zeros((city_num, city_num))for i in range(city_num):for j in range(city_num):if i == j:continuedis = np.sqrt((X[i] - X[j]) ** 2 + (Y[i] - Y[j]) ** 2)  # 欧式距离计算distance_matrix[i][j] = disreturn distance_matrix##适应度函数 计算总距离
def fitness_func(distance_matrix, xi):"""适应度函数,计算目标函数值.:param distance: 城市的距离矩阵:param xi: PSO的一个解:return: 目标函数值,即总距离"""total_distance = 0for i in range(1, city_num):start = xi[i - 1]end = xi[i]total_distance += distance_matrix[start][end]total_distance += distance_matrix[end][xi[0]]  # 从最后一个城市回到出发城市return total_distance#路径画图
def plot_tsp(gbest):"""绘制最优解的图形"""X=D[:,0]#城市坐标的X轴Y=D[:,1]#城市坐标的Y轴plt.scatter(X, Y, color='r')for i in range(1, city_num):start_x, start_y = X[gbest[i - 1]], Y[gbest[i - 1]]end_x, end_y = X[gbest[i]], Y[gbest[i]]plt.plot([start_x, end_x], [start_y, end_y], marker='>',alpha=0.8)start_x, start_y = X[gbest[0]], Y[gbest[0]]plt.plot([start_x, end_x], [start_y, end_y], color='b', alpha=0.8)plt.show()#############免疫算法相关函数############免疫操作函数:克隆、变异、变异抑制
def variation(Sortf):"""param Sortf:按亲和度大小排序后的群体return :af 经过克隆、变异、变异抑制后的群体#变异原理:交换个体中两个元素的位置"""Ncl = 10  # 克隆个数af = np.zeros((np.int(NP / 2), city_num),dtype=np.int)  # 存储变异后的个体for i in range(np.int(NP / 2)):  # 遍历前一半个体# 选激励度前NP/2个体进行免疫操作a = Sortf[i]  # 当前个体 .shape(city_num,)a = a.reshape(-1, city_num)  # (-1,维度city_num)Na = np.tile(a, (Ncl, 1))  # 对当前个体进行克隆 Na.shape=(Ncl, city_num)for j in range(Ncl):  # 遍历每一个克隆样本p1=np.random.randint(0,city_num,1)[0]  # 随机产生一个整数[0,31)p2 = np.random.randint(0, city_num, 1)[0]  # [0,31)while p1 == p2:p1 = np.random.randint(0, city_num, 1)[0]  # 随机产生一个整数[0,31)p2 = np.random.randint(0, city_num, 1)[0]  # [0,31)tmp = Na[j,p1]Na[j,p1] = Na[j,p2]Na[j,p2] = tmp# 保留克隆源个体Na[0, :] = Sortf[i]#####克隆抑制,保留亲和度最高的个体NaMSLL = np.zeros((Ncl, 1))  # 存储变异种群亲和度值for j in range(Ncl):  # 遍历每一个克隆样本NaMSLL[j] = fitness_func(D, xi=Na[j]) # 亲和度=距离Index = np.argsort(NaMSLL, axis=0)  # 激励度按升序排序Index = Index[:, 0]NaSortf = Na[Index]  # 排序后的种群af[i] = NaSortf[0]  # 取最优return af#免疫操作:创建新生种群
def refresh():bf = np.zeros((np.int(NP/2), city_num), dtype=np.int)for i in range(np.int(NP/2)):  # 遍历每一个个体bf[i, :] = np.random.choice(list(range(0, city_num)), size=city_num, replace=False)  # 群体初始化return bf#############免疫算法开始############
D=calculate_distance(C[:,0], C[:,1])#任意两个城市距离间隔矩阵 shape=(31, 31)NP=200                           #免疫个体数目
G=600                          #最大免疫代数
f=np.zeros((NP,city_num),dtype=np.int)                    #用于存储种群 shape=(200, 31)
for i in range(NP):#遍历每一个个体f[i,:]=np.random.choice(list(range(0, city_num)), size=city_num, replace=False)#群体初始化len=np.zeros((NP,1))                  #存储路径长度
for i in range(NP):#遍历每一个个体len[i]=fitness_func(D, xi=f[i]) #计算初始群体每个个体的路程长度###激励度按升序排序
Index=np.argsort(len,axis=0)
Index=Index[:,0]
Sortf=f[Index] # #排序后的初始群体 shape=(200, 31)##############免疫循环############
trace=[] #记录迭代激励度最优值
for gen in tqdm(range(G)):#遍历每一次迭代af = variation(Sortf)  # 选择一半个体 进行克隆、变异、变异抑制 shape=(100, 31)aflen=np.zeros((af.shape[0],1))                  #存储af群体路径长度 shape=(100, 1)for j in range(af.shape[0]):#遍历af中的每一个个体aflen[j] = fitness_func(D, xi=af[j])  # 计算af群体每个个体的路程长度(亲和度)bf = refresh()  # 创建一半新生种群#bf.shape=(100, 31)bflen = np.zeros((bf.shape[0], 1))  # 存储bf群体路径长度 shape=(100, 1)for j in range(bf.shape[0]):#遍历af中的每一个个体bflen[j] = fitness_func(D, xi=bf[j])  # 计算af群体每个个体的路程长度(亲和度)# ##########种群刷新:免疫种群与新生种群合并##f1 = np.concatenate((af, bf), axis=0)  # 合并的种群 f1.shape=(50, 2) f1为子代f1len = np.concatenate((aflen, bflen), axis=0)  # 合并种群激励度值 shape=(200, 1)Index = np.argsort(f1len, axis=0)Index = Index[:, 0]Sortf = f1[Index]  # shape(50, 2)trace.append(fitness_func(D, xi=f1[0]))  # 记录最优个体的激励度值############输出优化结果
Bestf=Sortf[0,:]                #最优变量
print('最优变量',Bestf)
print('最优值',trace[-1] )       #最优值
plt.plot(trace)
plt.title('迭代曲线')
plt.show()
plot_tsp(Bestf)

作者:电气 余登武

离散免疫算法求解旅行商问题(源码实现)相关推荐

  1. 【IA TSP】基于matlab免疫算法求解旅行商问题【含Matlab源码 195期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[旅行商问题]基于matlab免疫算法求解旅行商问题[含Matlab源码 195期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...

  2. 【故障检测问题】基于matlab免疫算法求解故障检测问题【含Matlab源码 196期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[故障检测问题]基于matlab免疫算法求解故障检测问题[含Matlab源码 196期] 获取代码方式2: 通过订阅紫极神光博客付费专栏,凭 ...

  3. 【优化布局】基于matlab免疫算法求解充电站最优布局【含Matlab源码 2539期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[生产调度]基于matlab免疫算法求解生产调度零等待问题[含Matlab源码 1178期] 点击上面蓝色字体,直接付费下载,即可. 获取 ...

  4. 【MVO TSP】基于matlab灰狼算法求解旅行商问题【含Matlab源码 1327期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[TSP]基于matlab灰狼算法求解旅行商问题[含Matlab源码 1327期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  5. 【物流选址】基于matlab免疫算法求解物流选址问题【含Matlab源码 020期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[物流选址]基于matlab免疫算法求解物流选址问题[含Matlab源码 020期] 获取代码方式2: 付费专栏Matlab路径规划(初级版 ...

  6. 【AFSA TSP】基于matlab人工鱼群算法求解旅行商问题【含Matlab源码 422期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[TSP]基于matlab人工鱼群算法求解旅行商问题[含Matlab源码 422期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...

  7. 【BA TSP】基于matlab蜜蜂算法求解旅行商问题【含matlab源码 1248期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[TSP]基于matlab蜜蜂算法求解旅行商问题[含matlab源码 1248期] 获取代码方式2: 付费专栏Matlab路径规划(初级版 ...

  8. 【ACO TSP】基于matlab GUI蚁群算法求解旅行商问题【含Matlab源码 1032期】

    ⛄一.TSP简介 旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选 ...

  9. 【优化布局】免疫算法求解充电站最优布局【含Matlab源码 2539期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[生产调度]基于matlab免疫算法求解生产调度零等待问题[含Matlab源码 1178期] 点击上面蓝色字体,直接付费下载,即可. 获取 ...

最新文章

  1. C++ 共用体union 的使用
  2. 2021年中国工业互联网安全大赛核能行业赛道writeup之usb流量分析
  3. MPB:中大李文均组-河口水体和沉积物中微生物的分离培养与鉴定
  4. 《LeetCode力扣练习》第338题 比特位计数 Java
  5. 阿里云云市场全新升级 瞄准需求拓生态
  6. Android webview 写入cookie的解决方法以及一些属性设置
  7. pythondocx文档重叠_使用PYTHON实现docx文档的读写
  8. 大地图开发管理:《巫师3》Umbra遮挡剔除技术
  9. java数据接口之链表_Java数据结构和算法之链表
  10. SAP UI5 web Component的React组件,如何实现事件响应
  11. HDU6223 - Infinite Fraction Path
  12. ActivityGroup切换不用每次加载视图
  13. html5 input step,HTML5 Data Input 元素介绍
  14. Windows系统目录及常用快捷键
  15. PostgreSQL 配置优化
  16. 微信小程序页面静态页是html,制作一个微信小程序中的静态页面
  17. 王者苹果服务器转安卓系统,王者荣耀苹果用户可以转?王者荣耀苹果用户转安卓的方法教程...
  18. qq加群采集群成员,无痕偷人
  19. 常用眼底图像数据集简介及下载--糖尿病视网膜病变 EyePacs,APTOS2019,STARE数据集
  20. 第七天--HCIA第五章--OSPF+ACL

热门文章

  1. 《数据库系统实训》实验报告——游标
  2. [USACO5.4]奶牛的电信Telecowmunication
  3. Bicoloring
  4. 突发:美赛官方承认邮箱服务器存在问题导致提交失败,将会发布更新!
  5. 常用的云服务器,云数据库,高速缓存服务器
  6. Java IO流学习总结二:File
  7. CocoaPods更新遇redefinition问题及其它问题汇总
  8. Docker系列教程02-MongoDB默认开启鉴权
  9. 记一次院赛CTF的WEB题(入门级别)
  10. 用户与服务器的交互:cookies