免疫算法(01背包、TSP、函数极值)

免疫算法(01背包、TSP、函数极值)

​ 笔者是一位大一的萌新,这篇算法是自己查阅文献以及参考别人的博客再加上自身的理解写出来的。有错误的地方希望及时指正。这篇文章我使用的是Matlab,后续会给出python版本。以后会陆续出其他的优化算法以及人工智能算法,机器学习,深度学习等。


目录
  1. 理论

  2. 应用

  3. 函数极值

  4. TSP

  5. 01背包


理论

背景介绍

在讲解免疫算法前,先来讲一下它的背景吧!在很久很久以前,1986年Farmal等人利用一组随机产生的微分方程建立起了人工免疫系统,再通过采用适应度阈值得过滤的方法去掉方程组中哪些不适合的微分方程,对保留的微分方程进行免疫系统的操作,也就是交叉、变异、逆转等等产生新的微分方程,不断迭代,直到找到一组最佳的微分方程为止。

免疫算法的概念
生物免疫系统免疫算法
抗原待优化的问题
抗体可行解
亲和度可行解的质量,相当于遗传算法的fitness
细胞活化免疫选择
细胞分化个体克隆
亲和度成熟变异
克隆抑制克隆抑制
种群刷新种群刷新

算法主要包括以下几个模块:

(1) 抗原识别和初始抗体的产生,即审题和选择合适的抗体编码规则。

(2) 抗体评价。对抗体的质量进行评价,评价的准则包括抗体的亲和度和个体浓度,评价得出的优质抗体进行免疫操作。

(3) 免疫操作。利用免疫选择、克隆、变异、克隆抑制、种群刷新等算子模拟生物免疫应答中的各种免疫操作,寻求最优解。

参数和公式

在这里插入图片描述
在这里插入图片描述

流程介绍

在这里插入图片描述

应用

函数极值

这个考虑了个体的浓度和亲和度。

clear;
close all;
clc;
Upper_1 = 5;
Lower_1 = -5;
Upper_2 = 5;
Lower_2 = -5;
m = 100;
Dimension = 2;
iter_max = 1000;
Pm = 0.7;
alfa = 1;
belta = 1;
iter = 1;
delta = 0.2;
produce = 10;
delta0_1 = 1*Upper_1;
delta0_2 = 1*Upper_2;
XX = rand(m,1)*(Upper_1 - Lower_1) + Lower_1;
YY = rand(m,1)*(Upper_2 - Lower_2) + Upper_2;
individual = [XX,YY];
for i = 1:m
    fitnesses(i) = func1(XX(i),YY(i));
end

for i = 1:m
    temp = zeros(m,1);
    for j = 1:m
        for k = 1:Dimension
            temp(j) = temp(j) + (individual(i,k)-individual(j,k))^2;
        end
        temp(j) = sqrt(temp(j));
        if temp(j) > delta
            temp(j) = 1;
        else
            temp(j) = 0;
        end
    end
    den(i) = sum(temp) / m;
end
Sim = alfa*fitnesses - belta*den;
[SortedSim,Index] = sort(Sim);
SortedIndividual = individual(Index,:);
while iter < iter_max
    
    
    
    for i = 1:m/2
        a = SortedIndividual(i,:);
        Na = repmat(a,produce,1);
        deta_1 = delta0_1 / iter;
        deta_2 = delta0_1 / iter;
        for j = 1:produce
            for ii = 1:Dimension
                if ii == 1
                    Na(j,ii) = Na(j,ii) + (rand-0.5)*deta_1;
                    if (Na(j,ii) > Upper_1) || (Na(j,ii) < Lower_1)
                        Na(j,ii) = rand*(Upper_1 - Lower_1) + Lower_1;
                    end
                else
                    Na(j,ii) = Na(j,ii) + (rand-0.5)*deta_2;
                    if (Na(j,ii) > Upper_2) || (Na(j,ii) < Lower_2)
                        Na(j,ii) = rand*(Upper_2 - Lower_2) + Lower_2;
                    end
                end
                
            end
        end
        Na(1,:) = SortedIndividual(i,:);
        for j = 1:produce
            Nafitnesses(j) = func1(Na(j,1),Na(j,2));
        end
        [SortedNafitness,Index] = sort(Nafitnesses);
        afitness(i) = SortedNafitness(1);
        NaSorted = Na(Index,:);
        aIndividual(i,:) = NaSorted(1,:);
    end
    
    
    for i = 1:m/2
    temp = zeros(m,1);
    for j = 1:m/2
        for k = 1:Dimension
            temp(j) = temp(j) + (aIndividual(i,k) - aIndividual(j,k))^2;
        end
        temp(j) = sqrt(temp(j));
        if temp(j) > delta
            temp(j) = 1;
        else
            temp(j) = 0;
        end
    end
    aden(i) = sum(temp) / (m / 2);
    end
    aSim = alfa*afitness - belta*aden;
    
    
    XX = rand(m/2,1)*(Upper_1 - Lower_1) + Lower_1;
    YY = rand(m/2,1)*(Upper_2 - Lower_2) + Upper_2;
    bIndividual = [XX,YY];
    for i = 1:m/2
        bfitnesses(i) = func1(bIndividual(i,1),bIndividual(i,2));
    end
    
    
    for i = 1:m/2
    temp = zeros(m,1);
    for j = 1:m/2
        for k = 1:Dimension
            temp(j) = temp(j) + (bIndividual(i,k) - bIndividual(j,k))^2;
        end
        temp(j) = sqrt(temp(j));
        if temp(j) > delta
            temp(j) = 1;
        else
            temp(j) = 0;
        end
    end
    bden(i) = sum(temp) / (m/2);
    end
    bSim = alfa*bfitnesses - belta*bden;
    
    NewIndividual = [aIndividual;bIndividual];
    NewSim = [aSim,bSim];
    [SortedNewFitnesses,Index] = sort(NewSim);
    SortedNewIndividual = NewIndividual(Index,:);
    SortedIndividual = SortedNewIndividual;
    trace(iter) = func1(SortedIndividual(1,1),SortedIndividual(1,2));
    iter
    
    
    iter = iter + 1;
