日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2024/9/30 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 万字长文了解免疫算法原理 及求解复杂约束问题(源码实现) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

免疫算法理論

??????生物免疫系統(tǒng)是-一個復(fù)雜的自適應(yīng)系統(tǒng)。免疫系統(tǒng)能夠識別出病原體,具有學(xué)習(xí)、記憶和模式識別能力,因此可以借鑒其信息處理機(jī)制來解決科學(xué)和工程問題。免疫算法正是基于生物免疫系統(tǒng)識別外部病原體并產(chǎn)生抗體對抗病原體的學(xué)習(xí)機(jī)制而提出的,由此誕生了基于免疫原理的智能優(yōu)化方法研究這一新的研究方向。
生物免疫系統(tǒng)
?????? 傳統(tǒng)免疫是指機(jī)體抗感染的防御能力,而現(xiàn)代免疫則指機(jī)體免疫系統(tǒng)識別和排除抗原性異物,從而維持機(jī)體生理平衡和穩(wěn)定的功能。免疫是機(jī)體的一種生理反應(yīng),當(dāng)病原體(即抗原)進(jìn)入人體時,這些抗原將刺激免疫細(xì)胞(淋巴B細(xì)胞、T細(xì)胞)產(chǎn)生一種抵抗該病原生物的特殊蛋白質(zhì)- --抗體??贵w能將該病原生物消滅,并在將病原生物消滅之后,仍存留在人體內(nèi)。當(dāng)同樣的病原生物再次侵入人體時,該病原生物就會很快地被體內(nèi)存留的抗體消滅。

免疫
?????? 免疫是指機(jī)體對自身和異體識別與響應(yīng)過程中產(chǎn)生的生物學(xué)效應(yīng)的總和,正常情況下是一種維持機(jī)體循環(huán)穩(wěn)定的生理性功能。生物機(jī)體識別異體抗原,對其產(chǎn)生免疫響應(yīng)并清除;機(jī)體對自身抗原不產(chǎn)生免疫響應(yīng)。
抗原
??????抗原是一種能夠刺激機(jī)體產(chǎn)生免疫應(yīng)答并能與應(yīng)答產(chǎn)物結(jié)合的物質(zhì)。它不是免疫系統(tǒng)的有機(jī)組成部分,但它是啟動免疫應(yīng)答的始動因素。

抗體
??????抗體是一種能夠進(jìn)行特異識別和清除抗原的免疫分子,其中具有抗細(xì)菌和抗毒素免疫功能的球蛋白物質(zhì),故抗體也稱免疫球蛋白分子,它是由B細(xì)胞分化成的漿細(xì)胞所產(chǎn)生的。

T細(xì)胞和B細(xì)胞
??????T細(xì)胞和B細(xì)胞是淋巴細(xì)胞的主要組成部分。B細(xì)胞受到抗原刺激后,可增殖分化為大量漿細(xì)胞,而漿細(xì)胞具有合成和分泌抗體的功能。但是,B細(xì)胞不能識別大多數(shù)抗原,必須借助能識別抗原的輔助性T細(xì)胞來輔助B細(xì)胞活化,產(chǎn)生抗體。

生物免疫系統(tǒng)原理
??????生物免疫系統(tǒng)是由免疫分子、免疫組織和免疫細(xì)胞組成的復(fù)雜系統(tǒng)。這些組成免疫系統(tǒng)的組織和器官分布在人體各處,用來完成各種免疫防衛(wèi)功能,它們就是人們熟知的淋巴器官和淋巴組織。

免疫算法基本概念
??????免疫算法是受生物免疫系統(tǒng)的啟發(fā)而推出的一種新型的智能搜索算法。它是一種確定性和隨機(jī)性選擇相結(jié)合并具有“勘探”與“開采”能力的啟發(fā)式隨機(jī)搜索算法。免疫算法將優(yōu)化問題中待優(yōu)化的問題對應(yīng)免疫應(yīng)答中的抗原,可行解對應(yīng)抗體(B細(xì)胞),可行解質(zhì)量對應(yīng)免疫細(xì)胞與抗原的親和度。如此則可以將優(yōu)化問題的尋優(yōu)過程與生物免疫系統(tǒng)識別抗原并實(shí)現(xiàn)抗體進(jìn)化的過程對應(yīng)起來,將生物免疫應(yīng)答中的進(jìn)化過程抽象為數(shù)學(xué)上的進(jìn)化尋優(yōu)過程,形成一種智能優(yōu)化算法。
??????免疫算法是對生物免疫系統(tǒng)機(jī)理抽象而得的,算法中的許多概念和算子與免疫系統(tǒng)中的概念和免疫機(jī)理存在著對應(yīng)關(guān)系。免疫算法與生物免疫系統(tǒng)概念的對應(yīng)關(guān)系如表4.1所示。由于抗體是由B細(xì)胞產(chǎn)生的,在免疫算法中對抗體和B細(xì)胞不做區(qū)分,都對應(yīng)為優(yōu)化問題的可行解。

