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

article/2025/9/24 13:07:45

      之前我们讲解了免疫算法以及离散的免疫算法。见链接:
万字长文了解免疫算法原理 及求解复杂约束问题(源码实现)
离散免疫算法求解旅行商问题(源码实现)

      今天讲下二进制的免疫算法。
我爱学习,爱玉酱。

算例

       假设一个数PD=210,它可以看成下列中的数,某几个组合而成来的。
P_state=np.array([1700,2600,180,2200,1400,60,85,290,4100,3000,1590,200,1300,50,100,30,90]),即PD=sum(xiP_statei)其中的xi表示状态,只能取0或1。
       限制条件:【180,2200】,序号[2,3]不能共存;【60,85,300】,序号[5,6,7]不能共存;【50,100】 序号[13,14]不能共存;【25,90】序号[15,16]不能共存。

算例实现

       如果不懂算法原理,请看之前免疫算法博文。
      由于二进制编码不可能出现重复,所以无需计算浓度。

python实现
python3.7

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: yudengwu(余登武)
# @Date  : 2021/5/19
#@email:1344732766@qq.com
import pandas as pd
import numpy as np
from tqdm import tqdm#进度条设置
import matplotlib.pyplot as plt
import matplotlib; matplotlib.use('TkAgg')
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False#以一个负荷为例讲解优化算法P_state=np.array([1700,2600,180,2200,1400,60,85,290,4100,3000,1590,200,1300,50,100,30,90])#17个状态state_num=17 #状态数
#【180,2200】,序号[2,3]不能共存
#【60,85,300】,序号[5,6,7]不能共存
#【50,100】 序号[13,14]不能共存
#【25,90】序号[15,16]不能共存#总负荷
Pload=446.0 #这个值可以设置的########适应度函数
def calc_f(xi):""":param xi 为个体  即电器的工作状态,01二二进制,0表示当前状态关,1表示开:xi 为np.array(数据):return  返回 np.abs(XiP_state-pload) P_state为电器"额定功率":"""xi=np.array(xi)xi=xi.reshape(state_num,)return np.abs(np.sum(xi*P_state)-Pload)###############免疫算法相关函数#############
#免疫操作函数:克隆、变异、变异抑制
def variation(Sortf):""":param Sortf : 排序后的种群:return: 经过克隆、变异、变异抑制后的群体af .af的规模为Sortf的一半"""Ncl = 5  # 克隆个数af = np.zeros((np.int(NP / 2), state_num))  # 存储变异后的个体for i in range(np.int(NP / 2)):  # 遍历前一半个体# 选激励度前NP/2个体进行免疫操作a = Sortf[i]  # 当前个体 .shape(state_num,)a = a.reshape(-1, state_num)  # (-1,维度state_num)Na = np.tile(a, (Ncl, 1))  # 对当前个体进行克隆 Na.shape=(Ncl, state_num)for j in range(Ncl):  # 遍历每一个克隆样本for k in range(state_num):#遍历个体的每一个元素#变异if np.random.random()<0.5:#Na[j,k]=1else:Na[j,k]=0# 【180,2200】,序号[2,3]不能共存while Na[j, 2] + Na[j, 3]  == 2 :Na[j, 2] = np.random.randint(0, 2, 1)Na[j, 3] = np.random.randint(0, 2, 1)# 【60,85,300】,序号[5,6,7]不能共存while Na[j, 5] + Na[j, 6] + Na[j, 7] == 2 or Na[j, 5] + Na[j, 6] + Na[j, 7] == 3:Na[j, 5] = np.random.randint(0, 2, 1)Na[j, 6] = np.random.randint(0, 2, 1)Na[j, 7] = np.random.randint(0, 2, 1)# 【50,100】 序号[13,14]不能共存while Na[j, 13] + Na[j, 14] == 2:Na[j, 13] = np.random.randint(0, 2, 1)Na[j, 14] = np.random.randint(0, 2, 1)# 【25,90】序号[15,16]不能共存while Na[j, 15] + Na[j, 16] == 2:Na[j, 15] = np.random.randint(0, 2, 1)Na[j, 16] = np.random.randint(0, 2, 1)# 保留克隆源个体Na[0, :] = Sortf[i]#####克隆抑制,保留亲和度最高的个体NaMSLL = np.zeros((Ncl, 1))  # 存储变异种群亲和度值for j in range(Ncl):  # 遍历每一个克隆样本NaMSLL[j] = calc_f(xi=Na[j])  # 亲和度=距离Index = np.argsort(NaMSLL, axis=0)  # 激励度按升序排序Index = Index[:, 0]NaSortf = Na[Index]  # 排序后的种群af[i] = NaSortf[0]  # 取最优return af#免疫操作:创建新生种群
def refresh():""":return: 创建一半新生群体 bf"""#########初始化群体bf = np.random.randint(0, 2, (np.int(NP/2), state_num))  # 在[0,2)之前随机取整数,取state_num(19)个 bf.shape=(50, 19)for j in range(np.int(NP / 2)):  # 遍历每一个个体# 【180,2200】,序号[2,3]不能共存while bf[j, 2] + bf[j, 3] == 2:bf[j, 2] = np.random.randint(0, 2, 1)bf[j, 3] = np.random.randint(0, 2, 1)# 【60,85,300】,序号[5,6,7]不能共存while bf[j, 5] + bf[j, 6] + bf[j, 7] == 2 or bf[j, 5] + bf[j, 6] + bf[j, 7] == 3:bf[j, 5] = np.random.randint(0, 2, 1)bf[j, 6] = np.random.randint(0, 2, 1)bf[j, 7] = np.random.randint(0, 2, 1)# 【50,100】 序号[13,14]不能共存while bf[j, 13] + bf[j, 14] == 2:bf[j, 13] = np.random.randint(0, 2, 1)bf[j, 14] = np.random.randint(0, 2, 1)# 【25,90】序号[15,16]不能共存while bf[j, 15] + bf[j, 16] == 2:bf[j, 15] = np.random.randint(0, 2, 1)bf[j, 16] = np.random.randint(0, 2, 1)return bf#############免疫算法开始############
NP=100                          #免疫个体数目
G=200                          #最大免疫代数#########初始化群体
f=np.random.randint(0,2,(NP,state_num)) #在[0,2)之前随机取整数,取state_num(19)个 f.shape=(100, 19)
for j in range(NP):while f[j, 2] + f[j, 3] == 2:f[j, 2] = np.random.randint(0, 2, 1)f[j, 3] = np.random.randint(0, 2, 1)# 【60,85,300】,序号[5,6,7]不能共存while f[j, 5] + f[j, 6] + f[j, 7] == 2 or f[j, 5] + f[j, 6] + f[j, 7] == 3:f[j, 5] = np.random.randint(0, 2, 1)f[j, 6] = np.random.randint(0, 2, 1)f[j, 7] = np.random.randint(0, 2, 1)# 【50,100】 序号[13,14]不能共存while f[j, 13] + f[j, 14] == 2:f[j, 13] = np.random.randint(0, 2, 1)f[j, 14] = np.random.randint(0, 2, 1)# 【25,90】序号[15,16]不能共存while f[j, 15] + f[j, 16] == 2:f[j, 15] = np.random.randint(0, 2, 1)f[j, 16] = np.random.randint(0, 2, 1)len=np.zeros((NP,1))                  #存储calc_f(X)结果for i in range(NP):#遍历每一个个体len[i]=calc_f(xi=f[i]) #计算初始群体每个个体的路程长度
###激励度按升序排序
Index=np.argsort(len,axis=0)
Index=Index[:,0]
Sortf=f[Index] # #排序后的初始群体 shape=(100, 18)##############免疫循环############
trace=[] #记录迭代激励度最优值
for gen in tqdm(range(G)):#遍历每一次迭代af = variation(Sortf)  # 选择一半个体 进行克隆、变异、变异抑制 shape=(100, 18)aflen=np.zeros((af.shape[0],1))                  #存储af群体路径长度 shape=(100, 1)for j in range(af.shape[0]):#遍历af中的每一个个体aflen[j] = calc_f(xi=af[j]) # 计算af群体每个个体的路程长度(亲和度)bf = refresh()  # 创建一半新生种群#bf.shape=(100, 18)bflen = np.zeros((bf.shape[0], 1))  # 存储bf群体路径长度 shape=(100, 1)for j in range(bf.shape[0]):  # 遍历bf中的每一个个体bflen[j] = calc_f(xi=bf[j])  # 计算bf群体每个个体的路程长度(亲和度)# ##########种群刷新:免疫种群与新生种群合并##f1 = np.concatenate((af, bf), axis=0)  # 合并的种群 f1.shape=(50, 18) 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, 18)trace.append(calc_f(xi=f1[0]))  # 记录最优个体的激励度值############输出优化结果
Bestf=Sortf[0,:]                #最优变量
print('最优变量',Bestf)
print('误差',trace[-1] )       #最优值
print('最优值',np.array(Bestf)*P_state)
plt.plot(trace)
plt.title('迭代曲线')
plt.xlabel('迭代次数')
plt.ylabel('abs(sum(xi*Pi)-Pload)')
plt.show()

