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

純Python實(shí)現(xiàn)遺傳算法詳解

 更新時(shí)間:2023年08月11日 09:16:31   作者:微小冷  
遺傳算法(GA)是七十年代被霍蘭德提出來的,那還是8086的時(shí)代,但在如今的3nm時(shí)代,仍然散發(fā)著經(jīng)典的光輝,下面我們就來看看如何利用Python實(shí)現(xiàn)遺傳算法吧

遺傳算法(GA)是七十年代被霍蘭德提出來的,那還是8086的時(shí)代。但在如今的3nm時(shí)代,仍然散發(fā)著經(jīng)典的光輝,故而堪稱跨時(shí)代的優(yōu)秀算法了。

GA的核心概念是種群,種群的關(guān)鍵是染色體,隨著自然選擇,染色體通過不斷地復(fù)制、交叉、突變,完成一代又一代的進(jìn)化,最終得到最優(yōu)的結(jié)果。

具體編程時(shí),染色體可用字符串或者二進(jìn)制進(jìn)行編碼;自然選擇,就是適應(yīng)度函數(shù);進(jìn)化就是迭代。所以技術(shù)上的關(guān)鍵點(diǎn),就是復(fù)制、交叉、突變等過程的函數(shù)實(shí)現(xiàn)。

編碼

考慮到二進(jìn)制編碼存在位數(shù)限制,故而遺傳算法第一步就是確定問題規(guī)模,例如解空間在(0,1)區(qū)間,精度要求為10−6,則共涉及到106個(gè)解,需要24位二進(jìn)制才能表示完全。如果有N個(gè)變量,則共計(jì)需要24N個(gè)0/1組成序列。

接下來實(shí)現(xiàn)一個(gè)編碼函數(shù),輸入為變量數(shù)組、變量區(qū)間以及精度要求。

# x為變量,xL為解范圍的最小值,pre為精度,N為二進(jìn)制解的個(gè)數(shù)
def codeOne(x, xL, pre, N):
    x = int((x-xL)/pre)
    return [(x//2**i)%2 for i in range(N)]
from itertools import chain
# xs為一組變量, xL, xR為變量區(qū)間, pre為精度
def coding(xs, xL, xR, pre):
    N = int(np.ceil(np.log2((xR-xL)/pre)))
    xs = [codeOne(x, xL, pre, N) for x in xs]
    return np.array(list(chain(*xs)))
# 解碼是編碼的逆過程
def decodeOne(b, xL, pre, N):
    x = np.sum([b[i]*2**i for i in range(N)])
    return xL + x*pre
def decoding(bins, xL, xR, pre):
    N = int(np.ceil(np.log2((xR-xL)/pre)))
    M = int(len(bins)/N)
    return [decodeOne(bins[N*i:N*(i+1)], xL, pre, N) 
        for i in range(M)]

其中,codeOne用于編碼單個(gè)變量,coding可編碼多個(gè)變量。其中輸入?yún)?shù)xL, xR, pre的數(shù)據(jù)格式可以改寫為列表,從而使得待求解參數(shù)更加靈活。

遺傳

遺傳就是基因的復(fù)制和交叉,有的時(shí)候可能還會(huì)發(fā)生一點(diǎn)突變,其中交叉過程相對復(fù)雜,故而封裝成一個(gè)函數(shù)

import numpy as np
# b1,b2為編碼后的二進(jìn)制串
# M為編碼后的二進(jìn)制長度;index為自然數(shù)列
def cross(b1, b2, M, index):
    np.random.shuffle(index)
    i1 = index[:randint(0,M)]
    np.random.shuffle(index)
    i2 = index[:randint(0,M)]
    b1[i1], b2[i2] = b2[i1], b1[i2]

其中,shuffle相當(dāng)于是把數(shù)組打亂,index為自然數(shù)列,當(dāng)然被打亂多次后已經(jīng)面目全非了。cross實(shí)現(xiàn)的功能是,對于輸入的b1和b2,任選其中的某幾位進(jìn)行交換。