免疫算法的特點(diǎn)
??????免疫算法是受免疫學(xué)啟發(fā),模擬生物免疫系統(tǒng)功能和原理來解決復(fù)雜問題的自適應(yīng)智能系統(tǒng),它保留了生物免疫系統(tǒng)所具有的若干特,包括:
??????(1)全局搜索能力。模仿免疫應(yīng)答過程提出的免疫算法是一 種具有全局搜索能力的優(yōu)化算法,免疫算法在對優(yōu)質(zhì)抗體鄰域進(jìn)行局部搜索的同時利用變異算子和種群刷新算子不斷產(chǎn)生新個體,探索可行解區(qū)間的新區(qū)域,保證算法在完整的可行解區(qū)間進(jìn)行搜索,具有全局收斂性能。
??????(2)多樣性保持機(jī)制。免疫算法借鑒了生物免疫系統(tǒng)的多樣性保持機(jī)制,對抗體進(jìn)行濃度計算,并將濃度計算的結(jié)果作為評價抗體個體優(yōu)劣的-一個重要標(biāo)準(zhǔn);它使?jié)舛雀叩目贵w被抑制,保證抗體種群具有很好的多樣性,這也是保證算法全局收斂性能的一個重要方面。
??????(3)魯棒性強(qiáng)?;谏锩庖邫C(jī)理的免疫算法不針對特定問題,而且不強(qiáng)調(diào)算法參數(shù)設(shè)置和初始解的質(zhì)量,利用其啟發(fā)式的智能搜索機(jī)制,即使起步于劣質(zhì)解種群,最終也可以搜索到問題的全局最優(yōu)解,對問題和初始解的依賴性不強(qiáng),具有很強(qiáng)的適應(yīng)性和魯棒性。
??????(4)并行分布式搜索機(jī)制。免疫算法不需要集中控制,可以實(shí)現(xiàn)并行處理。而且,免疫算法的優(yōu)化進(jìn)程是一種多進(jìn)程的并行優(yōu)化,在探求問題最優(yōu)解的同時可以得到問題的多個次優(yōu)解,即除找到問題的最佳解決方案外,還會得到若干較好的備選方案,尤其適合于多模態(tài)的優(yōu)化問題。

免疫算法算子

??????與遺傳算法等其他智能優(yōu)化算法類似,免疫算法的進(jìn)化尋優(yōu)過程也是通過算子來實(shí)現(xiàn)的。免疫算法的算子包括:親和度評價算子、抗體濃度評價算子、激勵度計算算子、免疫選擇算子、克隆算子、變異算子、克隆抑制算子和種群刷新算子等。由于算法的編碼方式可能為實(shí)數(shù)編碼、離散編碼等,不同編碼方式下的算法算子會有所不同
親和度評價算子
??????親和度表征免疫細(xì)胞與抗原的結(jié)合強(qiáng)度,與遺傳算法中的適應(yīng)度類似。親和度評價算子通常是一個函數(shù)aff(x): S∈R,其中S為問題的可行解區(qū)間,R為實(shí)數(shù)域。函數(shù)的輸入為一個抗體個體(可行解),輸出即為親和度評價結(jié)果。親和度的評價與問題具體相關(guān),針對不同的優(yōu)化問題,應(yīng)該在理解問題實(shí)質(zhì)的前提下,根據(jù)問題的特點(diǎn)定義親和度評價函數(shù)。通常函數(shù)優(yōu)化問題可以用函數(shù)值或?qū)瘮?shù)值的簡單處理(如取倒數(shù)、相反數(shù)等)作為親和度評價,而對于組合優(yōu)化問題或應(yīng)用中更為復(fù)雜的優(yōu)化問題,則需要具體問題具體分析。
抗體濃度評價算子
??????抗體濃度表征抗體種群的多樣性好壞??贵w濃度過高意味著種群中非常類似的個體大量存在,則尋優(yōu)搜索會集中于可行解區(qū)間的一一個區(qū)域,不利于全局優(yōu)化。因此優(yōu)化算法中應(yīng)對濃度過高的個體進(jìn)行抑制,保證個體的多樣性。
??????抗體濃度通常定義為:濃度越低值越大