结果图

在这里插入图片描述
作者:电气-余登武


http://chatgpt.dhexx.cn/article/Kp0qxjDK.shtml

相关文章

免疫算法(Immune Algorithm)

概念 人工免疫算法(Immune Algorithm)是一种具有生成检测 (generate and test)的迭代过程的群智能搜索算法。从理论上分析&#xff0c;迭代过程中&#xff0c;在保留上一代最佳个体的前提下&#xff0c;遗传算法是全局收敛的。 对于遗传算法&#xff1a;在对算法的实施过程中…

人工免疫算法概述

一、免疫系统 什么是病毒&#xff1f; 病毒是一种简单的生活形式&#xff1a;包裹在保护壳中的一些基因。这些基因是制造新病毒的指令。 在细胞外&#xff0c;病毒无法繁殖。但是一旦病毒入侵了活细胞&#xff0c;它就会将该细胞变成病毒工厂。随着时间的流逝&#xff0c;成…

人工智能-免疫算法

这是一类智能的算法&#xff0c;没有什么固定的模式&#xff0c;就是一个算法思想&#xff0c;可以给我们一些有价值的指导&#xff0c;当我们想要做一些相关工作的时候&#xff0c;可以扩宽我们的视野&#xff0c;打开我们的脑洞&#xff0c;借鉴其中的原理。我不想多说里面的…

