最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python遺傳算法之單/多目標規(guī)劃問題

 更新時間:2022年04月17日 09:21:20   作者:柳小蔥  
本文主要介紹了python遺傳算法之單/多目標規(guī)劃問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

在上一篇博客中,我們學習了python遺傳算法包geatpy。并用它展示了一個不帶約束的單目標規(guī)劃問題,對往期內容感興趣的同學可以參考??:

鏈接: python遺傳算法之geatpy學習.

在上一期的介紹中,我們用遺傳算法求解時,采用的是類似matlab式的非面向對象編程,導致每一步寫的都很繁瑣,今天我們采用面向對象編程的方式來簡化求解過程。

1. 運行環(huán)境

這里先介紹一下運行環(huán)境

  • 系統(tǒng):Windows10
  • 配置:i7-6700 16G
  • python版本:3.10
  • geatpy版本:2.7.0

2. 面向對象的原理

前面的章節(jié)中,我們介紹了遺傳算法主要分為算法模板類 (Algorithm)、種群類 (Population)、多染色體混合編碼種群類 (PsyPopulation) 以及問題類 (Problem)。其中 Population 類和 PsyPopulation 類是可以直接被實例化成對象去來使用的類;Algorithm 類和 Problem 類是父類,需要實例化其子類來使用。下面我們通過案例來演示一下用法。

3. 帶約束的單目標優(yōu)化問題

在這里插入圖片描述

3.1 繼承 Problem 問題類完成對問題模型的描述

在這一步中,主要是將我們的問題按照模板描述清楚,包括目標函數(shù)和約束條件。

import numpy as np
import geatpy as ea
class MyProblem(ea.Problem): # 繼承Problem父類
    def __init__(self):
        name = 'MyProblem'  # 初始化name(函數(shù)名稱,可以隨意設置)

        M = 1  # 初始化M(目標維數(shù))
        maxormins = [-1]  # 初始化目標最小最大化標記列表,1:min;-1:max
        Dim = 3  # 初始化Dim(決策變量維數(shù))
        varTypes = [0] * Dim  # 初始化決策變量類型,0:連續(xù);1:離散
        lb = [0, 0, 0]  # 決策變量下界
        ub = [1, 1, 2]  # 決策變量上界
        lbin = [1, 1, 0]  # 決策變量下邊界
        ubin = [1, 1, 0]  # 決策變量上邊界
        # 調用父類構造方法完成實例化
        ea.Problem.__init__(self, name, M, maxormins, Dim, varTypes, lb,
                        ub, lbin, ubin)

    def aimFunc(self, pop):  # 目標函數(shù),pop為傳入的種群對象
        Vars = pop.Phen  # 得到決策變量矩陣

        x1 = Vars[:, [0]]  # 取出第一列得到所有個體的x1組成的列向量
        x2 = Vars[:, [1]]  # 取出第二列得到所有個體的x2組成的列向量
        x3 = Vars[:, [2]]  # 取出第三列得到所有個體的x3組成的列向量 # 計算目標函數(shù)值,賦值給pop種群對象的ObjV屬性
        pop.ObjV = 4 * x1 + 2 * x2 + x3
        # 采用可行性法則處理約束,生成種群個體違反約束程度矩陣
        pop.CV = np.hstack([2 * x1 + x2 - 1,  # 第一個約束
                        x1 + 2 * x3 - 2,  # 第二個約束
                        np.abs(x1 + x2 + x3 - 1)])  # 第三個約束

3.2 調用算法模板進行求解

在第二步中,我們主要編寫的是算法模板對第一步中問題的定義進行求解,這里需要依次設置種群、算法參數(shù)、種群進化、結果的輸出。

"""main_solve.py"""
import geatpy as ea # import geatpy
from myaim import MyProblem # 導入自定義問題接口
"""============================實例化問題對象========================"""
problem = MyProblem() # 實例化問題對象
"""==============================種群設置==========================="""
Encoding = 'RI' # 編碼方式
NIND = 50 # 種群規(guī)模
Field = ea.crtfld(Encoding, problem.varTypes, problem.ranges,problem.borders) # 創(chuàng)建區(qū)域描述器
population = ea.Population(Encoding, Field, NIND) # 實例化種群對象(此時種群還沒被真正初始化,僅僅是生成一個種群對象)
"""===========================算法參數(shù)設置=========================="""
myAlgorithm = ea.soea_DE_best_1_L_templet(problem, population) # 實例化一個算法模板對象
myAlgorithm.MAXGEN = 1000 # 最大進化代數(shù)
myAlgorithm.mutOper.F = 0.5 # 差分進化中的參數(shù)F
myAlgorithm.recOper.XOVR = 0.7 # 設置交叉概率
myAlgorithm.logTras = 1 # 設置每隔多少代記錄日志,若設置成0則表示不記錄日志
myAlgorithm.verbose = True # 設置是否打印輸出日志信息
myAlgorithm.drawing = 1 # 設置繪圖方式(0:不繪圖;1:繪制結果圖;2:繪制目標空間過程動畫;3:繪制決策空間過程動畫)
"""==========================調用算法模板進行種群進化==============="""
[BestIndi, population] = myAlgorithm.run() # 執(zhí)行算法模板,得到最優(yōu)個體以及最后一代種群
BestIndi.save() # 把最優(yōu)個體的信息保存到文件中
"""=================================輸出結果======================="""
print('評價次數(shù):%s' % myAlgorithm.evalsNum)
print('時間花費 %s 秒' % myAlgorithm.passTime)
if BestIndi.sizes != 0:
    print('最優(yōu)的目標函數(shù)值為:%s' % BestIndi.ObjV[0][0])
    print('最優(yōu)的控制變量值為:')
    for i in range(BestIndi.Phen.shape[1]):
        print(BestIndi.Phen[0, i])