??????進(jìn)行抗體濃度評價的–個前提是抗體間親和度的定義。免疫中經(jīng)常提到的親和度為抗體對抗原的親和度,實(shí)際上抗體和抗體之間也存在著親和度的概念,它代表了兩個抗體個體之間的相似程度??贵w間親和度的計算方法主要包括基于抗體和抗原親和度的計算方法、基于歐氏距離的計算方法、基于海明距離的計算方法、基于信息熵的計算方法等。
??????對于實(shí)數(shù)編碼的算法,抗體間親和度通??梢酝ㄟ^抗體向量之間的歐氏距離來計算:

??????對于基于離散編碼的算法,衡量抗體_抗體親和度最直接的方法就是利用抗體串的海明距離:

激勵度計算算子
??????抗體激勵度是對抗體質(zhì)量的最終評價結(jié)果,需要綜合考慮抗體親和度和抗體濃度,通常親和度大(目標(biāo)函數(shù)值好)、濃度低的抗體會得到較大的激勵度(即優(yōu)秀)??贵w激勵度的計算通
??梢岳每贵w親和度和抗體濃度的評價結(jié)果進(jìn)行簡單的數(shù)學(xué)運(yùn)算得到,如:

免疫選擇算子
??????免疫選擇算子根據(jù)抗體的激勵度確定選擇哪些抗體進(jìn)入克隆選擇操作。在抗體群中激勵度高的抗體個體具有更好的質(zhì)量,更有可能被選中進(jìn)行克隆選擇操作,在搜索空間中更有搜索價值。

克隆算子
??????克隆算子將免疫選擇算子選中的抗體個體進(jìn)行復(fù)制。,

變異算子
??????變異算子對克隆算子得到的抗體克隆結(jié)果進(jìn)行變異操作,以產(chǎn)生親和度突變,實(shí)現(xiàn)局部搜索。變異算子是免疫算法中產(chǎn)生有潛力的新抗體、實(shí)現(xiàn)區(qū)域搜索的重要算子,它對算法的性能有很大影響。變異算子也和算法的編碼方式相關(guān),實(shí)數(shù)編碼的算法和離散編碼的算法采用不同的變異算子。

克隆抑制算子
??????克隆抑制算子用于對經(jīng)過變異后的克隆體進(jìn)行再選擇,抑制親和度低的抗體,保留親和度高的抗體進(jìn)入新的抗體種群。在克隆抑制的過程中,克隆算子操作的源抗體與克隆體經(jīng)變異算子作用后得到的臨時抗體群共同組成-一個合,克隆抑制操作將保留此集合中親和度最高的抗體,抑制其他抗體。由于克隆變異算子操作的源抗體是種群中的優(yōu)質(zhì)抗體,而克隆抑制算子操作的臨時抗體集合中又包含了父代的源抗體,因此在免疫算法的算子操作中隱含了最優(yōu)個體保留機(jī)制。

種群刷新算子
??????種群刷新算子用于對種群中激勵度較低的抗體進(jìn)行刷新,從抗體種群中刪除這些抗體并以隨機(jī)生成的新抗體替代,有利于保持抗體的多樣性,實(shí)現(xiàn)全局搜索,探索新的可行解空間區(qū)域。

免疫算法流程

免疫算法算例

算例1
??????求函數(shù)f(x,y)= 5sin(x)+x2+y的最小值,其中x的取值范圍為[-4, 4],y的取值范圍為[-_4,4]。這是一個有多個局部極值的函數(shù)。

matlab求解

