基于遗传算法的多目标优化算法(附代码案例)
一、理論基礎(chǔ)
多目標(biāo)優(yōu)化問題可以描述如下:
????????其中,f(x) 為待優(yōu)化的目標(biāo)函數(shù);x 為 待優(yōu)化的變量;lb 和 ub 分別為變量 x 的下限和上限約束;Aeq * x = beq 為變量 x 的線性等式約束;A * x <= b 為變量 x 的線性不等式約束。
? ? ? ? 在上圖所示的優(yōu)化問題中,目標(biāo)函數(shù) f1 和 f2 是相互矛盾的。因?yàn)?A1 < B1 且 A2 > B2,也就是說,某一個(gè)目標(biāo)函數(shù)的提高需要以另一個(gè)目標(biāo)函數(shù)的降低作為代價(jià),稱這樣的解 A 和解 B 是非劣解,或者說是 Pareto 最優(yōu)解。多目標(biāo)優(yōu)化算法的目的就是要尋找這些 Pareto 最優(yōu)解。
? ? ? ??目前的多目標(biāo)優(yōu)化算法有很多,Kalyanmoy Deb 的帶精英策略的快速非支配排序遺傳算法(nondominated sorting genetic algorithm II,NSGA- II)無疑是其中應(yīng)用最為廣泛也是最為成功的一種。MATLAB R2009a 版本提供的函數(shù) gamultiobj 所采用的算法就是基于 NSGA - II 改進(jìn)的一種多目標(biāo)優(yōu)化算法(a variant of NSGA - II)。本案例將以函數(shù) gamultiobj 為基礎(chǔ),對基于遺傳算法的多目標(biāo)優(yōu)化算法進(jìn)行詳細(xì)分析,并介紹函數(shù)gamultiobj的使用。
? ? ? ? 1、支配(dominnate)與非劣(non - inferior)
????????在多目標(biāo)優(yōu)化問題中,如果個(gè)體 p 至少有一個(gè)目標(biāo)比個(gè)體 q 的好,而且個(gè)體 p 的所有目標(biāo)都不比個(gè)體 q 的差,那么稱個(gè)體 p 支配個(gè)體 q(p dominates q),或者稱個(gè)體 q 受個(gè)體 p 支配(qis dominated by p),也可以說,個(gè)體 p 非劣于個(gè)體 q(p is non - inferior to q)。
? ? ? ? 2、序值(rank)和前端(front)
????????如果 p 支配 q,那么 p 的序值比 q 的低。如果 p 和 q 互不支配,或者說,?p 和 q 相互非劣,那么 p 和 q 有相同的序值。序值為 1 的個(gè)體屬于第一前端,序值為 2 的個(gè)體屬于第二前端,依次類推。顯然,在當(dāng)前種群中,第一前端是完全不受支配的,第二前端受第一前端中個(gè)體的支配。這樣,通過排序,可以將種群中的個(gè)體分到不同的前端。
? ? ? ? 3、擁擠距離(crowding distance)
????????擁擠距離用來計(jì)算某前端中的某個(gè)體與該前端中其他個(gè)體之間的距離,用以表征個(gè)體間的擁擠程度。顯然,擁擠距離的值越大,個(gè)體間就越不擁擠,種群的多樣性就越好。需要指出的是,只有處于同一前端的個(gè)體間才需要計(jì)算擁擠距離,不同前端之間的個(gè)體計(jì)算擁擠距離是沒有意義的。
????????4、最優(yōu)前端個(gè)體系數(shù)(ParetoFraction)
????????最優(yōu)前端個(gè)體系數(shù)定義為最優(yōu)前端中的個(gè)體在種群中所占的比例,即最優(yōu)前端個(gè)體數(shù) = min { ParetoFraction * 種群大小,前端中現(xiàn)存的個(gè)體數(shù)目 },其取值范圍為 0~1。需要指出的是,ParetoFraction 的概念是函數(shù) gamultiobj 所特有的,在 NSGA - II 中是沒有的,這也是為什么稱函數(shù) gamultiobj 是一種多目標(biāo)優(yōu)化算法的原因。
二、案例簡述
1、問題描述
? ? ? ? 待優(yōu)化的多目標(biāo)問題表述如下:
?2、解題思路及步驟
? ? ? ? 這里將使用函數(shù) gamultiobj 求解以上多目標(biāo)優(yōu)化問題。同函數(shù) ga 的調(diào)用一樣,函數(shù) gamultiobj 的調(diào)用方式也有兩種:GUI 方式和命令行方式。
? ? ? ? 通過 GUI 方式調(diào)用?gamultiobj
????????通過以下兩種方式可以調(diào)出函數(shù) gamultiobj 的 GUI 界面:
? ? ? ? (1)在 MATLAB主界面上依次單擊 APPS→Optimization,在彈出的 Optimization Tool 對話框的 Solver 中選擇 “gamultiobj - Multiobjective optimization using Genetic Algorithm” 。
? ? ? ? (2)在 Command Window 中輸入:optimtool('gamultiobj') 命令
????????可以看到,函數(shù) gamultiobj 的 GUI 界面與函數(shù) ga 的 GUI 界面大致相同,僅在以下幾個(gè)方面存在區(qū)別:
? ? ? ? (1)前者比后者多了 Distance measure function 和 Pareto front population fraction 兩個(gè)參數(shù)。
? ? ? ? (2)前者比后者少了參數(shù) Elite count,這是因?yàn)楹瘮?shù) gamultiobj 的精英是自動(dòng)保留的;前者比后者少了 Scaling function,這是因?yàn)楹瘮?shù) gamultiobj 的選擇是基于序值和擁擠距離的,故不再需要 Scaling 的處理;函數(shù) gamultiobj 沒有非線性約束。
? ? ? ? (3)繪圖函數(shù)不同及下列設(shè)置的默認(rèn)值不同;種群大小(Population size)、選擇函數(shù)(Selection function)、交叉函數(shù)(Crossover function)最大進(jìn)化代數(shù)(Generations)停止代數(shù)(Stall generations)適應(yīng)度函數(shù)值偏差(Function tolerance)。
? ? ? ? 通過命令行方式調(diào)用函數(shù) gamultiobj
? ? ? ? gamultiobj 的命令行調(diào)用格式為:
[x, fval] = gamultiobj(fitnessfcn, nvars, A, b, Aeq, beq, lb, ub, options)? ? ? ? ?其中,x 為函數(shù) gamultiobj 得到的 Pareto 解集;fval 為 x 對應(yīng)的目標(biāo)函數(shù)值;fitnessfcn 為目標(biāo)函數(shù)句柄,同函數(shù) ga 一樣,需要編寫一個(gè)描述目標(biāo)函數(shù)的 M 文件;nvars 為變量數(shù)目;A、b、Aeq、beq 為線性約束,可以表示為 A * x?<= B,Aeq * x = beq;lb,ub為上、下限約束,可以表述為 lb <= x <= ub,當(dāng)沒有約束時(shí),用 “ [ ] ” 表示即可;options 中需要對多目標(biāo)優(yōu)化算法進(jìn)行一些設(shè)置,即
options = gaoptimset('Param1', value1, 'Param2', value2, ... );????????其中,Param1,Param2 等是需要設(shè)定的參數(shù),如最優(yōu)前端個(gè)體系數(shù)、擁擠距離計(jì)算函數(shù)、約束條件、終止條件等;valuel,value2 等是 Param 的具體值。Param 有專門的表述方式,如最優(yōu)前端個(gè)體系數(shù)對應(yīng)于 ParetoFraction,擁擠距離計(jì)算函數(shù)對應(yīng)于 DistanceMeasureFcn 等。
三、MATLAB 程序?qū)崿F(xiàn)
1、使用函數(shù) gamultiobj 求解多目標(biāo)優(yōu)化問題
? ? ? ? (1)使用函數(shù) gamultiobj 求解多目標(biāo)優(yōu)化問題的第一步是編寫目標(biāo)函數(shù)的M文件。對于以上問題,函數(shù)名為my_first_multi,目標(biāo)函數(shù)代碼如下:
function f = my_first_multi(x)f(1) = x(1)^4 - 10*x(1)^2+x(1)*x(2) + x(2)^4 - (x(1)^2)*(x(2)^2); f(2) = x(2)^4 - (x(1)^2)*(x(2)^2) + x(1)^4 + x(1)*x(2);? ? ? ? (2)使用命令行方式調(diào)用 gamultiobj 函數(shù),代碼如下:
clear clcfitnessfcn = @my_first_multi; % Function handle to the fitness function nvars = 2; % Number of decision variables lb = [-5,-5]; % Lower bound ub = [5,5]; % Upper bound A = []; b = []; % No linear inequality constraints Aeq = []; beq = []; % No linear equality constraints options = gaoptimset('ParetoFraction',0.3,'PopulationSize',100,'Generations',200,'StallGenLimit',200,'TolFun',1e-100,'PlotFcns',@gaplotpareto);[x,fval] = gamultiobj(fitnessfcn,nvars, A,b,Aeq,beq,lb,ub,options);????????其中,fitnessfcn 即(1)中定義的目標(biāo)函數(shù) M 文件,設(shè)置的最優(yōu)前端個(gè)體系數(shù) ParetoFrac -tion 為 0.3,種群大小 PopulationSize 為 100,最大進(jìn)化代數(shù) Generations 為 200,停止代數(shù)StallGenLimit 也為 200,適應(yīng)度函數(shù)值偏差 TolFun 為 le -?100,繪制 Pareto 前端。當(dāng)然,也可以通過 GUI 方式調(diào)用函數(shù) gamultiobj,其方法與函數(shù) ga 的調(diào)用相同。
2、結(jié)果分析
????????可以看到,在基于遺傳算法的多目標(biāo)優(yōu)化算法的運(yùn)行過程中,自動(dòng)繪制了第一前端中個(gè)體的分布情況,且分布隨著算法進(jìn)化一代而更新一次。當(dāng)?shù)V购?#xff0c;得到如下圖所示的第一前端個(gè)體分布圖。
?????????同時(shí),?Worksapce 中返回了函數(shù) gamultiobj 得到的 Pareto 解集 x?及與 x 對應(yīng)的目標(biāo)函數(shù)值。需要說明的是,由于算法的初始種群是隨機(jī)產(chǎn)生的,因此每次運(yùn)行的結(jié)果不一樣。
? ? ? ? 從上圖可以看到,第一前端的 Pareto 最優(yōu)解分布均勻。返回的 Pareto 最優(yōu)解個(gè)數(shù)為 30 個(gè),而種群大小為 100,可見,ParetoFraction 為 0.3 的設(shè)置發(fā)揮了作用。另外,個(gè)體被限制在了 [ -5,5 ] 的上下限范圍內(nèi)。
總結(jié)
以上是生活随笔為你收集整理的基于遗传算法的多目标优化算法(附代码案例)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库查重复记录
- 下一篇: 打开计算机不显示百度云管家,百度云管家怎