免疫算法Python实现

1.流程 免疫算法与遗传算法其实非常相似&#xff0c;但其独特的地方在于&#xff0c;免疫算法用激励度而非亲和度来衡量结果的好坏&#xff0c;而激励度又与抗体密度有关&#xff0c;这就使得密度大的抗体激励度反而小&#xff0c;让免疫算法有全局搜索的能力&#xff0c;不容易…

免疫算法详解

基本思想是将想要求解的各类优化问题的目标函数&#xff08;约束条件&#xff09;与抗原相对应&#xff0c;找到可以与抗原进行亲和反应的抗体&#xff0c;该抗体就是要求的最优解。 最核心要解决的就是 1.计算抗原和抗体的亲和度&#xff0c;亲和度越高&#xff0c;越可能是最…

人工免疫算法总结

人工免疫算法简介 免疫系统 免疫系统是哺乳动物抵御外来病毒侵害的防御系统&#xff0c;动物的生命过程中会遇到各种伤害可能&#xff0c;免疫系统为其正常的活动起着重要的作用。免疫系统的一大特点就是用有限的资源有效地应对了数量庞大且种类多变的病毒入侵。免疫算法基于…

免疫算法小结及算法实例(附Matlab代码)

文章目录 1、免疫算法流程2、关键参数说明3、MATLAB仿真实例3.1 免疫算法求一元函数的极值3.2 免疫算法求二元函数的极值3.3 免疫算法求解旅行商问题 4、免疫算法的特点 1、免疫算法流程 与遗传算法等其他智能优化算法类似&#xff0c;免疫算法的进化寻优过程也是通过算子来实…

免疫优化算法

免疫优化算法 免疫算法是模仿生物免疫机制&#xff0c;结合基因的进化机理&#xff0c;人工构造出的一种新型智能优化算法。 它具有一般免疫系统的特征&#xff0c;采用群体搜索策略&#xff0c;通过迭代计算&#xff0c;最终以较大的概率得到问题的最优解。 相比较于其他算法…

智能优化算法之免疫算法(IA)

这里写目录标题 1. 免疫算法思想起源2. 算法原理3. 免疫算法算子3.1 算法算子3.1.1 亲和度评价算子3.1.2 抗体浓度评价算子&#xff1a;3.1.3 激励度计算算子3.1.4 免疫选择算子3.1.5 克隆算子3.1.6 变异算子3.1.7 实数编码变异算子3.1.8 离散编码变异算子3.1.9 克隆抑制算子3.…

免疫算法(Immune Algorithm,IA)实例详解

免疫算法是将免疫概念及其理论应用于遗传算法&#xff0c;在保留原算法优良特性的前提下&#xff0c;利用抗体浓度评价算子和激励度计算算子来保持群体的多样性&#xff0c;克服了一般寻优过程中&#xff08;特别是多峰值&#xff09;不可避免的“早熟”问题。 1 算法概念 免…