%%%%%%%%%%%%%%%%%免疫算法求函數(shù)極值%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%% clear all; %清除所有變量 close all; %清圖 clc; %清屏 D=2; %免疫個體維數(shù) NP=50; %免疫個體數(shù)目 Xs=4; %取值上限 Xx=-4; %取值下限 G=200; %最大免疫代數(shù) pm=0.7; %變異概率 alfa=2; %激勵度系數(shù) belta=1; %激勵度系數(shù) detas=0.2; %相似度閾值 gen=0; %免疫代數(shù) Ncl=5; %克隆個數(shù) deta0=0.5*Xs; %鄰域范圍初值 %%%%%%%%%%%%%%%%%%%%%%%初始種群%%%%%%%%%%%%%%%%%%%%%%%% f=rand(D,NP)*(Xs-Xx)+Xx; for np=1:NPMSLL(np)=func2(f(:,np)); end %%%%%%%%%%%%%%%%%計算個體濃度和激勵度%%%%%%%%%%%%%%%%%%% for np=1:NPfor j=1:NP nd(j)=sum(sqrt((f(:,np)-f(:,j)).^2));if nd(j)<detasnd(j)=1;elsend(j)=0;endendND(np)=sum(nd)/NP; end MSLL = alfa*MSLL- belta*ND; %%%%%%%%%%%%%%%%%%%激勵度按升序排列%%%%%%%%%%%%%%%%%%%%%% [SortMSLL,Index]=sort(MSLL); Sortf=f(:,Index); %%%%%%%%%%%%%%%%%%%%%%%%免疫循環(huán)%%%%%%%%%%%%%%%%%%%%%%%% while gen<Gfor i=1:NP/2%%%%%%%%選激勵度前NP/2個體進(jìn)行免疫操作%%%%%%%%%%%a=Sortf(:,i);Na=repmat(a,1,Ncl);deta=deta0/gen;for j=1:Nclfor ii=1:D%%%%%%%%%%%%%%%%%變異%%%%%%%%%%%%%%%%%%%if rand<pmNa(ii,j)=Na(ii,j)+(rand-0.5)*deta;end%%%%%%%%%%%%%%邊界條件處理%%%%%%%%%%%%%%%if (Na(ii,j)>Xs) | (Na(ii,j)<Xx)Na(ii,j)=rand * (Xs-Xx)+Xx;endendendNa(:,1)=Sortf(:,i); %保留克隆源個體%%%%%%%%%%克隆抑制,保留親和度最高的個體%%%%%%%%%%for j=1:NclNaMSLL(j)=func2(Na(:,j));end[NaSortMSLL,Index]=sort(NaMSLL);aMSLL(i)=NaSortMSLL(1);NaSortf=Na(:,Index);af(:,i)=NaSortf(:,1);end %%%%%%%%%%%%%%%%%%%%免疫種群激勵度%%%%%%%%%%%%%%%%%%%for np=1:NP/2for j=1:NP/2nda(j)=sum(sqrt((af(:,np)-af(:,j)).^2)); if nda(j)<detasnda(j)=1;elsenda(j)=0;endendaND(np)=sum(nda)/NP/2;endaMSLL = alfa*aMSLL- belta*aND;%%%%%%%%%%%%%%%%%%%%%%%種群刷新%%%%%%%%%%%%%%%%%%%%%%%bf=rand(D,NP/2)*(Xs-Xx)+Xx;for np=1:NP/2bMSLL(np)=func2(bf(:,np));end%%%%%%%%%%%%%%%%%%%新生成種群激勵度%%%%%%%%%%%%%%%%%%%%for np=1:NP/2for j=1:NP/2ndc(j)=sum(sqrt((bf(:,np)-bf(:,j)).^2));if ndc(j)<detasndc(j)=1;elsendc(j)=0;endendbND(np)=sum(ndc)/NP/2;endbMSLL = alfa*bMSLL- belta*bND;%%%%%%%%%%%%%%免疫種群與新生種群合并%%%%%%%%%%%%%%%%%%%f1=[af,bf];MSLL1=[aMSLL,bMSLL];[SortMSLL,Index]=sort(MSLL1);Sortf=f1(:,Index);gen=gen+1;trace(gen)=func2(Sortf(:,1)); end %%%%%%%%%%%%%%%%%%%%%%%輸出優(yōu)化結(jié)果%%%%%%%%%%%%%%%%%%%%%%%% Bestf=Sortf(:,1); %最優(yōu)變量 trace(end); %最優(yōu)值 figure,plot(trace) xlabel('迭代次數(shù)') ylabel('目標(biāo)函數(shù)值') title('親和度進(jìn)化曲線')%%%%%%%%%%%%%%%%%%%%%%%%%親和度函數(shù)%%%%%%%%%%%%%%%%%%%%%% function value=func2(x) value=5*sin(x(1)*x(2))+x(1)*x(1)+x(2)*x(2); end

python求解

