<li id="jut4n"></li>
  • 系統城裝機大師 - 固鎮縣祥瑞電腦科技銷售部宣傳站!

    當前位置:首頁 > 腳本中心 > python > 詳細頁面

    Python遺傳算法Geatpy工具箱使用介紹

    時間:2022-09-12來源:www.ship-models.net作者:電腦系統城

    目錄
    • 一、 什么是遺傳算法?
    • 二、 遺傳算法庫Geatpy
      • 2.1 遺傳算法工具箱Geatpy參數介紹
    • 三、最佳實踐
      • 3.1 代碼示例 | 參數模板
      • 3.2 最佳實踐

    一、 什么是遺傳算法?

    遺傳算法是仿真生物遺傳學和自然選擇機理,通過人工方式所構造的一類搜索算法,從某種程度上說遺傳算法是對生物進化過程進行的數學方式仿真。生物種群的生存過程普遍遵循達爾文進化準則,群體中的個體根據對環境的適應能力而被大自然所選擇或淘汰。進化過程的結果反映在個體的結構上,其染色體包含若干基因,相應的表現型和基因型的聯系體現了個體的外部特性與內部機理間邏輯關系。通過個體之間的交叉、變異來適應大自然環境。生物染色體用數學方式或計算機方式來體現就是一串數碼,仍叫染色體,有時也叫個體;適應能力是對應著一個染色體的一個數值來衡量;染色體的選擇或淘汰則按所面對的問題是求最大還是最小來進行。

    二、 遺傳算法庫Geatpy

    2.1 遺傳算法工具箱Geatpy參數介紹

    API官方參考文檔

    population參數【重要屬性:Chrom,Phen,Objv,CV,FitnV】

    • sizes : int - 種群規模,即種群的個體數目。
    • ChromNum : int - 染色體的數目,即每個個體有多少條染色體。
    • Encoding : str - 染色體編碼方式, 'BG':二進制/格雷編碼; 'RI':實整數編碼,即實數和整數的混合編碼; 'P':排列編碼
    • Field : array - 譯碼矩陣
    • Chrom : array - 種群染色體矩陣,每一行對應一個個體的一條染色體。
    • Lind : int - 種群染色體長度。
    • ObjV : array - 種群目標函數值矩陣,每一行對應一個個體的目標函數值,每一列對應一個目標
    • FitnV : array - 種群個體適應度列向量,每個元素對應一個個體的適應度,最小適應度為0
    • CV : array - CV(Constraint Violation Value)是用來定量描述違反約束條件程度的矩陣,每行對應一個個體,每列對應一個約束
    • Phen : array - 種群表現型矩陣(即種群各染色體解碼后所代表的決策變量所組成的矩陣)。
    • 如果通過CV矩陣基于可行性法則進行約束的設置,那么 不等式約束需要 ≤,等式約束 需要傳入abs( ) (因為遵循值越大,適應度越小的原則)

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

    Geatpy 結果參數介紹

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

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

    optPop: 存儲著算法求解結果的種群對象。如果無可行解,則optPop.sizes=0。optPop.Phen為決策變量矩陣,optPop.ObjV為目標函數值矩陣。

    lastPop: 算法進化結束后的最后一代種群對象。

    Vars: 等于optPop.Phen,此處即最優解。若無可行解,則Vars=None。

    ObjV: 等于optPop.ObjV,此處即最優解對應的目標函數值。若無可行解,ObjV=None。

    CV: 等于optPop.CV,此處即最優解對應的違反約束程度矩陣。若無可行解,CV=None。

    startTime: 程序執行開始時間。

     

    endTime: 程序執行結束時間。

    executeTime: 算法 所用時間。

    nfev: 算法評價次數

    gd: (多目標優化且給定了理論最優解時才有) GD指標值。

    igd: (多目標優化且給定了理論最優解時才有) IGD指標值。

    hv: (多目標優化才有) HV指標值。

    spacing: (多目標優化才有) Spacing指標值。

    三、最佳實踐

    3.1 代碼示例 | 參數模板

    解集:

    1
    2
    3
    4
    5
    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))

    gen: 進化代數      
    eval:記錄評價次數        
    f\_opt: 當代最優個體的目標函數值           
    f\_max=當代種群最大函數值          
    f\_min 最小   f\_avg : 平均水平          
    f\_std: 標準約束水平

    3.2 最佳實踐

    使用geatpy庫求解有向無環圖最短路

    代碼【最短路】一:使用geatpy庫

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    import numpy as np
    import geatpy as ea
    class MyProblem(ea.Problem):  # 繼承Problem父類
        def __init__(self):
            name = 'Shortest_Path'  # 初始化name(函數名稱,可以隨意設置)
            M = 1  # 初始化M(目標維數)
            maxormins = [1# 初始化maxormins(目標最小最大化標記列表,1:最小化該目標;-1:最大化該目標)
            Dim = 10  # 初始化Dim(決策變量維數)
            varTypes = [1] * Dim  # 初始化varTypes(決策變量的類型,元素為0表示對應的變量是連續的;1表示是離散的)
            lb = [0] * Dim  # 決策變量下界
            ub = [9] * Dim  # 決策變量上界
            lbin = [1] * Dim  # 決策變量下邊界 1表示閉合區間,0表示開區間
            ubin = [1] * Dim  # 決策變量上邊界
            # 調用父類構造方法完成實例化
            ea.Problem.__init__(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin)
            # 設置每一個結點下一步可達的結點(結點從1開始數,因此列表nodes的第0號元素設為空列表表示無意義)
            self.nodes = [[], [2, 3], [3, 4, 5], [5, 6], [7, 8], [4, 6], [7, 9], [8, 9], [9, 10], [10]]
            # 設置有向圖中各條邊的權重
            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):  # 將優先級編碼的染色體解碼得到一條從節點1到節點10的可行路徑
            edges = []  # 存儲邊
            path = [1# 結點1是路徑起點
            while not path[-1] == 10# 開始從起點走到終點
                currentNode = path[-1# 得到當前所在的結點編號
                nextNodes = self.nodes[currentNode]  # 獲取下一步可達的結點組成的列表
                chooseNode = nextNodes[np.argmax(
                    priority[np.array(nextNodes) - 1])]  # 從NextNodes中選擇優先級更高的結點作為下一步要訪問的結點,因為結點從1數起,而下標從0數起,因此要減去1
                path.append(chooseNode)
                edges.append((currentNode, chooseNode))
            return path, edges
        def aimFunc(self, pop):  # 目標函數
            pop.ObjV = np.zeros((pop.sizes, 1))  # 初始化ObjV
            for i in range(pop.sizes):  # 遍歷種群的每個個體,分別計算各個個體的目標函數值
                priority = pop.Phen[i, :]
                path, edges = self.decode(priority)  # 將優先級編碼的染色體解碼得到訪問路徑及經過的邊
                pathLen = 0
                for edge in edges:
                    key = str(edge)  # 根據路徑得到鍵值,以便根據鍵值找到路徑對應的長度
                    if not key in self.weights:
                        raise RuntimeError("Error in aimFunc: The path is invalid. (當前路徑是無效的。)", path)
                    pathLen += self.weights[key]  # 將該段路徑長度加入
                pop.ObjV[i] = pathLen  # 計算目標函數值,賦值給pop種群對象的ObjV屬性
    ## 執行腳本
    if __name__ == "__main__":
        # 實例化問題對象
        problem = MyProblem()
        # 構建算法
        algorithm = ea.soea_EGA_templet(problem,
                                        ea.Population(Encoding='RI', NIND=4),
                                        MAXGEN=10# 最大進化代數
                                        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()

    以上就是Python遺傳算法Geatpy工具箱使用介紹的詳細內容

    分享到:

    相關信息

    系統教程欄目

    欄目熱門教程

    人氣教程排行

    站長推薦

    熱門系統下載

    淑芬两腿间又痒了