欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python使用DEAP庫(kù)實(shí)現(xiàn)簡(jiǎn)單遺傳算法

 更新時(shí)間:2025年01月19日 08:20:21   作者:Starry___sky  
DEAP是一個(gè)用于快速原型設(shè)計(jì)和實(shí)驗(yàn)的進(jìn)化計(jì)算框架,它支持多種進(jìn)化算法,包括遺傳算法、遺傳編程等,下面我們來(lái)看看如何使用DEAP庫(kù)實(shí)現(xiàn)簡(jiǎn)單遺傳算法吧

DEAP(Distributed Evolutionary Algorithms in Python)是一個(gè)用于快速原型設(shè)計(jì)和實(shí)驗(yàn)的進(jìn)化計(jì)算框架。它支持多種進(jìn)化算法,包括遺傳算法、遺傳編程、進(jìn)化策略、粒子群優(yōu)化等。DEAP 的設(shè)計(jì)目標(biāo)是靈活性和易用性,使得研究人員和開發(fā)者能夠輕松地實(shí)現(xiàn)和測(cè)試各種進(jìn)化算法。

官方文檔

官方GitHub倉(cāng)庫(kù)

因本人主攻方向并不是Python甚至可以說(shuō)之前對(duì)Python一竅不通,如有錯(cuò)誤,還望各位讀者指正。

本篇也以講解用法為主,具體的類的繼承和原理并不涉及。

這里以求 f(x)=(x−5)2f(x)=(x−5)2 和 f(x)=−x2+4x+4f(x)=−x2+4x+4 在 [0,31][0,31] 上都盡可能大為目標(biāo)的,多目標(biāo)優(yōu)化為例。

0.載入DEAP庫(kù)

import random
from deap import base, creator, tools, algorithms

由于并不需要deap庫(kù)所有的功能,這里僅載入要用到的幾個(gè)模塊。

1. 創(chuàng)建適應(yīng)度函數(shù)

def evaluate(individual):
    ans = 0
    for i in range(len(individual)):
        ans += (individual[i] << i)
    return ((ans - 5) ** 2, -ans ** 2 + ans * 4 + 4)

因?yàn)檫m應(yīng)度默認(rèn)是一個(gè)元組,這里選擇返回一個(gè)元組。而每個(gè)整數(shù)采用二進(jìn)制存儲(chǔ),則是因?yàn)樵诤竺娴幕蚪粨Q中,要求兩個(gè)基因是列表,整數(shù)無(wú)法進(jìn)行交換操作。

2. 創(chuàng)建個(gè)體,種群

def init_individual(icls):
    content = [toolbox.attr_int() for _ in range(5)]
    individual = icls(content)
    individual.fitness.values = (0.0, 0.0) #初始化適應(yīng)度
    return individual
creator.create("FitnessMulti", base.Fitness, weights=(1.0, 1.0)) #創(chuàng)建適應(yīng)度
creator.create("Individual", list, fitness=creator.FitnessMulti) #創(chuàng)建個(gè)體類,個(gè)體為一個(gè)列表,并將適應(yīng)度作為其中的一個(gè)屬性
toolbox = base.Toolbox()
toolbox.register("attr_int", random.randint, 0, 1) #隨即生成0或1作為二進(jìn)制的每一位
toolbox.register("individual", init_individual, creator.Individual)#注冊(cè)個(gè)體生成函數(shù)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)#注冊(cè)種群生成函數(shù),生成種群為一個(gè)列表

此處第六行weights是適應(yīng)度,庫(kù)默認(rèn)為一個(gè)元組。因?yàn)榇舜闻e例是雙函數(shù)得到多目標(biāo)優(yōu)化,因此元組有兩個(gè)元素,每個(gè)元素的絕對(duì)值表示該維函數(shù)的權(quán)重,正負(fù)則表示是最大化還是最小化;為正,則表示目的是使該維元素最大化。

各個(gè)函數(shù)介紹

creator.creat基本用法

在 DEAP 庫(kù)中,creator.create 是一個(gè)非常重要的函數(shù),用于動(dòng)態(tài)創(chuàng)建新的類型。這些類型通常用于定義個(gè)體的表示方式(如染色體)和適應(yīng)度函數(shù)。creator.create 的靈活性使得 DEAP 能夠適應(yīng)各種不同的進(jìn)化算法需求。

creator.create(name, base, **kwargs)

參數(shù)說(shuō)明:

參數(shù)名類型說(shuō)明
name字符串新類型的名稱 
basepython內(nèi)置類或自定義類用于生成每個(gè)對(duì)象的函數(shù)(例如生成隨機(jī)個(gè)體的函數(shù))
**kwargs視情況而定額外的屬性,通常用于添加適應(yīng)度函數(shù)或其他自定義屬性 

toolbox.register基本用法

toolbox.register 用于將函數(shù)或操作注冊(cè)到 toolbox 對(duì)象中,方便在算法中調(diào)用。通常用于注冊(cè)個(gè)體生成、交叉、變異、選擇等操作。如所給代碼中,注冊(cè)后individual和population就是可以直接調(diào)用的函數(shù)。