import numpy as np import pandas as pd from tqdm import tqdm#進(jìn)度條設(shè)置 import matplotlib.pyplot as plt from pylab import * import matplotlib; matplotlib.use('TkAgg') mpl.rcParams['font.sans-serif'] = ['SimHei'] mpl.rcParams['axes.unicode_minus'] = False####################初始化參數(shù)################### D=2 #免疫個體維數(shù) NP=50 #免疫個體數(shù)目 Xs=4 #取值上限 Xx=-4 #取值下限 G=200 #最大免疫代數(shù) pm=0.7 #變異概率 alfa=2 #激勵度系數(shù) belta=1 #激勵度系數(shù) detas=0.2 #相似度閾值 gen=0 #免疫代數(shù) Ncl=5 #克隆個數(shù) deta0=0.5*Xs #鄰域范圍初值###目標(biāo)函數(shù) def calc_f(X):value = 5*np.sin(X[0]*X[1]) +(X[0] * X[0] + X[1] * X[1])return value##############計算個體濃度和激勵度########## def motivation(x,num):ND = np.zeros((num,1)) #臨時數(shù)組nd = np.zeros((num,1)) #濃度for i in range(num):for j in range(num):tmp = np.sqrt(np.sum((x[i, :] - x[j, :]) ** 2))if (tmp > detas):ND[i,0] = 0else:ND[i,0] = 1nd[i,0] = np.sum(ND) / num## 激勵度MSLL = np.zeros((num,1))for i in range(num):tmp = calc_f(x[i])MSLL[i,0] = tmpmtv = alfa * MSLL - belta * ndreturn mtv#################免疫算法####################種群初始化 f=np.random.random((NP,D))*(Xs-Xx)+Xx #shape(50, 2)MSLL=np.zeros((NP,1)) #存儲當(dāng)代種群激勵度值#統(tǒng)一術(shù)語:親和度值最高=激勵度值最低 ##計算初始種群親和度值(激勵度值) for i in range(NP):MSLL[i]=calc_f(f[i])###激勵度按升序排序 Index=np.argsort(MSLL,axis=0) Index=Index[:,0] Sortf=f[Index] #shape(50, 2)af=np.zeros((np.int(NP/2),D))#存儲變異后的個體trace=[] #記錄迭代激勵度最優(yōu)值 #########免疫循環(huán)############ for gen in tqdm(range(G)):#遍歷每一次迭代for i in range(np.int(NP/2)):#遍歷前一半樣本#選激勵度前NP/2個體進(jìn)行免疫操作a = Sortf[i]#當(dāng)前個體 .shape(2,)a=a.reshape(-1,2)Na = np.tile(a,(Ncl,1)) #對當(dāng)前個體進(jìn)行克隆 Na.shape=(5, 2)deta = deta0 / (gen+1) #剛開始迭代時,deta較大,隨著迭代次數(shù)變多,deta減少for j in range(Ncl):#遍歷每一個克隆樣本for ii in range(D):#遍歷每一個維度################變異####if np.random.random()<pm:#以一定概率進(jìn)行變異Na[j,ii]=Na[j,ii]+(np.random.random()-0.5)*deta #元素=元素+加一個很小的隨機(jī)數(shù)#邊界條件處理if Na[j,ii]>Xs or Na[j,ii]<Xx:#如果在上下限范圍外Na[j, ii]=np.random.uniform(Xx,Xs,1)#保留克隆源個體Na[0,:]=Sortf[i]#####克隆抑制,保留親和度最高的個體NaMSLL = np.zeros((Ncl, 1)) # 存儲變異種群激勵度值for j in range(Ncl): # 遍歷每一個克隆樣本NaMSLL[j]=calc_f(Na[j])Index = np.argsort(NaMSLL, axis=0)#激勵度按升序排序Index = Index[:, 0]NaSortf=Na[Index] #排序后的種群af[i]=NaSortf[0] #取最優(yōu)#print(af.shape)#(25, 2)####免疫種群(克隆變異部分的)激勵度aMSLL=motivation(af,af.shape[0])#print(aMSLL.shape)#(25, 1)###種群刷新,產(chǎn)生一半新生群體bf = np.random.random((np.int(NP/2),D))*(Xs-Xx)+Xx #bf.shape=(25, 2)bMSLL=motivation(bf,bf.shape[0])#新生種群的激勵度 bMsLL.shape=(25, 1)#########免疫種群與新生種群合并#############f1 = np.concatenate((af,bf),axis=0) # 合并的種群 f1.shape=(50, 2)MSLL1=np.concatenate((aMSLL,bMSLL),axis=0) # 合并種群激勵度值 MSLL1.shape=(50, 1)Index = np.argsort(MSLL1, axis=0)Index = Index[:, 0]Sortf = f1[Index] # shape(50, 2)trace.append(calc_f(f1[0]))#記錄最優(yōu)個體的激勵度值############輸出優(yōu)化結(jié)果 Bestf=Sortf[0,:] #最優(yōu)變量 print('最優(yōu)變量',Bestf) print('最優(yōu)值',trace[-1] ) #最優(yōu)值plt.plot(trace) plt.title('迭代曲線') plt.show()

