(3)对上述群体中各个抗体进行评价。在本算法中对个体的评价是以个体的期望繁殖率
P为标准的。
(4) 形成父代群体。将初始群体按期望繁殖率P进行降序排列,并取前N个个体构成父
代群体;同时取前m个个体存人记忆库中。
(5)判断是否满足结束条件,是则结束;反之,则继续下一步操作。
(6)新群体的产生。基于步骤(4)的计算结果对抗体群体进行选择、交叉、变异操作得到
新群体,再从记忆库中取出记忆的个体,共同构成新一代群体。
(7)转去执行步骤(3)。
3 免疫算法解决TSP问题——Python实现
#=导入相关库===
import numpy as np
import matplotlib.pyplot as plt
from sko.demo_func import function_for_TSP
from sko.IA import IA_TSP
num_points, points_coordinate, distance_matrix, cal_total_distance = function_for_TSP(num_points=10)
def cal_total_distance(routine):
num_points, = routine.shape
return sum([distance_matrix[routine[i % num_points], routine[(i + 1) % num_points]] for i in range(num_points)])
#sko.IA解决===
ia_tsp = IA_TSP(func=cal_total_distance, n_dim=num_points, size_pop=500, max_iter=800, prob_mut=0.2,
T=0.7, alpha=0.95)
best_points, best_distance = ia_tsp.run()
print(‘best routine:’, best_points, ‘best_distance:’, best_distance)
#===可视化=
fig, ax = plt.subplots(1, 1)
best_points_ = np.concatenate([best_points, [best_points[0]]])
best_points_coordinate = points_coordinate[best_points_, :]
ax.plot(best_points_coordinate[:, 0], best_points_coordinate[:, 1], ‘o-r’)
plt.show()
4 免疫算法解决TSP问题——Matlab实现
下表为一些坐标点,找出最短路线:
4.1 解的多样性评价
(1)抗体与抗原间亲和力
抗体与抗原之间的亲和力用于表示抗体对抗原的识别程度,此处针对上述配送中心选址
模型设计亲和力函数):
其中,)为目标函数;分母中第二项表示对违反距离约束的解给予惩罚,C取一个 比较大的正数。
(2)抗体与抗体间亲和力
抗体与抗体之间的亲和力反映了抗体之间的相似程度。此处借鉴由Forrest 等提出的
R位连续方法计算抗体与抗体间的亲和力。R位连续方法实际是一种部分匹配规则。该方法
的关键是确定-一个R值,代表亲和度判定的阈值。两种个体编码有超过R位或者连续R位的
编码相同,则表示这两种抗体近似“相同”,否则表示两种个体不同。此处抗原的编码方法,各
位之间不需考虑排序,可参考变形的R位连续方法计算抗体间亲和度,即:
)
其中,)为抗体v与抗体s中相同的位数;L为抗体的长度。例如,两个抗体为[2 7 15 21 5 11].
[15 8 14 26 5 2],经比较,有3个值是相同的,此时可计算出它们的亲和度)为0.5。
(3)抗体浓度.
抗体的浓度C,即群体中相似抗体所占的比例,即
(4)期望繁殖概率
在群体中,每个个体的期望繁殖概率由抗体与抗原间亲和力)和抗体浓度)两部分共.
同决定,即
其中,a为常数。由上式可见,个体适应度越高,则期望繁殖概率越大;个体浓度越大,则期望
繁殖概率越小。这样既鼓励了适应度高的个体,同时抑制了浓度高的个体,从而确保了个体多
样性。
免疫算法在抑制高浓度个体时,与抗原亲和度最高的个体也可能因其浓度高而受到抑制,
从而导致已求得的最优解丢失,因此采取精英保留策略,在每次更新记忆库时,先将与抗原亲
和度最高的若千个个体存人记忆库,再按照期望繁殖概率将剩余群体中优秀个体存入记忆库。
4.2 案例模型步骤
本文在进行任务的聚类打包时,制定以下原则:
①多个任务进行打包后,视为一个任务集,一任务点最多只能存在于一个任务集。
②一个任务集包含的任务点不能太远。
③一个任务集以某个任务点作为聚类中心,周围任务点与中心点的距离之和最小。
构建函数及约束条件如下:
约束条件:
对于某一区域的点的任务点,要对该区域中的任务进行打包,首先算出中心点hi到其余点zj的距离aij;aij中i为该区域有i个打包中心点数,每个打包内除中心点外,还有个j其余点;s为其余点到打包中心点的距离上限;D为其余点与打包点的关系,如果在给定范围以内的取值为1,表示可以打包为一类,为0则不打包;A为一个打包内的所有点距之和。打包示意图如下:
4.3 免疫算法打包程序实现的步骤
Step1:初始化参数并产生初始打包中心点,即初始种群;
Step2:对每个打包内的点进行距离分析;
Step3:分析每个点对所有打包中心点的距离,每个点都可能处于多个打包范围内;
Step4:通过比对步骤2与3中的距离,对于每个任务点而言,优先选择距离最近的一个中心点,并记录;
Step5:判断是否每个点都给予了分类,并检验是否满足条件,是则结束继续步骤6;
Step6:产生新群体,基于步骤4的计算结果进行遗传方式产生新的打包群体;
Step7:比对前一个打包群体,对比各个打包内的A值,保留最小的群体,并循环步骤4-7;
Step8:输出结果。
4.4 Matlab代码
clear
clc
%% 位置坐标
city_coordinate=[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];
n=length(city_coordinate);
%% step1 参数设置
sizepop=10; % 种群规模
overbest=10; % 记忆库容量大小
MAXGEN=100; % 迭代次数
pcross=0.5; % 免疫细胞遗传过程中的交叉概率
pmutation=0.4; % 免疫细胞遗传过程中的变异概率
s=3; %记录最优个体数
ps=0.95; % 多样性评价参数(一般设置为0.95)
len=10; % 最大打包数
jiange=1000; %打包点之间距离不低于1000m
z=3000; %其余点到中心点距离上限
M=sizepop+overbest;
%% step2 将种群信息定义为一个结构体,方便调用
individuals = struct(‘fitness’,zeros(1,M), ‘concentration’,zeros(1,M),‘excellence’,zeros(1,M),‘chrom’,[]);
%struct函数功能是生成一个具有指定字段名和相应数据的结构数组
%% step3 产生初始抗体种群
individuals.chrom = popinit(city_coordinate,M,len,jiange);%“.chrom”是调用individuals数组
trace=[]; %初始化矩阵,用于记录每代最个体优适应度和平均适应度
%% 迭代寻优
for iii=1:MAXGEN
%% step4 抗体群多样性评价
for i=1:M
individuals.fitness(i) = fitness(city_coordinate,individuals.chrom(i,:),z); % 每个个体适应度计算
individuals.concentration(i) = concentration(i,M,individuals); % 计算第i个个体的打包中心点与种群中每个个体的打包中心点间的相似度
end
% 综合亲和度和浓度评价抗体优秀程度,得出繁殖概率
individuals.excellence = excellence(individuals,M,ps);
% 记录当代最佳个体和种群平均适应度
[best,index] = min(individuals.fitness); % 找出当前种群中适应值最小的中心点类,及较优的打包中心点
bestchrom = individuals.chrom(index,:); % 找出最优个体,即min(individuals.fitness)对应的个体
average = mean(individuals.fitness); % 计算平均适应度
trace = [trace;best,average]; % 记录最有个体
%% step5 根据excellence,形成父代群,更新记忆库(加入精英保留策略,可由s控制)
bestindividuals = bestselect(individuals,M,overbest,s); % 更新记忆库
individuals = bestselect(individuals,M,sizepop,s); % 更新父代群
%% step6 选择,交叉,变异操作,再加入记忆库中抗体,产生新种群
individuals = Select(individuals,sizepop); % 选择
individuals.chrom = Cross(pcross,individuals.chrom,sizepop,len,city_coordinate,jiange); % 交叉
individuals.chrom = Mutation(pmutation,individuals.chrom,sizepop,len,n,city_coordinate,jiange); % 变异
individuals = incorporate(individuals,sizepop,bestindividuals,overbest); % 加入记忆库中抗体
end
%% 画出免疫算法收敛曲线
figure(1)
plot(trace(:,1),‘g–’);
hold on
plot(trace(:,2),‘-’);
legend(‘最优适应度值’,‘平均适应度值’)
title(‘免疫算法收敛曲线’,‘fontsize’,12)
xlabel(‘迭代次数’,‘fontsize’,12)
ylabel(‘适应度值’,‘fontsize’,12)
%% 画出打包中心选址图
%找出最近打包点
for i=1:n
distance(i,:)=dist(city_coordinate(i,:),city_coordinate(bestchrom,:)');
end
[a,b]=min(distance’);
index=cell(1,len);
for i=1:len
%记录各个打包中心点的位置
index{i}=find(b==i);
end
figure(2)
title(‘最优打包图’)
cargox=city_coordinate(bestchrom,1);
cargoy=city_coordinate(bestchrom,2);
plot(cargox,cargoy,‘rs’,‘LineWidth’,2,‘MarkerEdgeColor’,‘r’,‘MarkerFaceColor’,‘b’,‘MarkerSize’,20)
hold on
plot(city_coordinate(:,1),city_coordinate(:,2),‘o’,‘LineWidth’,2,‘MarkerEdgeColor’,‘k’,‘MarkerFaceColor’,‘g’,‘MarkerSize’,10)
for i=1:31
x=[city_coordinate(i,1),city_coordinate(bestchrom(b(i)),1)];
y=[city_coordinate(i,2),city_coordinate(bestchrom(b(i)),2)];
plot(x,y,‘c’);hold on
end
%% Step1:初始化参数并产生初始打包中心点,即初始种群;
function pop = popinit(city_coordinate,M,len,jiange)
%种群初始化函数(记忆库库为空,全部随机产生)
% M input 种群数量
% length input 抗体长度
% pop output 初始种群
n=length(city_coordinate);
for i=1:M
flag=0;
while flag==0
aaa=randperm(n);%产生随机序列
pop(i,:)=aaa(1:len);%pop矩阵提取的是b矩阵中的前length个元素
flag=test(city_coordinate,pop(i,:),jiange);%test为条件函数文件,如果满足条件,那么flag就=0,此时终止这次循环
end
end
%% Step2:对每个打包内的点进行距离分析;
function flag=test(city_coordinate,code,jiange)
% 检查个体是否满足距离约束
% code input 个体
% flag output 是否满足要求标志
flag=1;
a=dist( city_coordinate(code,:)');%dist是欧式距离计算函数
a(find(a==0))=[];
b=find(a<jiange);
if isempty(b)==1
flag=0;
end
end
%% Step3:分析每个点对所有打包中心点的距离,每个点都可能处于多个打包范围内;
function fit=fitness(city_coordinate,individual,z)
%计算个体适应度值
%individual input 个体
%fit output 适应度值
%计算出所有打包点到中心点的距离
for i=1:length(city_coordinate)
distance(i,:)=dist(city_coordinate(i,:),city_coordinate(individual,:)');
end
%% Step4:通过比对步骤2与3中的距离,对于每个任务点而言,优先选择距离最近的一个中心点,并记录;
%找出离中心点最近点,a记录最近距离,b记录最近的点
[a,b]=min(distance’);
%如果距离大于z,那么就要加上一个惩罚值:4.0e+4*length,这里自己定,惩罚值尽可能大些,但也别太大
fit=sum(a) + 4.0e+4*length(find(a>z));
end
function concentration = concentration(i,M,individuals)
%% (3)计算个体浓度值
% i input 第i个抗体
% M input 种群规模
% individuals input 个体
% concentration output 浓度值
concentration=0;
for j=1:M
xsd=similar(individuals.chrom(i,:),individuals.chrom(j,:)); % 第i个体与种群所有个体间的相似度
% 相似度大于阀值就说明相似
if xsd>0.7
concentration=concentration+1;
end
end
concentration=concentration/M;%计算相似度
end
%% (2)抗原与抗体之间的亲和力
function resemble = similar(individual1,individual2)
% 计算个体individual1和individual2的相似度
% individual1,individual2 input 两个个体
% resemble output 相似度
k=zeros(1,length(individual1));
for i=1:length(individual1)
if find(individual1(i)==individual2)
k(i)=1;
end
end
resemble=sum(k)/length(individual1);
end
function exc=excellence(individuals,M,ps)
%% (4)计算个体繁殖概率
% individuals input 种群
% M input 种群规模
% ps input 多样性评价参数
% exc output 繁殖概率
fit = 1./individuals.fitness; %Av
sumfit = sum(fit);
con = individuals.concentration; %Cv
sumcon = sum(con);
for i=1:M
exc(i) = fit(i)/sumfitps +con(i)/sumcon(1-ps); %exc为当前每个个体的一个评价值
end
end
%% 初始化记忆库,依据excellence,将群体中高适应度低相似度的overbest个个体存入记忆库
function rets=bestselect(individuals,m,n,s)
% m input 抗体数
% n input 记忆库个体数\父代群规模
% individuals input 抗体群
% bestindividuals output 记忆库\父代群
% 精英保留策略,将fitness最好的s个个体先存起来,避免因其浓度高而被淘汰
rets=struct(‘fitness’,zeros(1,n), ‘concentration’,zeros(1,n),‘excellence’,zeros(1,n),‘chrom’,[]);
[fitness,index] = sort(individuals.fitness);
for i=1:s %s记忆最优个体的数量
rets.fitness(i) = individuals.fitness(index(i));
rets.concentration(i) = individuals.concentration(index(i));
rets.excellence(i) = individuals.excellence(index(i));
rets.chrom(i,:) = individuals.chrom(index(i)😅;
end
% 剩余m-s个个体
leftindividuals=struct(‘fitness’,zeros(1,m-s), ‘concentration’,zeros(1,m-s),‘excellence’,zeros(1,m-s),‘chrom’,[]);
for k=1:m-s
leftindividuals.fitness(k) = individuals.fitness(index(k+s));
leftindividuals.concentration(k) = individuals.concentration(index(k+s));
leftindividuals.excellence(k) = individuals.excellence(index(k+s));
leftindividuals.chrom(k,:) = individuals.chrom(index(k+s)😅;
end
% 将剩余抗体按excellence值排序
[excellence,index]=sort(1./leftindividuals.excellence);
% 在剩余群体中再选n-s个最好的个体,也就是总共筛选出记忆库的最大含量个个体,然后按优劣从上往下排序
for i=s+1:n
rets.fitness(i) = leftindividuals.fitness(index(i-s));
rets.concentration(i) = leftindividuals.concentration(index(i-s));
rets.excellence(i) = leftindividuals.excellence(index(i-s));
rets.chrom(i,:) = leftindividuals.chrom(index(i-s)😅;
end
end
%% 轮盘赌选择
function ret=Select(individuals,sizepop)
% individuals input : 种群信息
% sizepop input : 种群规模
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-3gRfeCaG-1713230194799)]
[外链图片转存中…(img-2XJJDO5F-1713230194799)]
[外链图片转存中…(img-OVN1G0xv-1713230194800)]
[外链图片转存中…(img-lg5uyfdy-1713230194800)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)