溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python遺傳算法Geatpy工具箱怎么用

發(fā)布時(shí)間:2022-09-09 14:06:18 來(lái)源:億速云 閱讀:140 作者:iii 欄目:編程語(yǔ)言

這篇文章主要介紹了Python遺傳算法Geatpy工具箱怎么用的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇Python遺傳算法Geatpy工具箱怎么用文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

一、 什么是遺傳算法?

遺傳算法是仿真生物遺傳學(xué)和自然選擇機(jī)理,通過(guò)人工方式所構(gòu)造的一類(lèi)搜索算法,從某種程度上說(shuō)遺傳算法是對(duì)生物進(jìn)化過(guò)程進(jìn)行的數(shù)學(xué)方式仿真。生物種群的生存過(guò)程普遍遵循達(dá)爾文進(jìn)化準(zhǔn)則,群體中的個(gè)體根據(jù)對(duì)環(huán)境的適應(yīng)能力而被大自然所選擇或淘汰。進(jìn)化過(guò)程的結(jié)果反映在個(gè)體的結(jié)構(gòu)上,其染色體包含若干基因,相應(yīng)的表現(xiàn)型和基因型的聯(lián)系體現(xiàn)了個(gè)體的外部特性與內(nèi)部機(jī)理間邏輯關(guān)系。通過(guò)個(gè)體之間的交叉、變異來(lái)適應(yīng)大自然環(huán)境。生物染色體用數(shù)學(xué)方式或計(jì)算機(jī)方式來(lái)體現(xiàn)就是一串?dāng)?shù)碼,仍叫染色體,有時(shí)也叫個(gè)體;適應(yīng)能力是對(duì)應(yīng)著一個(gè)染色體的一個(gè)數(shù)值來(lái)衡量;染色體的選擇或淘汰則按所面對(duì)的問(wèn)題是求最大還是最小來(lái)進(jìn)行。

Python遺傳算法Geatpy工具箱怎么用

Python遺傳算法Geatpy工具箱怎么用

二、 遺傳算法庫(kù)Geatpy

2.1 遺傳算法工具箱Geatpy參數(shù)介紹

API官方參考文檔

population參數(shù)【重要屬性:Chrom,Phen,Objv,CV,F(xiàn)itnV】

  • sizes : int - 種群規(guī)模,即種群的個(gè)體數(shù)目。

  • ChromNum : int - 染色體的數(shù)目,即每個(gè)個(gè)體有多少條染色體。

  • Encoding : str - 染色體編碼方式, 'BG':二進(jìn)制/格雷編碼; 'RI':實(shí)整數(shù)編碼,即實(shí)數(shù)和整數(shù)的混合編碼; 'P':排列編碼

  • Field : array - 譯碼矩陣

  • Chrom : array - 種群染色體矩陣,每一行對(duì)應(yīng)一個(gè)個(gè)體的一條染色體。

  • Lind : int - 種群染色體長(zhǎng)度。

  • ObjV : array - 種群目標(biāo)函數(shù)值矩陣,每一行對(duì)應(yīng)一個(gè)個(gè)體的目標(biāo)函數(shù)值,每一列對(duì)應(yīng)一個(gè)目標(biāo)

  • FitnV : array - 種群個(gè)體適應(yīng)度列向量,每個(gè)元素對(duì)應(yīng)一個(gè)個(gè)體的適應(yīng)度,最小適應(yīng)度為0

  • CV : array - CV(Constraint Violation Value)是用來(lái)定量描述違反約束條件程度的矩陣,每行對(duì)應(yīng)一個(gè)個(gè)體,每列對(duì)應(yīng)一個(gè)約束

  • Phen : array - 種群表現(xiàn)型矩陣(即種群各染色體解碼后所代表的決策變量所組成的矩陣)。

  • 如果通過(guò)CV矩陣基于可行性法則進(jìn)行約束的設(shè)置,那么 不等式約束需要 ≤,等式約束 需要傳入abs( ) (因?yàn)樽裱翟酱?,適應(yīng)度越小的原則)

Python遺傳算法Geatpy工具箱怎么用

Python遺傳算法Geatpy工具箱怎么用

  • ea.Problem.init()中的lbin與ubin(決策變量范圍邊界矩陣)表示范圍區(qū)間的開(kāi)閉,1閉合0開(kāi)區(qū)間