else:
    print('此次未找到可行解。')

3.3 結果

種群進化的結果為:

在這里插入圖片描述

最終的結果為:

在這里插入圖片描述

4. 帶約束的多目標優(yōu)化問題

在這里插入圖片描述

4.1 繼承 Problem 問題類完成對問題模型的描述

對于多目標的問題,依舊是先編寫目標規(guī)劃問題。

import numpy as np
import geatpy as ea
class MyProblem(ea.Problem): # 繼承Problem父類
    def __init__(self):
        name = 'BNH' # 初始化name(函數(shù)名稱,可以隨意設置)
        M = 2 # 初始化M(目標維數(shù))
        maxormins = [1] * M # 初始化maxormins
        Dim = 2 # 初始化Dim(決策變量維數(shù))
        varTypes = [0] * Dim # 初始化varTypes(決策變量的類型,0:實數(shù);1:整數(shù))
        lb = [0] * Dim # 決策變量下界
        ub = [5, 3] # 決策變量上界
        lbin = [1] * Dim # 決策變量下邊界
        ubin = [1] * Dim # 決策變量上邊界 # 調用父類構造方法完成實例化
        ea.Problem.__init__(self, name, M, maxormins, Dim, varTypes, lb,ub, lbin, ubin)
    def aimFunc(self, pop): # 目標函數(shù)
        Vars = pop.Phen # 得到決策變量矩陣
        x1 = Vars[:, [0]] # 注意這樣得到的x1是一個列向量,表示所有個體的x1
        x2 = Vars[:, [1]]
        f1 = 4*x1**2 + 4*x2**2
        f2 = (x1 - 5)**2 + (x2 - 5)**2
        # 采用可行性法則處理約束
        pop.CV = np.hstack([(x1 - 5)**2 + x2**2 - 25,-(x1 - 8)**2 - (x2 - 3)**2 + 7.7])
        # 把求得的目標函數(shù)值賦值給種群pop的ObjV
        pop.ObjV = np.hstack([f1, f2])
        
     ## 目標函數(shù)主要需要計算出CV和ObjV

4.2 調用算法模板進行求解

模板求解,和單目標規(guī)劃類似。

import geatpy as ea # import geatpy
from ga_more_aim import MyProblem # 導入自定義問題接口
import numpy as np
"""=======================實例化問題對象==========================="""
problem = MyProblem() # 實例化問題對象
"""=========================種群設置=============================="""
Encoding = 'RI' # 編碼方式
NIND = 100 # 種群規(guī)模
Field = ea.crtfld(Encoding, problem.varTypes, problem.ranges,problem.borders) # 創(chuàng)建區(qū)域描述器
population = ea.Population(Encoding, Field, NIND) # 實例化種群對象(此時種群還沒被真正初始化,僅僅是生成一個種群對象)
"""=========================算法參數(shù)設置============================"""
myAlgorithm = ea.moea_NSGA2_templet(problem, population) # 實例化一個算法模板對象
myAlgorithm.mutOper.Pm = 0.2 # 修改變異算子的變異概率
myAlgorithm.recOper.XOVR = 0.9 # 修改交叉算子的交叉概率
myAlgorithm.MAXGEN = 200 # 最大進化代數(shù)
myAlgorithm.logTras = 1 # 設置每多少代記錄日志,若設置成0則表示不記錄日志
myAlgorithm.verbose = False # 設置是否打印輸出日志信息
myAlgorithm.drawing = 1 # 設置繪圖方式(0:不繪圖;1:繪制結果圖;2:繪制目標空間過程動畫;3:繪制決策空間過程動畫)
"""==========================調用算法模板進行種群進化==============
調用run執(zhí)行算法模板,得到帕累托最優(yōu)解集NDSet以及最后一代種群。
NDSet是一個種群類Population的對象。
NDSet.ObjV為最優(yōu)解個體的目標函數(shù)值;NDSet.Phen為對應的決策變量值。
詳見Population.py中關于種群類的定義。
"""
[NDSet, population] = myAlgorithm.run() # 執(zhí)行算法模板,得到非支配種群以及最后一代種群
NDSet.save() # 把非支配種群的信息保存到文件中
"""===========================輸出結果========================"""
print('用時:%s 秒' % myAlgorithm.passTime)
print('非支配個體數(shù):%d 個' % NDSet.sizes) if NDSet.sizes != 0 else print('沒有找到可行解!')
if myAlgorithm.log is not None and NDSet.sizes != 0:
    print('GD', myAlgorithm.log['gd'][-1])
    print('IGD', myAlgorithm.log['igd'][-1])
    print('HV', myAlgorithm.log['hv'][-1])
    print('Spacing', myAlgorithm.log['spacing'][-1])