下面是進(jìn)化過程,也就是單步執(zhí)行的程序,主要包括劣種淘汰、交叉以及突變?nèi)齻€(gè)過程。

from copy import deepcopy
from random import randint
# rMuta為突變概率;nDie為每一代淘汰掉的個(gè)數(shù)
def genetic(xs, func, xL, xR, pre, nMuta, nDie):
    N = len(xs)
    fs = [func(x) for x in xs]
    index = np.argsort(fs)
    fBest = fs[index[0]]
    # 將最差的淘汰掉,將最優(yōu)的提取出來
    xs[index[-nDie:]] = xs[index[:nDie]]
    # 編碼
    bs = [coding(x, xL, xR, pre) for x in xs]
    M = len(bs[0])      # 此為編碼后的參數(shù)長度
    index = np.arange(M)
    # 交叉
    for i in range(N//2):
        cross(bs[i*2], bs[i*2+1], int(M/2), index)
    # 此為突變點(diǎn)個(gè)數(shù)
    for b in bs:
        np.random.shuffle(index)
        b[index[:nMuta]] = ~b[index[:nMuta]]
    # 最后解碼并輸出
    xs = [decoding(b, xL, xR, pre) for b in bs]
    return np.array(xs), fBest

主程序

所謂主程序,就是加上一個(gè)逐代繁衍的循環(huán)

uniRand = np.random.uniform
# nId為個(gè)體數(shù);nDim為參數(shù)維度;nIter為迭代數(shù)
# xRange為x取值范圍,pre是精度
def GA(func, nId, nDim, nIter, 
    xRange, pre, rMuta, nDie):
    xs = [uniRand(*xRange, nDim) for _ in range(nId)]
    xs = np.array(xs)
    for i in range(nIter):
        xs, fBest = genetic(xs, func, xRange[0], xRange[1],
            pre, rMuta, nDie)
        if i%20==0:
            msg = f"第{i}次迭代,最佳結(jié)果為{fBest}"
            print(msg)
    fs = [func(x) for x in xs]
    index = np.argmin(fs)
    msg = "當(dāng)前參數(shù):" + ",".join([f"{x}" for x in xs[index]])
    print(msg)

測試

最后又到了激動(dòng)人心的測試環(huán)節(jié),還是用

def test(xs):
    _sum = 0.0
    for i in range(len(xs)):
        _sum = _sum + np.cos((xs[i]*i)/5)*(i+1)
    return _sum
if __name__ == "__main__":
    GA(test, 30, 5, 101, (-5,5), 1e-6, 2, 2)

得到結(jié)果為

>python GA.py
第0次迭代,最佳結(jié)果為-6.109745260005657
第20次迭代,最佳結(jié)果為-11.73854686214257
第40次迭代,最佳結(jié)果為-11.656344079309445
第60次迭代,最佳結(jié)果為-11.366187890697542
第80次迭代,最佳結(jié)果為-11.526653664416903
第100次迭代,最佳結(jié)果為-11.329056280514049
當(dāng)前參數(shù):8.073827999999999,11.655532000000001,7.032817,4.2005289999999995,-4.371395

到此這篇關(guān)于純Python實(shí)現(xiàn)遺傳算法詳解的文章就介紹到這了,更多相關(guān)Python遺傳算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于你不想知道的所有Python3 unicode特性

    關(guān)于你不想知道的所有Python3 unicode特性

    我的讀者知道我是一個(gè)喜歡痛罵Python3 unicode的人。這次也不例外。我將會(huì)告訴你用unicode有多痛苦和為什么我不能閉嘴。我花了兩周時(shí)間研究Python3,我需要發(fā)泄我的失望。在這些責(zé)罵中,仍然有有用的信息,因?yàn)樗涛覀內(nèi)绾蝸硖幚鞵ython3。如果沒有被我煩到,就讀一讀吧
    2014-11-11
  • Python編程中被忽視的核心技巧總結(jié)

    Python編程中被忽視的核心技巧總結(jié)

    這篇文章主要介紹了一些在?Python?編程中可能被忽視的核心功能,包括默認(rèn)參數(shù)、海象運(yùn)算符、*args?和?**kwargs?的使用等,需要的可參考下
    2023-08-08
  • Python使用for循環(huán)遍歷字符串逐個(gè)獲取字符的完整指南

    Python使用for循環(huán)遍歷字符串逐個(gè)獲取字符的完整指南

    在Python編程的浩瀚宇宙中,字符串處理是最基礎(chǔ)也最強(qiáng)大的技能之一,當(dāng)你需要分析文本、清洗數(shù)據(jù)或構(gòu)建復(fù)雜應(yīng)用時(shí),逐個(gè)獲取字符串中的字符往往是第一步,今天,我們將深入探索這個(gè)看似簡單卻蘊(yùn)含無限可能的主題,如何用for循環(huán)遍歷字符串,逐個(gè)獲取字符
    2026-04-04
  • Python2.7環(huán)境Flask框架安裝簡明教程【已測試】

    Python2.7環(huán)境Flask框架安裝簡明教程【已測試】

    這篇文章主要介紹了Python2.7環(huán)境Flask框架安裝方法,結(jié)合實(shí)例形式詳細(xì)分析了Python2.7環(huán)境下安裝Flask框架遇到的問題與相關(guān)解決方法、注意事項(xiàng),并給出了一個(gè)基本的測試示例,需要的朋友可以參考下
    2018-07-07
  • python對execl 處理操作代碼

    python對execl 處理操作代碼

    這篇文章主要介紹了python對execl 處理操作,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • python讀取csv文件指定行的2種方法詳解

    python讀取csv文件指定行的2種方法詳解

    這篇文章主要介紹了python讀取csv文件指定行的方法詳解,需要的朋友可以參考下
    2020-02-02
  • python中Matplotlib繪制直線的實(shí)例代碼

    python中Matplotlib繪制直線的實(shí)例代碼

    在本篇文章里小編給大家整理的是一篇關(guān)于python中Matplotlib繪制直線的實(shí)例代碼內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)下。
    2021-07-07
  • python翻譯軟件實(shí)現(xiàn)代碼(使用google api完成)

    python翻譯軟件實(shí)現(xiàn)代碼(使用google api完成)

    這篇文章主要介紹了python結(jié)合google api完成的翻譯軟件實(shí)現(xiàn)代碼,大家參考使用
    2013-11-11
  • python opencv 讀取本地視頻文件 修改ffmpeg的方法

    python opencv 讀取本地視頻文件 修改ffmpeg的方法

    今天小編就為大家分享一篇python opencv 讀取本地視頻文件 修改ffmpeg的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • ?Python?匿名函數(shù)lambda?詳情

    ?Python?匿名函數(shù)lambda?詳情

    這篇文章主要介紹了?Python?匿名函數(shù)lambda,??lambda?????函數(shù)返回函數(shù)本身而不是將其賦值給一個(gè)變量名。所以它也被稱為匿名函數(shù),下文更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-03-03

最新評論

西丰县| 阿尔山市| 湘乡市| 涿州市| 北碚区| 固始县| 基隆市| 乐东| 永靖县| 焦作市| 东安县| 平武县| 遂川县| 翁源县| 长丰县| 南开区| 独山县| 二连浩特市| 伊宁市| 安达市| 景洪市| 黄冈市| 孟津县| 绥滨县| 麻阳| 慈利县| 铁岭市| 应城市| 文水县| 许昌市| 吴江市| 泸水县| 公主岭市| 澄迈县| 潢川县| 武山县| 巴塘县| 桂东县| 江永县| 河源市| 焉耆|