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

歡迎訪問 生活随笔!

生活随笔

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

python

python拓展包之pymoo使用方法:多目标优化(NSGA2)

發布時間:2023/12/10 python 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python拓展包之pymoo使用方法:多目标优化(NSGA2) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

python拓展包之pymoo使用方法:多目標優化

  • 一、pymoo的安裝
  • 二、多目標優化的一般模式
  • 三、pymoo處理多目標優化問題的格式
  • 四、python中pymoo的使用
  • 五、選擇優化算法
  • 參考資料

一、pymoo的安裝

pip安裝

pip install -U pymoo

二、多目標優化的一般模式

一般來說,多目標優化具有幾個受不等式和等式約束的目標函數。其目標是找到一組滿足所有約束條件并盡可能好地處理其所有目標值的解決方案。問題的一般形式的定義為:

目標函數f(x)
不等式約束g(x)
等式約束和h(x)
變量x的上下約束

在下面,我們說明了一個具有兩個約束條件的雙目標優化問題。


它的可視化圖像如下:


可以看到,它的最優解在(圖中橙色區域)
下面我們在python中使用pymoo來實現上述問題公式。

三、pymoo處理多目標優化問題的格式

一、pymoo支能夠處理目標函數最小化的優化問題

然而,在不失去一般性的情況下,一個應該最大化的目標可以乘以?1并最小化。
在上述優化問題中,我們需要將目標函數
max f2(x)
轉化為
min -f2(x)
此外,所有的約束函數都需要表述為一個小于等于的約束。
我們需要將約束條件
g2(x)>=0
轉化為
-g2(x)<=0
我們建議將約束標準化,使它們都同等重視。將約束條件的每一個因式的常數部分相乘得到一個約束常量,
對于g1(x),約束常量為 2 ? (?0.1) ?(?0.9) = 0.18
對于g2(x),約束常量為 20 ? (?0.4) ? (?0.6) = 4.8
最后,將使用pymoo進行優化的優化問題定義為:

四、python中pymoo的使用

接下來,用Python實現該優化問題。pymoo中的每個優化問題都必須從Problem類中繼承。
首先,通過調用super()函數,可以初始化問題屬性。

from pymoo.model.problem import Problem class MyProblem(Problem):def __init__(self,cost_matrix: list, ):self.cost_matrix = cost_matrixsuper().__init__(n_var=2, # 變量數n_obj=2, # 目標數n_constr=2, # 約束數xl=np.array([-2, -2]), # 變量下界xu=np.array([2, 2]), # 變量上界)def _evaluate(self, x, out, *args, **kwargs):# 定義目標函數f1 = x[:, 0]**2 + x[:, 1]**2 # x1放在x的第0列,x2放在x的第一列f2 = (x[:, 0] - 1)**2 + x[:, 1]**2# 定義約束條件g1 = 2*(x[:, 0] - 0.1) * (x[:, 0] - 0.9) / 0.18g2 = -20*(x[:, 0] - 0.4) * (x[:, 0] - 0.6) / 4.8# todoout["F"] = np.column_stack([f1, f2])out["G"] = np.column_stack([g1, g2])

super初始化中
變量數(n_var)
目標(n_obj)
約束(n_constr)
此外,下(xl)和上變量邊界(xu)作為NumPy數組提供。


_evaluate函數中
定義目標函數以鍵“F”添加到字典中
定義約束條件以鍵“G”添加到字典中

五、選擇優化算法

在pymoo中,需要創建一個算法對象來進行優化。對于每種算法,都有API文檔,通過提供不同的參數,可以以即插即用的方式定制算法。一般來說,選擇一個合適的優化問題的算法本身就是一個挑戰。當事先知道問題特征時,我們建議通過定制操作符使用這些特征。然而,在我們的情況下,優化問題相當簡單,但應該考慮有兩個目標和兩個約束的方面。因此,我們決定使用NSGA-II[12]及其默認配置,并進行少量修改。我們選擇了40人的人口規模,但我們沒有產生相同數量的后代,而是每一代只創造10個后代。這是NSGA-II的一個穩態變體,對于比較簡單的優化問題,可以提高收斂性,存在局部帕雷托前沿。此外,我們啟用了一個重復的檢查,以確保交配產生的后代,以及與現有種群關于其可變向量的不同。
使用所提供的參數調用NSGA2的構造函數并返回一個初始化的算法對象。

from pymoo.algorithms.nsga2 import NSGA2 from pymoo.factory import get_sampling, get_crossover, get_mutation from pymoo.optimize import minimize from example import MyProblem# 定義遺傳算法 algorithm = NSGA2(pop_size=40,n_offsprings=10,sampling=get_sampling("real_random"),crossover=get_crossover("real_sbx", prob=0.9, eta=15),mutation=get_mutation("real_pm", eta=20),eliminate_duplicates=True )

接下來,我們使用初始化的算法對象來優化所定義的問題。因此,將具有實例問題和算法的最小化函數作為參數。此外,我們提供了運行40代算法的終止標準,這將導致40個+40×10=440函數評估。此外,我們定義了一個隨機種子,以確保重現性,并使冗長標志能夠看到每一代的打印輸出。該方法返回一個結果對象,其中包含該算法找到的非支配解集。

res = minimize(MyProblem(),algorithm,('n_gen', 40),seed=1,verbose=True)

打印輸出

D:\Soft\Anaconda3\envs\datadeal\python.exe D:/WorkSpace/pymooto/alg_example.py ===================================================================================== n_gen | n_eval | cv (min) | cv (avg) | n_nds | eps | indicator =====================================================================================1 | 40 | 0.00000E+00 | 2.36399E+01 | 1 | - | -2 | 50 | 0.00000E+00 | 1.15486E+01 | 1 | 0.00000E+00 | f3 | 60 | 0.00000E+00 | 5.277918607 | 1 | 0.00000E+00 | f4 | 70 | 0.00000E+00 | 2.406068542 | 2 | 1.000000000 | ideal5 | 80 | 0.00000E+00 | 0.908316880 | 3 | 0.869706146 | ideal6 | 90 | 0.00000E+00 | 0.264746300 | 3 | 0.00000E+00 | f7 | 100 | 0.00000E+00 | 0.054063822 | 4 | 0.023775686 | ideal8 | 110 | 0.00000E+00 | 0.003060876 | 5 | 0.127815454 | ideal9 | 120 | 0.00000E+00 | 0.00000E+00 | 6 | 0.004633441 | ideal10 | 130 | 0.00000E+00 | 0.00000E+00 | 6 | 0.062649485 | nadir11 | 140 | 0.00000E+00 | 0.00000E+00 | 7 | 0.026769546 | f12 | 150 | 0.00000E+00 | 0.00000E+00 | 7 | 0.047566009 | f13 | 160 | 0.00000E+00 | 0.00000E+00 | 7 | 0.000678729 | f14 | 170 | 0.00000E+00 | 0.00000E+00 | 9 | 0.043888006 | ideal15 | 180 | 0.00000E+00 | 0.00000E+00 | 10 | 0.013506283 | f16 | 190 | 0.00000E+00 | 0.00000E+00 | 11 | 0.052719639 | ideal17 | 200 | 0.00000E+00 | 0.00000E+00 | 14 | 0.008531768 | f18 | 210 | 0.00000E+00 | 0.00000E+00 | 16 | 0.011165361 | f19 | 220 | 0.00000E+00 | 0.00000E+00 | 18 | 0.004040787 | f20 | 230 | 0.00000E+00 | 0.00000E+00 | 20 | 0.001296614 | f21 | 240 | 0.00000E+00 | 0.00000E+00 | 22 | 0.000911500 | f22 | 250 | 0.00000E+00 | 0.00000E+00 | 24 | 0.003461153 | nadir23 | 260 | 0.00000E+00 | 0.00000E+00 | 27 | 0.004261571 | ideal24 | 270 | 0.00000E+00 | 0.00000E+00 | 28 | 0.029927769 | nadir25 | 280 | 0.00000E+00 | 0.00000E+00 | 28 | 0.001150567 | f26 | 290 | 0.00000E+00 | 0.00000E+00 | 30 | 0.002181257 | f27 | 300 | 0.00000E+00 | 0.00000E+00 | 33 | 0.006887739 | nadir28 | 310 | 0.00000E+00 | 0.00000E+00 | 36 | 0.001237981 | f29 | 320 | 0.00000E+00 | 0.00000E+00 | 37 | 0.000102543 | f30 | 330 | 0.00000E+00 | 0.00000E+00 | 38 | 0.000747546 | f31 | 340 | 0.00000E+00 | 0.00000E+00 | 40 | 0.005157126 | nadir32 | 350 | 0.00000E+00 | 0.00000E+00 | 40 | 0.00000E+00 | f33 | 360 | 0.00000E+00 | 0.00000E+00 | 40 | 0.002321697 | f34 | 370 | 0.00000E+00 | 0.00000E+00 | 40 | 0.016674348 | nadir35 | 380 | 0.00000E+00 | 0.00000E+00 | 40 | 0.000760584 | f36 | 390 | 0.00000E+00 | 0.00000E+00 | 40 | 0.016011922 | nadir37 | 400 | 0.00000E+00 | 0.00000E+00 | 40 | 0.000333129 | f38 | 410 | 0.00000E+00 | 0.00000E+00 | 40 | 0.000980877 | f39 | 420 | 0.00000E+00 | 0.00000E+00 | 40 | 0.001264690 | f40 | 430 | 0.00000E+00 | 0.00000E+00 | 40 | 0.001571863 | f

關于pymoo的中文使用教程很少,本文內容大都翻譯自pymoo的官方使用說明。

參考資料

pymoo: Multi-objective Optimization in Python

總結

以上是生活随笔為你收集整理的python拓展包之pymoo使用方法:多目标优化(NSGA2)的全部內容,希望文章能夠幫你解決所遇到的問題。

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