"""======================進化過程指標追蹤分析=================="""
metricName = [['igd'], ['hv']]
Metrics = np.array([myAlgorithm.log[metricName[i][0]] for i in range(len(metricName))]).T
# 繪制指標追蹤分析圖
ea.trcplot(Metrics, labels=metricName, titles=metricName)

4.3 結果

很多初學者可能不太清楚評價多目標規(guī)劃的一些指標GD、IGD、HV等,這里給大家參考: 多目標進化算法的性能評價指標總結.

帕累托前沿結果:

在這里插入圖片描述

hv的趨勢:

在這里插入圖片描述

最后結果:

在這里插入圖片描述

5. 參考資料

geatpy官網教程: https://geatpy.com.

多目標規(guī)劃評價指標: 多目標進化算法的性能評價指標總結.

到此這篇關于python遺傳算法之單/多目標規(guī)劃問題的文章就介紹到這了,更多相關python 單/多目標規(guī)劃 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python比較兩個列表大小的方法

    python比較兩個列表大小的方法

    這篇文章主要介紹了python比較兩個列表大小的方法,涉及Python針對列表的相關操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • 詳解python中executemany和序列的使用方法

    詳解python中executemany和序列的使用方法

    這篇文章主要介紹了詳解python中executemany和序列的使用方法的相關資料,需要的朋友可以參考下
    2017-08-08
  • Python matplotlib超詳細教程實現(xiàn)圖形繪制

    Python matplotlib超詳細教程實現(xiàn)圖形繪制

    matplotlib 模塊不僅提供了繪制統(tǒng)計圖表的功能,還支持繪制圓形、正方形、矩形等各種圖形。這篇文章主要為大家詳細介紹了利用matplotlib.patches 繪制一些基本圖形,快來跟隨小編一起學習吧
    2021-12-12
  • Python集合操作方法詳解

    Python集合操作方法詳解

    這篇文章主要介紹了Python集合操作方法詳解,需要的朋友可以參考下
    2020-02-02
  • python 逆向爬蟲正確調用 JAR 加密邏輯

    python 逆向爬蟲正確調用 JAR 加密邏輯

    這篇文章主要介紹了python 逆向爬蟲正確調用 JAR 加密邏輯,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-01-01
  • Python爬蟲實例扒取2345天氣預報

    Python爬蟲實例扒取2345天氣預報

    本篇文章給大家詳細分析了通過Python爬蟲如何采集到2345的天氣預報信息,有興趣的朋友參考學習下吧。
    2018-03-03
  • Python?OpenCV尋找兩條曲線直接的最短距離

    Python?OpenCV尋找兩條曲線直接的最短距離

    這篇文章主要為大家詳細介紹了Python?OpenCV尋找兩條曲線直接的最短距離,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • python網絡編程socket實現(xiàn)服務端、客戶端操作詳解

    python網絡編程socket實現(xiàn)服務端、客戶端操作詳解

    這篇文章主要介紹了python網絡編程socket實現(xiàn)服務端、客戶端操作,結合實例形式分析了python基于socket實現(xiàn)服務端、客戶端相關操作技巧與使用注意事項,需要的朋友可以參考下
    2020-03-03
  • 十個常見的Python腳本詳細介紹及代碼舉例

    十個常見的Python腳本詳細介紹及代碼舉例

    這篇文章主要給大家介紹了十個常見的Python腳本的相關資料,包括批量重命名文件、下載網頁圖片、發(fā)送郵件通知、讀取和寫入CSV文件、爬取網頁數(shù)據(jù)、自動化測試、圖像處理、數(shù)據(jù)可視化以及創(chuàng)建簡單的Web應用,需要的朋友可以參考下
    2024-11-11
  • python隨機種子ranrandom seed的使用

    python隨機種子ranrandom seed的使用

    本文介紹了在Python中設置隨機種子random seed的方法,可以使用seed()函數(shù)設置隨機種子,確保你的隨機數(shù)生成過程是可重復的,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-12-12

最新評論

潞城市| 崇义县| 类乌齐县| 崇阳县| 晋州市| 武陟县| 温宿县| 台安县| 龙海市| 海南省| 昆明市| 四川省| 陇西县| 科尔| 门头沟区| 邢台市| 广宗县| 永泰县| 通化县| 宿州市| 聊城市| 手机| 云林县| 湖州市| 营口市| 刚察县| 顺平县| 盈江县| 乳山市| 林西县| 刚察县| 武义县| 历史| 河间市| 芒康县| 安岳县| 舞钢市| 运城市| 象州县| 青河县| 芜湖县|