toolbox.register(alias, method, *args, **kargs)

參數(shù)說(shuō)明:

參數(shù)名類型說(shuō)明
lias類型這是你為操作定義的名稱,后續(xù)可以通過(guò) toolbox.alias 調(diào)用該操作
method可調(diào)用對(duì)象這是實(shí)際執(zhí)行操作的函數(shù)或方法
*args可變位置參數(shù)如果 method 需要若干個(gè)參數(shù),可以通過(guò) *args 傳遞
**kargs可變關(guān)鍵字參數(shù)如果 method 需要關(guān)鍵字參數(shù),可以通過(guò) **kargs 傳遞

以原代碼中的為例

toolbox.register("individual", init_individual, creator.Individual)

我們注冊(cè)了一個(gè)名為individual的函數(shù),后續(xù)可通過(guò)toolbox.individual()調(diào)用,函數(shù)實(shí)際上執(zhí)行的是init_individual函數(shù)的內(nèi)容,creator.Individual是之前創(chuàng)造的個(gè)體類,作為參數(shù)傳入init_individual。

tools.initRepeat基本用法

在 DEAP 庫(kù)中,tools.initRepeat 是一個(gè)用于生成重復(fù)結(jié)構(gòu)的工具函數(shù)。它通常用于初始化個(gè)體或種群,生成包含重復(fù)元素的列表或其他數(shù)據(jù)結(jié)構(gòu)。以下是 tools.initRepeat 的詳細(xì)參數(shù)及其用法:

deap.tools.initRepeat(container, func, n)

參數(shù)說(shuō)明:

參數(shù)名類型說(shuō)明
container類型用于存儲(chǔ)生成對(duì)象的容器類型(例如 list、set 等)
func可調(diào)用對(duì)象用于生成每個(gè)對(duì)象的函數(shù)(例如生成隨機(jī)個(gè)體的函數(shù))
n整數(shù)需要生成的對(duì)象數(shù)量(例如種群大?。?/td>

實(shí)際上是執(zhí)行func函數(shù)n次,并將其存入container類型中。

以原代碼中的為例

toolbox.register("population", tools.initRepeat, list, toolbox.individual)

我們注冊(cè)了一個(gè)名為population的函數(shù)函數(shù),實(shí)際上執(zhí)行的是tools.initRepeat函數(shù)的內(nèi)容,list表明生成的對(duì)象,也就是種群,是一個(gè)列表,作為參數(shù)傳入tools.initRepeat,toolbox.individual是initRepeat重復(fù)執(zhí)行的內(nèi)容。注意到,此處并未寫出重復(fù)執(zhí)行次數(shù)n。這樣我們?cè)诤罄m(xù)的種群生成中就可以自由選擇生成種群的大小。

同時(shí),因?yàn)榇死覀兊膫€(gè)體是一個(gè)整數(shù),也就是一個(gè)五個(gè)元素的列表。但在某些情況下,我們的個(gè)體未必是一個(gè)元素,這時(shí),生成個(gè)體的函數(shù)也可以通過(guò)同樣的方法實(shí)現(xiàn)。例如:我可以定義一個(gè)個(gè)體是由五個(gè)列表構(gòu)成,每個(gè)列表有五個(gè)元素(0或1)。toolbox.individual可以如此注冊(cè):

toolbox.register("individual", tools.initRepeat, list, init_individual, creator.Individual, n = 5)

注意: 此處的注冊(cè)函數(shù)有誤,因?yàn)榇朔N寫法會(huì)導(dǎo)致creator.Individual被視作tools.initRepeat的第三個(gè)參數(shù)也就是重復(fù)次數(shù),而不會(huì)被視作init_individual的參數(shù)。因此init_individual應(yīng)使用匿名函數(shù)形式,以避免這種情況。這里沒做修改。

3. 創(chuàng)建其他需要的參數(shù)和函數(shù)

toolbox.register("evaluate", evaluate) #注冊(cè)適應(yīng)度函數(shù)
toolbox.register("mate", tools.cxTwoPoint) #采用兩點(diǎn)交叉方法
toolbox.register("mutate", tools.mutFlipBit, indpb=0.1) #采用位翻轉(zhuǎn)變異發(fā),每個(gè)基因變異概率0.1
toolbox.register("select", tools.selNSGA2)  # 因?yàn)槭嵌嗄繕?biāo)優(yōu)化問(wèn)題,使用 NSGA-II 選擇機(jī)制
population_size = 50 # 種群規(guī)模
generations = 40 # 繁殖代數(shù)
crossover_prob = 0.9 # 交叉概率
mutation_prob = 0.2# 個(gè)體變異概率
population = toolbox.population(n = population_size) #生成規(guī)模為50的種群

在這個(gè)過(guò)程中,基因交叉,變異,選擇機(jī)制都有很多,各位讀者可以根據(jù)需求自由選擇。

