构造非支配解集(Python)
文章目錄
- 前言
- 案例數(shù)據(jù)
- 莊家法構(gòu)造非支配解集
- 擂臺賽法構(gòu)造
- Deb非支配解集構(gòu)造
- 基于排除法構(gòu)建
前言
吃飽了撐的,玩玩多目標(biāo),順便寫幾個算法。
本文基于《多目標(biāo)進(jìn)化優(yōu)化》:鄭金華,鄒娟 著 P24 + 頁面的內(nèi)容。
案例數(shù)據(jù)
這里我們直接使用P28所構(gòu)造的數(shù)據(jù)
Data = [(9,1),(7,2),(5,4),(4,5),(3,6),(2,7),(1,9),(10,1),(8,5),(7,6),(5,7),(4,8),(3,9),(10,5),(9,6),(8,7),(7,9),(10,6),(9,7),(8,9)]順序就是C1-C20
答案是C1-C7
這里咱們在定義一個算法,判斷A,B 當(dāng)中A會不會被B支配。
def Compare(A:tuple,B:tuple):# 判斷A是否被B支配,只要判斷A是不是都大于B就ok了Flag = Falsecount = 0for i in range(len(A)):if(A[i]>=B[i]):count+=1if(count==len(A)):Flag = not Flagreturn Flag莊家法構(gòu)造非支配解集
咱們先來個最簡單實(shí)現(xiàn)的算法。這個算法,就是暴力求解,把每一個東西拿出來,然后對比,先把當(dāng)前的莊家拿出來,如果莊家被支配了直接停止,如果被莊家支配了,就把那個被支配的干掉,走完一編,然后再來,最后選出一組不會被任何人支配的解集。
def ReMove(indexList,Data):counter = 0for index in indexList:index = index - counterData.pop(index)counter += 1def ZJF(Data:list):Res = []for _ in range(len(Data)):if(Data):zhuangjia = Data.pop(0)Flag = Trueremove_index = []for i in range(len(Data)):qita = Data[i]if(Compare(qita,zhuangjia)):remove_index.append(i)elif(Compare(zhuangjia,qita)):Flag = FalsebreakReMove(remove_index,Data)if(Flag):print(zhuangjia,"---->C",_+1)Res.append(zhuangjia)return Res擂臺賽法構(gòu)造
這個擂臺賽法和莊家法其實(shí)是類似的,區(qū)別在于,剛剛莊家如果被支配了我們就停止了,這里的話是這樣的,如果莊家掛了,那么就把干掉莊家的家伙拿出來作為當(dāng)前的莊家。這里需要被注意的是,如果當(dāng)前產(chǎn)生了新的擂主,我們需要知道原來擂主沒有支配的玩意,因?yàn)樾碌睦拗骺赡軙湎惹皼]有支配的玩意。
def BackDelete(no_zhipei:list,remove_index:list,Data:list,zhuangjia:tuple):# 負(fù)責(zé)把前面,上一個莊家可能支配不了的給看看if(no_zhipei):for no_index in no_zhipei:if(Compare(Data[no_index],zhuangjia)):remove_index.append(no_index)def AP(Data:list):Res = []for _ in range(len(Data)):if(Data):zhuangjia = Data.pop(0)Flag = Trueremove_index = []no_zhipei = []for i in range(len(Data)):qita = Data[i]if(Compare(qita,zhuangjia)):remove_index.append(i)elif(Compare(zhuangjia,qita)):zhuangjia = qitaBackDelete(no_zhipei,remove_index,Data,zhuangjia)else:# 沒有被支配的no_zhipei.append(i)ReMove(remove_index,Data)if(Flag):print(zhuangjia,"---->C",_+1)Res.append(zhuangjia)return ResDeb非支配解集構(gòu)造
這個其實(shí)也簡單,就是一個個比就ok了。
先假設(shè)A是ok的,然后讓B過來,如果A被支配了,就留下B,A去了,如果都沒有支配,那么A,B 留下,此時C進(jìn)入,然后C比對。
那么最壞的情況下,第二個比1次,第N個比N-1次
基于排除法構(gòu)建
這個方法我感覺是差不多的和DEB是類似的,因?yàn)橐婚_始就是有一個NDSET非支配解集,也就是咱們的Res,如果這個Res是null,那么先把解集的某一個解x放到里面,然后此時NDSET有了一個非支配解(臨時的)然后拿到第二個x,然后再來,這個x和NDSET的解(y) 比對
def PAICHU(Data:list):Res = []for _ in range(len(Data)):if(len(Res)==0):Res.append(Data.pop(0))else:need_ = Data.pop(0)Flag = Truefor i in range(len(Res)):if (i < len(Res)):if (Compare(need_, Res[i])):Flag = Falsebreakelif (Compare(Res[i], need_)):Res.pop(i)if (Flag):Res.append(need_)print(Res)后面還有幾個,一個是基于遞歸的,一個是基于快排的,還有對快排優(yōu)化的。明天可以玩玩~
總結(jié)
以上是生活随笔為你收集整理的构造非支配解集(Python)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ios avi_转换DVD,ISO和AV
- 下一篇: win7计算机磁盘清理,Win7系统磁盘