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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

构造非支配解集(Python)

發布時間:2023/12/20 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 构造非支配解集(Python) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • 案例數據
  • 莊家法構造非支配解集
  • 擂臺賽法構造
  • Deb非支配解集構造
  • 基于排除法構建

前言

吃飽了撐的,玩玩多目標,順便寫幾個算法。

本文基于《多目標進化優化》:鄭金華,鄒娟 著 P24 + 頁面的內容。

案例數據

這里我們直接使用P28所構造的數據

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 當中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

莊家法構造非支配解集

咱們先來個最簡單實現的算法。這個算法,就是暴力求解,把每一個東西拿出來,然后對比,先把當前的莊家拿出來,如果莊家被支配了直接停止,如果被莊家支配了,就把那個被支配的干掉,走完一編,然后再來,最后選出一組不會被任何人支配的解集。

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

擂臺賽法構造

這個擂臺賽法和莊家法其實是類似的,區別在于,剛剛莊家如果被支配了我們就停止了,這里的話是這樣的,如果莊家掛了,那么就把干掉莊家的家伙拿出來作為當前的莊家。這里需要被注意的是,如果當前產生了新的擂主,我們需要知道原來擂主沒有支配的玩意,因為新的擂主可能會支配先前沒有支配的玩意。

def BackDelete(no_zhipei:list,remove_index:list,Data:list,zhuangjia:tuple):# 負責把前面,上一個莊家可能支配不了的給看看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 Res

Deb非支配解集構造

這個其實也簡單,就是一個個比就ok了。

先假設A是ok的,然后讓B過來,如果A被支配了,就留下B,A去了,如果都沒有支配,那么A,B 留下,此時C進入,然后C比對。
那么最壞的情況下,第二個比1次,第N個比N-1次

def Deb(Data):Res = []Res.append(Data.pop(0))for _ in range(len(Data)):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)

基于排除法構建

這個方法我感覺是差不多的和DEB是類似的,因為一開始就是有一個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)

后面還有幾個,一個是基于遞歸的,一個是基于快排的,還有對快排優化的。明天可以玩玩~

總結

以上是生活随笔為你收集整理的构造非支配解集(Python)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。