Geatpy 結(jié)果參數(shù)介紹

success: True or False, 表示算法是否成功求解。

stopMsg: 存儲(chǔ)著算法停止原因的字符串。

optPop: 存儲(chǔ)著算法求解結(jié)果的種群對(duì)象。如果無(wú)可行解,則optPop.sizes=0。optPop.Phen為決策變量矩陣,optPop.ObjV為目標(biāo)函數(shù)值矩陣。

lastPop: 算法進(jìn)化結(jié)束后的最后一代種群對(duì)象。

Vars: 等于optPop.Phen,此處即最優(yōu)解。若無(wú)可行解,則Vars=None。

ObjV: 等于optPop.ObjV,此處即最優(yōu)解對(duì)應(yīng)的目標(biāo)函數(shù)值。若無(wú)可行解,ObjV=None。

CV: 等于optPop.CV,此處即最優(yōu)解對(duì)應(yīng)的違反約束程度矩陣。若無(wú)可行解,CV=None。

startTime: 程序執(zhí)行開(kāi)始時(shí)間。

endTime: 程序執(zhí)行結(jié)束時(shí)間。

executeTime: 算法 所用時(shí)間。

nfev: 算法評(píng)價(jià)次數(shù)

gd: (多目標(biāo)優(yōu)化且給定了理論最優(yōu)解時(shí)才有) GD指標(biāo)值。

igd: (多目標(biāo)優(yōu)化且給定了理論最優(yōu)解時(shí)才有) IGD指標(biāo)值。

hv: (多目標(biāo)優(yōu)化才有) HV指標(biāo)值。

spacing: (多目標(biāo)優(yōu)化才有) Spacing指標(biāo)值。

三、最佳實(shí)踐

3.1 代碼示例 | 參數(shù)模板

Python遺傳算法Geatpy工具箱怎么用

解集:

header_regex = '|'.join(['{}'] * len(headers))
header_str = header_regex.format(*[str(key).center(width) for key, width in zip(headers, widths)])
print("=" * len(header_str))
            print(header_str)
            print("-" * len(header_str))

Python遺傳算法Geatpy工具箱怎么用

gen: 進(jìn)化代數(shù)      
eval:記錄評(píng)價(jià)次數(shù)        
f\_opt: 當(dāng)代最優(yōu)個(gè)體的目標(biāo)函數(shù)值          
f\_max=當(dāng)代種群最大函數(shù)值          
f\_min 最小   f\_avg : 平均水平          
f\_std: 標(biāo)準(zhǔn)約束水平

Python遺傳算法Geatpy工具箱怎么用

Python遺傳算法Geatpy工具箱怎么用

3.2 最佳實(shí)踐

使用geatpy庫(kù)求解有向無(wú)環(huán)圖最短路

代碼【最短路】一:使用geatpy庫(kù)