免疫算法求解復(fù)雜約束問題

求解方法

  • 一開始設(shè)計編碼規(guī)則時,讓解編碼就只可能在可行區(qū)域內(nèi)。典型的例子是算法做實(shí)數(shù)函數(shù)的優(yōu)化,會給出 upper bound和lower bound,然后無論怎樣的個體,解碼后都在這兩個bound之間 。
  • 設(shè)計合理的變異算子,使得滿足這些算子本身的特性的前提下,還讓算子運(yùn)算后的個體也在可行域內(nèi)。此方法 例子見TSP求解。
  • 罰函數(shù)法。萬能方法。但罰函數(shù)太多或太嚴(yán)格,會導(dǎo)致效果很差。懲罰系數(shù)較大,族群會更加集中在可行域中,而不鼓勵向不可行域探索。當(dāng)懲罰系數(shù)過大,容易使算法收斂于局部最優(yōu);懲罰系數(shù)較小,族群會更積極在不可行域中進(jìn)行大量探索,一定程度上能幫助尋找全局最優(yōu),但也有浪費(fèi)算力的風(fēng)險。當(dāng)懲罰系數(shù)過小,算法可能會收斂于不可行解。
  • 在變異/交叉之后加入一個判斷語句,判斷是否滿足約束條件,如果不滿足,有兩個策略:超出邊界的放到邊界上。或者超出邊界的,重新初始化。

注意事項

??????在優(yōu)化算法中,每一步迭代都會更新個體和群體,雖然可以將有約束問題轉(zhuǎn)換為無約束問題進(jìn)行迭代求解,但是問題的解xi依然存在不滿足約束條件的情況,因此需要編制一些規(guī)則來比較兩個粒子的優(yōu)劣,規(guī)則如下:

  • 如果兩個粒子xi和xj都可行,則比較其適應(yīng)度函數(shù)f(xi)和f(xj),值小的粒子為優(yōu)。
  • 當(dāng)兩個粒子xi和xj都不可行,則比較懲罰項P(xi)和P(xj),違背約束程度小的粒子更優(yōu)。
  • 當(dāng)粒子xi可行而粒子xj不可行,選可行解。

?????問題

流程圖
此流程圖是我自己的求解思路

python 版求解