一文搞懂什么是免疫算法Immune Algorithm【详细介绍】

本文参考了很多张军老师《计算智能》的第七章知识。 本文来源&#xff1a;https://blog.csdn.net/qq_44186838/article/details/109181453 免疫算法 1.1 算法简介 免疫算法&#xff08;Immune Algorithm&#xff0c;IA&#xff09;&#xff1a;是指以在人工免疫系统的理论为基…

免疫算法(Immune Algorithm)详解

关于免疫算法&#xff08;IA&#xff09;&#xff0c;其功能与遗传算法、模拟退火等算法实现的功能是相同的&#xff0c;都是用来求最优解。例如求函数最值、旅行商问题等。从本质上说&#xff0c;免疫算法更像是遗传算法的一种延申。IA虽然其中借鉴了生物学&#xff08;免疫学…

免疫算法

免疫算法是受生物免疫系统的启发而推出的一种新型的智能搜索算法&#xff0c;是一种确定性和随机性选择相结合并具有"勘探"与"开采"能力的启发式随机搜索算法。 算法主要的步骤: (1)抗原识别与初始抗体产生。 (2)抗体评价 (3)免疫操作 免疫算法的特点: (1)…

闵可夫斯基距离—大白话篇幅[有错误的话请指教]

包括&#xff1a;曼哈顿距离&#xff0c;欧氏距离&#xff0c;切比雪夫距离&#xff1b; 举例子&#xff1a;两个点&#xff1a;A(1,9),B(5,8) 1&#xff0c;曼哈顿距离&#xff1a; 就是取和&#xff1a;|&#xff08;1-5&#xff09;||&#xff08;9-8&#xff09;|5;曼哈顿…

闵可夫斯基距离(LP距离)、曼哈顿距离、欧式距离、切比雪夫距离、马哈拉诺比斯距离、相关系数、夹角余弦

标题闵可夫斯基距离(LP距离)、曼哈顿距离、欧式距离、切比雪夫距离、马哈拉诺比斯距离、相关系数、夹角余弦 在聚类中&#xff0c;可以将样本集合看作是向量空间中的点的集合&#xff0c;以该空间的距离表示样本之间相似度。常用的距离有闵可夫斯基距离&#xff0c;闵可夫斯基…

【Python经典题目】闵可夫斯基距问题

题目 定义一个高维空间样本点集类HDPoints&#xff0c;须包含以下数据属性与方法属性&#xff1a; (a)数据属性self.points&#xff1a;类型为列表&#xff0c;由多个子列表构成&#xff0c;每个子列表表示高维空间中的一个数据点&#xff0c;且数据维度可以任意&#xff0c;…

欧氏距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离

转载自&#xff1a;https://baijiahao.baidu.com/s?id1577090844304882120&wfrspider&forpc 欧氏距离(Euclidean Distance) 欧氏距离是最容易直观理解的距离度量方法&#xff0c;我们小学、初中和高中接触到的两个点在空间中的距离一般都是指欧氏距离。 欧氏距离 二…

数值属性的相异性:闵可夫斯基距离

本文介绍数值属性刻画的对象之间的相异性度量&#xff0c;首先&#xff0c;应该把数据进行规范化&#xff0c;使之落入更小的值域&#xff0c;例[0&#xff0c;1]&#xff0c;[0.0,1.0] 1&#xff1a;最流行的距离度量&#xff1a;欧几里得距离 2&#xff1a;曼哈顿距离 3&…

各种距离 欧式距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、标准欧氏距离、马氏距离、余弦距离、汉明距离、杰拉德距离、相关距离、信息熵...

1. 欧氏距离(Euclidean Distance) 欧氏距离是最容易直观理解的距离度量方法&#xff0c;我们小学、初中和高中接触到的两个点在空间中的距离一般都是指欧氏距离。 二维平面上点a(x1,y1)与b(x2,y2)间的欧氏距离: 三维空间点a(x1,y1,z1)与b(x2,y2,z2)间的欧氏距离: n维空间点a(x1…

常用的相似度计算方法----欧式距离、曼哈顿距离、马氏距离、余弦、汉明距离、切比雪夫距离、闵可夫斯基距离、马氏距离

在深度学习以及图像搜索中&#xff0c;经常要对特征值进行比对&#xff0c;得到特征的相似度&#xff0c;常见的特征值比对方法有汉明距离、余弦距离、欧式距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、马氏距离等&#xff0c;下面对各种比对方法分别进行介绍。 目录 1汉…