import numpy as np
import geatpy as ea
class MyProblem(ea.Problem):  # 繼承Problem父類(lèi)
    def __init__(self):
        name = 'Shortest_Path'  # 初始化name(函數(shù)名稱(chēng),可以隨意設(shè)置)
        M = 1  # 初始化M(目標(biāo)維數(shù))
        maxormins = [1]  # 初始化maxormins(目標(biāo)最小最大化標(biāo)記列表,1:最小化該目標(biāo);-1:最大化該目標(biāo))
        Dim = 10  # 初始化Dim(決策變量維數(shù))
        varTypes = [1] * Dim  # 初始化varTypes(決策變量的類(lèi)型,元素為0表示對(duì)應(yīng)的變量是連續(xù)的;1表示是離散的)
        lb = [0] * Dim  # 決策變量下界
        ub = [9] * Dim  # 決策變量上界
        lbin = [1] * Dim  # 決策變量下邊界 1表示閉合區(qū)間,0表示開(kāi)區(qū)間
        ubin = [1] * Dim  # 決策變量上邊界
        # 調(diào)用父類(lèi)構(gòu)造方法完成實(shí)例化
        ea.Problem.__init__(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin)
        # 設(shè)置每一個(gè)結(jié)點(diǎn)下一步可達(dá)的結(jié)點(diǎn)(結(jié)點(diǎn)從1開(kāi)始數(shù),因此列表nodes的第0號(hào)元素設(shè)為空列表表示無(wú)意義)
        self.nodes = [[], [2, 3], [3, 4, 5], [5, 6], [7, 8], [4, 6], [7, 9], [8, 9], [9, 10], [10]]
        # 設(shè)置有向圖中各條邊的權(quán)重
        self.weights = {'(1, 2)': 36, '(1, 3)': 27, '(2, 4)': 18, '(2, 5)': 20, '(2, 3)': 13, '(3, 5)': 12,
                        '(3, 6)': 23,
                        '(4, 7)': 11, '(4, 8)': 32, '(5, 4)': 16, '(5, 6)': 30, '(6, 7)': 12, '(6, 9)': 38,
                        '(7, 8)': 20,
                        '(7, 9)': 32, '(8, 9)': 15, '(8, 10)': 24, '(9, 10)': 13}
    def decode(self, priority):  # 將優(yōu)先級(jí)編碼的染色體解碼得到一條從節(jié)點(diǎn)1到節(jié)點(diǎn)10的可行路徑
        edges = []  # 存儲(chǔ)邊
        path = [1]  # 結(jié)點(diǎn)1是路徑起點(diǎn)
        while not path[-1] == 10:  # 開(kāi)始從起點(diǎn)走到終點(diǎn)
            currentNode = path[-1]  # 得到當(dāng)前所在的結(jié)點(diǎn)編號(hào)
            nextNodes = self.nodes[currentNode]  # 獲取下一步可達(dá)的結(jié)點(diǎn)組成的列表
            chooseNode = nextNodes[np.argmax(
                priority[np.array(nextNodes) - 1])]  # 從NextNodes中選擇優(yōu)先級(jí)更高的結(jié)點(diǎn)作為下一步要訪問(wèn)的結(jié)點(diǎn),因?yàn)榻Y(jié)點(diǎn)從1數(shù)起,而下標(biāo)從0數(shù)起,因此要減去1
            path.append(chooseNode)
            edges.append((currentNode, chooseNode))
        return path, edges
    def aimFunc(self, pop):  # 目標(biāo)函數(shù)
        pop.ObjV = np.zeros((pop.sizes, 1))  # 初始化ObjV
        for i in range(pop.sizes):  # 遍歷種群的每個(gè)個(gè)體,分別計(jì)算各個(gè)個(gè)體的目標(biāo)函數(shù)值
            priority = pop.Phen[i, :]
            path, edges = self.decode(priority)  # 將優(yōu)先級(jí)編碼的染色體解碼得到訪問(wèn)路徑及經(jīng)過(guò)的邊
            pathLen = 0
            for edge in edges:
                key = str(edge)  # 根據(jù)路徑得到鍵值,以便根據(jù)鍵值找到路徑對(duì)應(yīng)的長(zhǎng)度
                if not key in self.weights:
                    raise RuntimeError("Error in aimFunc: The path is invalid. (當(dāng)前路徑是無(wú)效的。)", path)
                pathLen += self.weights[key]  # 將該段路徑長(zhǎng)度加入
            pop.ObjV[i] = pathLen  # 計(jì)算目標(biāo)函數(shù)值,賦值給pop種群對(duì)象的ObjV屬性
## 執(zhí)行腳本
if __name__ == "__main__":
    # 實(shí)例化問(wèn)題對(duì)象
    problem = MyProblem()
    # 構(gòu)建算法
    algorithm = ea.soea_EGA_templet(problem,
                                    ea.Population(Encoding='RI', NIND=4),
                                    MAXGEN=10,  # 最大進(jìn)化代數(shù)
                                    logTras=1)  # 表示每隔多少代記錄一次日志信息
    # 求解
    res = ea.optimize(algorithm, verbose=True, drawing=1, outputMsg=False, drawLog=False, saveFlag=True,
                      dirName='result')
    print('最短路程為:%s' % (res['ObjV'][0][0]))
    print('最佳路線為:')
    best_journey, edges = problem.decode(res['Vars'][0])
    for i in range(len(best_journey)):
        print(int(best_journey[i]), end=' ')
    print()

關(guān)于“Python遺傳算法Geatpy工具箱怎么用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“Python遺傳算法Geatpy工具箱怎么用”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI