1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        用 Python 進行差分進化全局優(yōu)化

        共 6541字,需瀏覽 14分鐘

         ·

        2021-03-21 18:36

        差異進化是一種全局優(yōu)化算法。
        它是一種進化算法,與其他進化算法(例如遺傳算法)有關(guān)。與遺傳算法不同,它是專門設(shè)計用于對實值向量(而不是位串)進行運算的。此外,與遺傳算法不同的是,它使用向量減法和加法等向量運算來導(dǎo)航搜索空間,而不是遺傳學(xué)啟發(fā)的變換。
        在本教程中,您將發(fā)現(xiàn)差異演化全局優(yōu)化算法。完成本教程后,您將知道:
        • 差分進化優(yōu)化是一種進化算法,旨在與實值候選解一起使用。
        • 如何在python中使用差異進化優(yōu)化算法API。
        • 使用差異演化解決具有多個最優(yōu)解的全局優(yōu)化問題的示例。
        教程概述
        本教程分為三個部分:他們是:
        • 差異進化
        • 差分進化API
        • 差分進化的工作實例
        差異進化
        差分進化,簡稱DE,是一種隨機的全局搜索優(yōu)化算法。它是一種進化算法,與其他進化算法(例如遺傳算法)有關(guān)。與使用位序列表示候選解決方案的遺傳算法不同,差分演化被設(shè)計為與用于連續(xù)目標函數(shù)的多維實值候選解決方案一起使用。
        該算法在搜索中不使用梯度信息,因此非常適合于非微分非線性目標函數(shù)。該算法通過維護代表實值向量的候選解的總體來工作。通過制作現(xiàn)有解決方案的修改版本來創(chuàng)建新的候選解決方案,然后在算法的每次迭代中替換大部分人口。使用“策略”來創(chuàng)建新的候選解決方案,該策略涉及選擇要添加突變的基本解決方案,以及從總體中計算出突變的數(shù)量和類型的其他候選解決方案,稱為差異向量。例如,一種策略可以選擇最佳候選解決方案作為突變中差異矢量的基礎(chǔ)和隨機解決方案。
        如果子級具有更好的目標函數(shù)評估,則將基礎(chǔ)解決方案替換為其子級。
        變異計算為候選解決方案對之間的差異,從而產(chǎn)生差異矢量,然后將差異矢量添加到基本解決方案中,并通過設(shè)置在[0,2]范圍內(nèi)的變異因子超參數(shù)進行加權(quán)。
        并非基本解決方案的所有元素都發(fā)生了突變。這是通過重組超參數(shù)控制的,通常將其設(shè)置為較大的值(例如80%),這意味著基本解決方案中的大多數(shù)(但不是全部)變量都將被替換。通過對概率分布(例如二項式或指數(shù)式)進行采樣,分別為每個位置確定保留或替換基本解中的值的決策。
        使用標準術(shù)語來描述以下形式的差異策略:     DE / x / y / z
        DE代表“差分進化”,x定義了要變異的基本解,例如“ rand”代表隨機,“ best”代表總體中的最佳解。y代表添加到基本解中的差異向量的數(shù)量,例如1,z定義用于確定每個解是否在總體中被保留或替換的概率分布,例如用于二項式的“bin”或用于二項式的“ exp”。
        配置DE / best / 1 / binDE / best / 2 / bin是受歡迎的配置,因為它們在許多目標功能上表現(xiàn)良好。既然我們已經(jīng)熟悉了差分進化算法,那么讓我們看一下如何使用SciPy API實現(xiàn)。
        差分進化API
        Python中可通過differential_evolution()SciPy函數(shù)使用差分演化全局優(yōu)化算法。該函數(shù)將目標函數(shù)的名稱和每個輸入變量的界限作為搜索的最小參數(shù)。
        # perform the differential evolution search
        result = differential_evolution(objective, bounds)
        盡管可以將它們配置為自定義搜索,但還有許多其他具有默認值的搜索超參數(shù)。
        關(guān)鍵的超參數(shù)是控制所執(zhí)行的差異進化搜索類型的“策略”參數(shù)。默認情況下,將其設(shè)置為“ best1bin”(DE / best / 1 / bin),對于大多數(shù)問題而言,這是一個很好的配置。它通過從總體中選擇隨機解,從另一個中減去一個,然后將差異的縮放版本添加到總體中的最佳候選解中,來創(chuàng)建新的候選解。
        new = best + (mutation * (rand1 – r and2))
        “ popsize”參數(shù)控制總體中維護的候選解決方案的大小或數(shù)量。它是候選解決方案中維數(shù)的一個因素,默認情況下設(shè)置為15。這意味著對于2D目標函數(shù),將維持(2 *15)或30個候選解決方案的總體大小。
        該算法的迭代總數(shù)由“ maxiter”參數(shù)維護,默認為1,000?!白儺悺眳?shù)控制每次迭代對候選解決方案進行的更改數(shù)量。默認情況下,它設(shè)置為0.5。重組量通過“ recombination”參數(shù)控制,默認情況下設(shè)置為0.7(給定候選解決方案的70%)。最后,將本地搜索應(yīng)用于在搜索結(jié)束時找到的最佳候選解決方案。這是通過“拋光”參數(shù)控制的,默認情況下將其設(shè)置為True。搜索的結(jié)果是一個OptimizeResult對象,可以在其中像字典一樣訪問屬性??梢酝ㄟ^“成功”或“消息”鍵來訪問搜索的成功與否??梢酝ㄟ^“ nfev”訪問功能評估的總數(shù),并且可以通過“ x”鍵訪問為搜索找到的最佳輸入?,F(xiàn)在,我們已經(jīng)熟悉了Python中的差異進化API,下面我們來看一些可行的示例。
        差分進化的工作實例
        在本節(jié)中,我們將看一個在具有挑戰(zhàn)性的目標函數(shù)上使用差分演化算法的示例。Ackley函數(shù)是目標函數(shù)的一個示例,該目標函數(shù)具有單個全局最優(yōu)值和多個局部最優(yōu)值,可能會在其中陷入局部搜索。因此,需要全局優(yōu)化技術(shù)。這是一個二維目標函數(shù),其全局最佳值為[0,0],其值為0.0。下面的示例實現(xiàn)了Ackley,并創(chuàng)建了一個三維表面圖,顯示了全局最優(yōu)值和多個局部最優(yōu)值。
        # ackley multimodal function
        from numpy import arange
        from numpy import exp
        from numpy import sqrt
        from numpy import cos
        from numpy import e
        from numpy import pi
        from numpy import meshgrid
        from matplotlib import pyplot
        from mpl_toolkits.mplot3d import Axes3D
         
        # objective function
        def objective(x, y):
         return -20.0 * exp(-0.2 * sqrt(0.5 * (x**2 + y**2))) - exp(0.5 * (cos(2 * pi * x) + cos(2 * pi * y))) + e + 20
         
        # define range for input
        r_min, r_max = -5.05.0
        # sample input range uniformly at 0.1 increments
        xaxis = arange(r_min, r_max, 0.1)
        yaxis = arange(r_min, r_max, 0.1)
        # create a mesh from the axis
        x, y = meshgrid(xaxis, yaxis)
        # compute targets
        results = objective(x, y)
        # create a surface plot with the jet color scheme
        figure = pyplot.figure()
        axis = figure.gca(projection='3d')
        axis.plot_surface(x, y, results, cmap='jet')
        # show the plot
        pyplot.show()
        運行示例將創(chuàng)建Ackley函數(shù)的表面圖,以顯示大量的局部最優(yōu)值。
        首先,我們可以將搜索空間的邊界定義為每個維度中函數(shù)的極限。
        # define the bounds on the search
        bounds = [[r_min, r_max], [r_min, r_max]]
        然后,我們可以通過指定目標函數(shù)的名稱和搜索范圍來應(yīng)用搜索。在這種情況下,我們將使用默認的超參數(shù)。
        # perform the differential evolution search
        result = differential_evolution(objective, bounds)
        搜索完成后,它將報告搜索狀態(tài)和執(zhí)行的迭代次數(shù),以及通過評估發(fā)現(xiàn)的最佳結(jié)果。
        # summarize the result
        print('Status : %s' % result['message'])
        print('Total Evaluations: %d' % result['nfev'])
        # evaluate solution
        solution = result['x']
        evaluation = objective(solution)
        print('Solution: f(%s) = %.5f' % (solution, evaluation))
        結(jié)合在一起,下面列出了將微分進化應(yīng)用于Ackley目標函數(shù)的完整示例。
        # differential evolution global optimization for the ackley multimodal objective function
        from scipy.optimize import differential_evolution
        from numpy.random import rand
        from numpy import exp
        from numpy import sqrt
        from numpy import cos
        from numpy import e
        from numpy import pi
         
        # objective function
        def objective(v):
         x, y = v
         return -20.0 * exp(-0.2 * sqrt(0.5 * (x**2 + y**2))) - exp(0.5 * (cos(2 * pi * x) + cos(2 * pi * y))) + e + 20
         
        # define range for input
        r_min, r_max = -5.05.0
        # define the bounds on the search
        bounds = [[r_min, r_max], [r_min, r_max]]
        # perform the differential evolution search
        result = differential_evolution(objective, bounds)
        # summarize the result
        print('Status : %s' % result['message'])
        print('Total Evaluations: %d' % result['nfev'])
        # evaluate solution
        solution = result['x']
        evaluation = objective(solution)
        print('Solution: f(%s) = %.5f' % (solution, evaluation))
        運行示例將執(zhí)行優(yōu)化,然后報告結(jié)果。
        注意:由于算法或評估程序的隨機性,或者數(shù)值精度的差異,您的結(jié)果可能會有所不同??紤]運行該示例幾次并比較平均結(jié)果。
        在這種情況下,我們可以看到該算法在輸入為零且目標函數(shù)評估為零的情況下定位了最優(yōu)值。
        我們可以看到總共執(zhí)行了3,063個功能評估。
        Status: Optimization terminated successfully.
        Total Evaluations: 3063
        Solution: f([0. 0.]) = 0.00000


        者:沂水寒城,CSDN博客專家,個人研究方向:機器學(xué)習(xí)、深度學(xué)習(xí)、NLP、CV

        Blog: http://yishuihancheng.blog.csdn.net


        贊 賞 作 者



        更多閱讀



        2020 年最佳流行 Python 庫 Top 10


        2020 Python中文社區(qū)熱門文章 Top 10


        5分鐘快速掌握 Python 定時任務(wù)框架

        特別推薦




        點擊下方閱讀原文加入社區(qū)會員

        瀏覽 69
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            69操逼网站 | 欧美性爱在线视频播放 | 麻豆91精品91久久久 | 日韩日日骚 | 91蜜桃麻豆媒体成人影院 | 男女做爰猛烈叫床高潮的书 | 国产午夜精品一区二区三区在线观看 | 嗯嗯啊啊国产 | 国产91福利在线 | 欧美大逼 |