end

BestIndividual = SortedIndividual(1,:);
BestValue = trace(end);
plot(trace);

function result = func1(x,y)
    result = 5*cos(x*y) + x*y+y^3;
end

TSP

这里只考虑了个体的亲和度没有考虑浓度,感兴趣的同学可以自己加上。(博主懒了,见谅)

clear;
close all;
clc;
n = 31;
x = rand(1,n)*100;
y = rand(1,n)*100;
D = zeros(n,n);
for i = 1:n
    for j = 1:n
        if i~=j
            D(i,j) = sqrt(power(x(i)-x(j),2)+power(y(i)-y(j),2));
        else
            D(i,j) = 1e-3;
        end
    end
end
m = 200;
iter_max = 1000;
iter = 1;
produce = 10;
generation = zeros(m,n);
for i = 1:m
    generation(i,:) = randperm(n);
end
len = zeros(m,1);
for i = 1:m
    Route = generation(i,:);
    for j = 1:(n-1)
        len(i) = len(i) + D(Route(j),Route(j+1));
    end
    len(i) = len(i) + D(Route(n),Route(1));
end
[SortedLen,index] = sort(len);
SortedGeneration = generation(index,:);
while iter <= iter_max
    for i = 1:m/2
        a = SortedGeneration(i,:);
        ca = repmat(a,produce,1);
        for j = 1:produce
            p1 = floor(1+n*rand());
            p2 = floor(1+n*rand());
            while p1 == p2
                p1 = floor(1+n*rand());
                p2 = floor(1+n*rand());
            end
            temp = ca(j,p1);
            ca(j,p1) = ca(j,p2);
            ca(j,p2) = temp;
        end
        ca(1,:) = SortedGeneration(i,:);
        CaLen = zeros(produce,1);
        for j = 1:produce
            Route = ca(j,:);
            for k = 1:(n-1)
                CaLen(j) = CaLen(j) + D(Route(k),Route(k+1));
            end
            CaLen(j) = CaLen(j) + D(Route(n),Route(1));
        end
        [SortedCaLen,index] = sort(CaLen);
        SortedCa = ca(index,:);
        aGeneration(i,:) = SortedCa(1,:);
        aLen(i) = SortedCaLen(1);
       
    end
    blen = zeros(m/2,1);
    for i = 1:m/2
        bGeneration(i,:) = randperm(n);
        Route = bGeneration(i,:);
        for j = 1:(n-1)
            blen(i) = blen(i) + D(Route(j),Route(j+1));
        end
        blen(i) = blen(i) + D(Route(n),Route(1));
    end
    Generation = [aGeneration; bGeneration];
    len = [aLen'; blen];
    [SortedLen,index] = sort(len);
    SortedGeneration = Generation(index,:);
    trace(iter) = SortedLen(1);
    iter
    iter = iter + 1;
end
plot(trace)

01背包

这里只考虑了个体的亲和度没有考虑浓度,感兴趣的同学可以自己加上。(博主懒了,见谅)

clear;
close all;
clc;
n = 50;
V = 1000;
u = [80 82 85 70 72 70 66 50 55 25 50 55 40 48 50 32 22 60 30 32 40 38 35 32 25 28 30 22 25 30 45 30 60 50 20 65 20 25 30 10 20 25 15 10 10 10 4 4 2 1];

p = [220 208 198 192 180 180 165 162 160 15 8 155 130 125 122 120 118 115 110 105 101 100 100 98 9 6 95 90 88 82 80 77 75 73 72 70 69 66 65 63 60 58 56 5 0 30 20 15 10 8 5 3 1];

m = 100;
produce = 10;
possibility = 0.5;
Generation = zeros(m,n);
iter_max = 500;
iter = 1;
weight = zeros(m,1);
value = zeros(m,1);
for i = 1:m
    for j = 1:n
        if rand > possibility && weight(i)+ u(j) <= V
            Generation(i,j) = 1;
            weight(i) = weight(i) + u(j);
            value(i) = value(i) + p(j);
        end
    end
end
[SortedValue,index] = sort(value,1,'descend');
SortedWeight = weight(index);
SortedGeneration = Generation(index,:);
while iter <= iter_max
    for i = 1:m/2
        a = SortedGeneration(i,:);
        
        Ca = repmat(a,produce,1);
        
        for j = 1:produce
            p1 = floor(1+n*rand());
            if Ca(j,p1) == 0
                maxTime = 100;
                Time = 1;
                while u(p1) + SortedWeight(i) > V && Time <= maxTime
                    p1 = floor(1+n*rand());
                    Time = Time + 1;
                end
                if Time <= maxTime && u(p1) + SortedWeight(i) <= V
                    Ca(j,p1) = 1;
                end
            else
                Ca(j,p1) = 0;
            end
        end
        Ca(1,:) = SortedGeneration(i,:);
        CaValue = zeros(produce,1);
        CaWeight = zeros(produce,1);
        for j = 1:produce
            Route = Ca(j,:);
            for k = 1:n
                if Ca(j,k) == 1
                    CaValue(j) = CaValue(j) + p(k);
                    CaWeight(j) = CaWeight(j) + u(k);
                end
            end
        end
        [SortedCaValue,index] = sort(CaValue,1,"descend");
        SortedCaWeight = CaWeight(index,:);
        SortedCa = Ca(index,:);
        aGeneration(i,:) = SortedCa(1,:);
        aValue(i) = SortedCaValue(1);
        aWeight(i) = SortedCaWeight(1);
    end
    bGeneration = zeros(m/2,n);
    bValue = zeros(m/2,1);
    bWeight = zeros(m/2,1);
    for i = 1:m/2
        for j = 1:n
            if rand > possibility && bWeight(i)+ u(j) <= V
                bGeneration(i,j) = 1;
                bWeight(i) = bWeight(i) + u(j);
                bValue(i) = bValue(i) + p(j);
            end
        end
    end
    Genration = [aGeneration;bGeneration];
    Value = [aValue';bValue];
    Weight = [aWeight';bWeight];
    [SortedValue,index] = sort(Value,1,"descend");
    SortedGeneration = Genration(index,:);
    SortedWeight = Weight(index);
    trace(iter) = SortedValue(1);
    iter
    iter = iter + 1;
end
plot(trace)

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
免疫算法可以应用于解决TSP问题。TSP问题是指旅行商问题,即在给定的一系列城市之间找到最短的路径,使得旅行商能够访问每个城市一次并返回起始城市。免疫算法通过模仿免疫系统中抗体与抗原的识别过程,结合抗体的产生过程而抽象出来的算法,来解决TSP问题。\[3\] 免疫遗传算法免疫算法的一种变体,它结合了免疫算法和遗传算法的特点。在免疫遗传算法中,通过使用免疫算子来保持种群的多样性,并使用遗传算子来进行选择、交叉和变异操作,以逐步优化解的质量。免疫遗传算法TSP问题中的应用可以通过以下步骤进行:\[2\] 1. 初始化种群:随机生成一组初始解作为种群。 2. 计算适应度:根据每个解的路径长度计算适应度值。 3. 选择操作:根据适应度值选择一部分解作为父代。 4. 交叉操作:对父代进行交叉操作,生成一组子代。 5. 变异操作:对子代进行变异操作,引入一定的随机性。 6. 更新种群:将父代和子代合并,更新种群。 7. 重复步骤2-6,直到达到停止条件(例如达到最大迭代次数)。 8. 输出最优解:选择适应度最好的解作为最优解。 通过不断迭代和优化,免疫遗传算法可以找到TSP问题的较优解。 #### 引用[.reference_title] - *1* *2* *3* [智能算法免疫算法求解TSP问题](https://blog.csdn.net/qq_41503660/article/details/106042093)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值