import numpy as np import pandas as pd from tqdm import tqdm#進(jìn)度條設(shè)置 import matplotlib.pyplot as plt from pylab import * import matplotlib; matplotlib.use('TkAgg') mpl.rcParams['font.sans-serif'] = ['SimHei'] mpl.rcParams['axes.unicode_minus'] = False####################初始化參數(shù)################### D=2 #免疫個體維數(shù) NP=50 #免疫個體數(shù)目 G=50 #最大免疫代數(shù) pm=0.7 #變異概率 alfa=2 #激勵度系數(shù) belta=1 #激勵度系數(shù) detas=0.2 #相似度閾值 gen=0 #免疫代數(shù) Ncl=5 #克隆個數(shù) deta0=0.5*2 #鄰域范圍初值########################這里定義一些參數(shù),分別是計算激勵度函數(shù)和計算約束懲罰項函數(shù)############def calc_f(X):"""計算個體的目標(biāo)函數(shù)值,X 的維度是 size * 2 """a = 10pi = np.pix = X[0]y = X[1]return 2 * a + x ** 2 - a * np.cos(2 * pi * x) + y ** 2 - a * np.cos(2 * 3.14 * y)def calc_e(X):"""計算個體的目懲罰項,X 的維度是 size * 2 """ee = 0"""計算第一個約束的懲罰項"""e1 = X[0] + X[1] - 6ee += max(0, e1)"""計算第二個約束的懲罰項"""e2 = 3 * X[0] - 2 * X[1] - 5ee += max(0, e2)return ee########################這里定義一些免疫算法相關(guān)的函數(shù)#############統(tǒng)一術(shù)語:激勵度最低=親和度最高#計算個體濃度和激勵度## def motivation(x,num):"""param x:群體param num:群體個數(shù)return : alfa*(目標(biāo)函數(shù)值+懲罰項)-belta*濃度 .其中的目標(biāo)函數(shù)值為最小化問題"""ND = np.zeros((num,1)) #臨時數(shù)組nd = np.zeros((num,1)) #濃度for i in range(num):for j in range(num):tmp = np.sqrt(np.sum((x[i, :] - x[j, :]) ** 2))if (tmp > detas):ND[i,0] = 0else:ND[i,0] = 1nd[i,0] = np.sum(ND) / num #濃度## 激勵度MSLL = np.zeros((num,1)) #MSLL存儲 群體激勵度。激勵度=目標(biāo)函數(shù)值+懲罰項for i in range(num):tmp = calc_f(x[i])#目標(biāo)函數(shù)值ee=calc_e(x[i]) #懲罰項MSLL[i,0] = tmp+ee #激勵度=目標(biāo)函數(shù)值+懲罰項mtv = alfa * MSLL - belta * ndreturn mtv#alfa*(目標(biāo)函數(shù)值+懲罰項)-belta*濃度#免疫操作函數(shù):克隆、變異、變異抑制 def variation(Sortf):"""param Sortf:按親和度大小排序后的群體return :af 經(jīng)過克隆、變異、變異抑制后的群體"""af = np.zeros((np.int(NP / 2), D)) # 存儲變異后的個體for i in range(np.int(NP / 2)): # 遍歷前一半個體# 選激勵度前NP/2個體進(jìn)行免疫操作a = Sortf[i] # 當(dāng)前個體 .shape(D,)a = a.reshape(-1, D) #(-1,維度D)Na = np.tile(a, (Ncl, 1)) # 對當(dāng)前個體進(jìn)行克隆 Na.shape=(Ncl, D)deta = deta0 / (gen + 1) # 剛開始迭代時,deta較大,隨著迭代次數(shù)變多,deta減少for j in range(Ncl):#遍歷每一個克隆樣本for ii in range(D):#遍歷每一個維度################變異####if np.random.random()<pm:#以一定概率進(jìn)行變異Na[j,ii]=Na[j,ii]+(np.random.random()-0.5)*deta #元素=元素+加一個很小的隨機(jī)數(shù)# x邊界條件處理if Na[j, 0] > 2 or Na[j, 0] < 1: # 如果在上下限范圍外Na[j, 0] = np.random.uniform(1, 2, 1)#y邊界條件處理if Na[j, 1] > 0 or Na[j, 1] < -1: # 如果在上下限范圍外Na[j, 1] = np.random.uniform(-1, 0, 1)# 保留克隆源個體Na[0, :] = Sortf[i]#####克隆抑制,保留親和度最高(激勵度最低)的個體NaMSLL = np.zeros((Ncl, 1)) # 存儲變異種群激勵度值for j in range(Ncl): # 遍歷每一個克隆樣本NaMSLL[j]=calc_f(Na[j])+calc_e(Na[j]) #目標(biāo)函數(shù)值+懲罰項Index = np.argsort(NaMSLL, axis=0) # 激勵度按升序排序Index = Index[:, 0]NaSortf = Na[Index] # 排序后的種群af[i] = NaSortf[0] # 取最優(yōu)return af #免疫操作:創(chuàng)建新生種群 def refresh():"""創(chuàng)建一般新生種群并返回"""bf = np.random.random((np.int(NP / 2), D))##邊界條件處理for j in range(bf.shape[0]):#遍歷每一個個體#x邊界條件處理if bf[j, 0] > 2 or bf[j, 0] < 1: # 如果在上下限范圍外bf[j, 0] = np.random.uniform(1, 2, 1)#y邊界條件處理if bf[j, 1] > 0 or bf[j, 1] < -1: # 如果在上下限范圍外bf[j, 1] = np.random.uniform(-1, 0, 1)return bf#############這里定義懲罰項帶來的子代與父代的選擇函數(shù) #子代和父輩之間的選擇操作 def update_best(parent,parent_fitness,parent_e,child,child_fitness,child_e):"""判:param parent: 父輩個體:param parent_fitness:父輩適應(yīng)度值:param parent_e :父輩懲罰項:param child: 子代個體:param child_fitness 子代適應(yīng)度值:param child_e :子代懲罰項:return: 父輩 和子代中較優(yōu)者、適應(yīng)度、懲罰項"""# 規(guī)則1,如果 parent 和 child 都沒有違反約束,則取適應(yīng)度小的if parent_e <= 0.0000001 and child_e <= 0.0000001:if parent_fitness <= child_fitness:return parent,parent_fitness,parent_eelse:return child,child_fitness,child_e# 規(guī)則2,如果child違反約束而parent沒有違反約束,則取parentif parent_e < 0.0000001 and child_e >= 0.0000001:return parent,parent_fitness,parent_e# 規(guī)則3,如果parent違反約束而child沒有違反約束,則取childif parent_e >= 0.0000001 and child_e < 0.0000001:return child,child_fitness,child_e# 規(guī)則4,如果兩個都違反約束,則取適應(yīng)度值小的if parent_fitness <= child_fitness:return parent,parent_fitness,parent_eelse:return child,child_fitness,child_e########################免疫算法流程開始數(shù)###############1.種群初始化 f=np.random.random((NP,D)) #shape(50, 2) MSLL=np.zeros((NP,1)) #存儲當(dāng)代種群親和值##2.計算初始種群激勵度值(親和度值) for i in range(NP):MSLL[i]=calc_f(f[i])+calc_e(f[i])###3.激勵度按升序排序 Index=np.argsort(MSLL,axis=0) Index=Index[:,0] Sortf=f[Index] #shape(50, 2) #排序后的初始群體###4.免疫循環(huán) trace=[] #記錄迭代激勵度最優(yōu)值 for gen in tqdm(range(G)):#遍歷每一次迭代af=variation(Sortf)# 選擇一半個體 進(jìn)行克隆、變異、變異抑制aMSLL = motivation(af, af.shape[0]) #計算上一步得到的群體(親和度) 激勵度=alfa*(目標(biāo)函數(shù)值+懲罰項)-belta*濃度 shape=(25,1)bf=refresh()#創(chuàng)建一半新生種群#bf.shape=(25, 2)bMSLL = motivation(bf, bf.shape[0]) # 新生種群的激勵度 bMsLL.shape=(25, 1)# ##########種群刷新:免疫種群與新生種群合并##f1 = np.concatenate((af, bf), axis=0) # 合并的種群 f1.shape=(50, 2) f1為子代MSLL1 = np.concatenate((aMSLL, bMSLL), axis=0) # 合并種群激勵度值 MSLL1.shape=(50, 1)# 更新群體#Sortf為父代群體parentfitness= motivation(Sortf, Sortf.shape[0]) #父代親和度#子代和父代的選擇,首先選對的for j in range(NP):#遍歷每一個個體parent=Sortf[j]#父親parent_fitness=parentfitness[j]#父親親和度parent_ee=calc_e(parent) #父親懲罰項child=f1[j]#兒子child_fitness=MSLL1[j]#兒子親和度child_ee=calc_e(child)#兒子懲罰項f1[j],child_fitness1,child_ee1=update_best(parent, parent_fitness, parent_ee,child, child_fitness,child_ee)#得到子代與父代選擇更新后的群體f1MSLL2=motivation(f1, f1.shape[0])#種群激勵度值 MSLL2.shape=(50, 1)Index = np.argsort(MSLL2, axis=0)Index = Index[:, 0]Sortf = f1[Index] # shape(50, 2)trace.append(calc_f(f1[0])) # 記錄最優(yōu)個體的激勵度值############輸出優(yōu)化結(jié)果 Bestf=Sortf[0,:] #最優(yōu)變量 print('最優(yōu)變量',Bestf) print('最優(yōu)值',trace[-1] ) #最優(yōu)值 print('懲罰項',calc_e(Bestf))plt.plot(trace) plt.title('迭代曲線') plt.show()

這題我以前用粒子群、遺傳、差分 求過(見以前博客)。算法來的值為1.5.免疫算法算出來的為1。 可以看出在實(shí)數(shù)編碼中,免疫算法比哪幾種算法強(qiáng)。

離散編碼免疫算法見:
離散免疫算法求解旅行商問題(源碼實(shí)現(xiàn))
二進(jìn)制編碼免疫算法見:
免疫算法(二進(jìn)制)算例(源碼實(shí)現(xiàn))

作者:電氣-余登武

總結(jié)

以上是生活随笔為你收集整理的万字长文了解免疫算法原理 及求解复杂约束问题(源码实现)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。