4.執(zhí)行遺傳算法

for gen in range(generations):
    offspring = algorithms.varAnd(population, toolbox, cxpb = crossover_prob, mutpb = mutation_prob)
    fits = map(toolbox.evaluate, offspring)
    for fit, ind in zip(fits, offspring):
        ind.fitness.values = fit
    population = toolbox.select(offspring + population, k = population_size)

algorithms.varAnd基本用法

algorithms.varAnd(population, toolbox, cxpb, mutpb)
參數(shù)名類型說(shuō)明
population注冊(cè)的種群類當(dāng)前種群。
toolboxToolbox 對(duì)象包含注冊(cè)的交叉、變異和選擇操作。
cxpb浮點(diǎn)數(shù)表示兩個(gè)個(gè)體進(jìn)行交叉的概率。
mutpb浮點(diǎn)數(shù)表示個(gè)體發(fā)生變異的概率。

varAnd 會(huì)從 toolbox 中調(diào)用注冊(cè)的函數(shù);toolbox.mate:交叉操作;toolbox.mutate:變異操作。

之后如有需要,可以輸出最后的種群,也可結(jié)合matplotlib繪制圖表。

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

相關(guān)文章

  • Python實(shí)現(xiàn)簡(jiǎn)易計(jì)算器的示例代碼

    Python實(shí)現(xiàn)簡(jiǎn)易計(jì)算器的示例代碼

    Tkinter作為 Python GUI 開發(fā)工具之一,它具有 GUI 軟件包的必備的常用功能。本文就將利用Tkinter編寫簡(jiǎn)易的計(jì)算器,感興趣的可以了解一下
    2022-11-11
  • python中subprocess批量執(zhí)行l(wèi)inux命令

    python中subprocess批量執(zhí)行l(wèi)inux命令

    本篇文章給大家詳細(xì)講述了python中使用subprocess批量執(zhí)行l(wèi)inux命令的方法,有興趣的朋友參考學(xué)習(xí)下。
    2018-04-04
  • 通過(guò)實(shí)例學(xué)習(xí)Python Excel操作

    通過(guò)實(shí)例學(xué)習(xí)Python Excel操作

    這篇文章主要介紹了通過(guò)實(shí)例學(xué)習(xí)Python Excel操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 詳談Python基礎(chǔ)之內(nèi)置函數(shù)和遞歸

    詳談Python基礎(chǔ)之內(nèi)置函數(shù)和遞歸

    下面小編就為大家?guī)?lái)一篇Python基礎(chǔ)之內(nèi)置函數(shù)和遞歸。小編覺得挺不錯(cuò)的?,F(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • Python干貨實(shí)戰(zhàn)之逆向登錄世界上最大的游戲平臺(tái)Stream

    Python干貨實(shí)戰(zhàn)之逆向登錄世界上最大的游戲平臺(tái)Stream

    有些網(wǎng)頁(yè)中的數(shù)據(jù)進(jìn)行了算法加密 這些算法代碼是JavaScript 加密的地方就是在js文件里,我們需要破解這些算法加密 就需要了解這加密的過(guò)程 獲取加密過(guò)程中的代碼 然后進(jìn)行后續(xù)的反反爬蟲操作
    2021-10-10
  • python實(shí)現(xiàn)人像動(dòng)漫化的示例代碼

    python實(shí)現(xiàn)人像動(dòng)漫化的示例代碼

    這篇文章主要介紹了python實(shí)現(xiàn)人像動(dòng)漫化的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 使用pytorch提取卷積神經(jīng)網(wǎng)絡(luò)的特征圖可視化

    使用pytorch提取卷積神經(jīng)網(wǎng)絡(luò)的特征圖可視化

    這篇文章主要給大家介紹了關(guān)于使用pytorch提取卷積神經(jīng)網(wǎng)絡(luò)的特征圖可視化的相關(guān)資料,文中給出了詳細(xì)的思路以及示例代碼,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-03-03
  • Python中map和列表推導(dǎo)效率比較實(shí)例分析

    Python中map和列表推導(dǎo)效率比較實(shí)例分析

    這篇文章主要介紹了Python中map和列表推導(dǎo)效率比較,實(shí)例分析了Python中的map與列表的推導(dǎo)效率,需要的朋友可以參考下
    2015-06-06
  • 如何使用Python編寫測(cè)試腳本

    如何使用Python編寫測(cè)試腳本

    這篇文章主要為大家詳細(xì)介紹了Python如何通過(guò)PyCAN和CANard庫(kù)實(shí)現(xiàn)編寫測(cè)試腳本,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • 全面解析Python中的self技巧

    全面解析Python中的self技巧

    在Python中,類的方法定義時(shí)通常會(huì)包含一個(gè)名為?self?的參數(shù),它表示對(duì)象實(shí)例本身,下面我們就來(lái)了解一下self的相關(guān)應(yīng)用技巧,需要的可以參考下
    2024-01-01

最新評(píng)論