Python使用DEAP庫實現(xiàn)簡單遺傳算法
DEAP(Distributed Evolutionary Algorithms in Python)是一個用于快速原型設計和實驗的進化計算框架。它支持多種進化算法,包括遺傳算法、遺傳編程、進化策略、粒子群優(yōu)化等。DEAP 的設計目標是靈活性和易用性,使得研究人員和開發(fā)者能夠輕松地實現(xiàn)和測試各種進化算法。
因本人主攻方向并不是Python甚至可以說之前對Python一竅不通,如有錯誤,還望各位讀者指正。
本篇也以講解用法為主,具體的類的繼承和原理并不涉及。
這里以求 f(x)=(x−5)2f(x)=(x−5)2 和 f(x)=−x2+4x+4f(x)=−x2+4x+4 在 [0,31][0,31] 上都盡可能大為目標的,多目標優(yōu)化為例。
0.載入DEAP庫
import random from deap import base, creator, tools, algorithms
由于并不需要deap庫所有的功能,這里僅載入要用到的幾個模塊。
1. 創(chuà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)
因為適應度默認是一個元組,這里選擇返回一個元組。而每個整數(shù)采用二進制存儲,則是因為在后面的基因交換中,要求兩個基因是列表,整數(shù)無法進行交換操作。
2. 創(chuàng)建個體,種群
def init_individual(icls): content = [toolbox.attr_int() for _ in range(5)] individual = icls(content) individual.fitness.values = (0.0, 0.0) #初始化適應度 return individual creator.create("FitnessMulti", base.Fitness, weights=(1.0, 1.0)) #創(chuàng)建適應度 creator.create("Individual", list, fitness=creator.FitnessMulti) #創(chuàng)建個體類,個體為一個列表,并將適應度作為其中的一個屬性 toolbox = base.Toolbox() toolbox.register("attr_int", random.randint, 0, 1) #隨即生成0或1作為二進制的每一位 toolbox.register("individual", init_individual, creator.Individual)#注冊個體生成函數(shù) toolbox.register("population", tools.initRepeat, list, toolbox.individual)#注冊種群生成函數(shù),生成種群為一個列表
此處第六行weights是適應度,庫默認為一個元組。因為此次舉例是雙函數(shù)得到多目標優(yōu)化,因此元組有兩個元素,每個元素的絕對值表示該維函數(shù)的權重,正負則表示是最大化還是最小化;為正,則表示目的是使該維元素最大化。
各個函數(shù)介紹
creator.creat基本用法
在 DEAP 庫中,creator.create 是一個非常重要的函數(shù),用于動態(tài)創(chuàng)建新的類型。這些類型通常用于定義個體的表示方式(如染色體)和適應度函數(shù)。creator.create 的靈活性使得 DEAP 能夠適應各種不同的進化算法需求。
creator.create(name, base, **kwargs)
參數(shù)說明:
參數(shù)名 | 類型 | 說明 |
---|---|---|
name | 字符串 | 新類型的名稱 |
base | python內(nèi)置類或自定義類 | 用于生成每個對象的函數(shù)(例如生成隨機個體的函數(shù)) |
**kwargs | 視情況而定 | 額外的屬性,通常用于添加適應度函數(shù)或其他自定義屬性 |
toolbox.register基本用法
toolbox.register 用于將函數(shù)或操作注冊到 toolbox 對象中,方便在算法中調用。通常用于注冊個體生成、交叉、變異、選擇等操作。如所給代碼中,注冊后individual和population就是可以直接調用的函數(shù)。
toolbox.register(alias, method, *args, **kargs)
參數(shù)說明:
參數(shù)名 | 類型 | 說明 |
---|---|---|
lias | 類型 | 這是你為操作定義的名稱,后續(xù)可以通過 toolbox.alias 調用該操作 |
method | 可調用對象 | 這是實際執(zhí)行操作的函數(shù)或方法 |
*args | 可變位置參數(shù) | 如果 method 需要若干個參數(shù),可以通過 *args 傳遞 |
**kargs | 可變關鍵字參數(shù) | 如果 method 需要關鍵字參數(shù),可以通過 **kargs 傳遞 |
以原代碼中的為例
toolbox.register("individual", init_individual, creator.Individual)
我們注冊了一個名為individual的函數(shù),后續(xù)可通過toolbox.individual()調用,函數(shù)實際上執(zhí)行的是init_individual函數(shù)的內(nèi)容,creator.Individual是之前創(chuàng)造的個體類,作為參數(shù)傳入init_individual。
tools.initRepeat基本用法
在 DEAP 庫中,tools.initRepeat 是一個用于生成重復結構的工具函數(shù)。它通常用于初始化個體或種群,生成包含重復元素的列表或其他數(shù)據(jù)結構。以下是 tools.initRepeat 的詳細參數(shù)及其用法:
deap.tools.initRepeat(container, func, n)
參數(shù)說明:
參數(shù)名 | 類型 | 說明 |
---|---|---|
container | 類型 | 用于存儲生成對象的容器類型(例如 list、set 等) |
func | 可調用對象 | 用于生成每個對象的函數(shù)(例如生成隨機個體的函數(shù)) |
n | 整數(shù) | 需要生成的對象數(shù)量(例如種群大?。?/td> |
實際上是執(zhí)行func函數(shù)n次,并將其存入container類型中。
以原代碼中的為例
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
我們注冊了一個名為population的函數(shù)函數(shù),實際上執(zhí)行的是tools.initRepeat函數(shù)的內(nèi)容,list表明生成的對象,也就是種群,是一個列表,作為參數(shù)傳入tools.initRepeat,toolbox.individual是initRepeat重復執(zhí)行的內(nèi)容。注意到,此處并未寫出重復執(zhí)行次數(shù)n。這樣我們在后續(xù)的種群生成中就可以自由選擇生成種群的大小。
同時,因為此例我們的個體是一個整數(shù),也就是一個五個元素的列表。但在某些情況下,我們的個體未必是一個元素,這時,生成個體的函數(shù)也可以通過同樣的方法實現(xiàn)。例如:我可以定義一個個體是由五個列表構成,每個列表有五個元素(0或1)。toolbox.individual可以如此注冊:
toolbox.register("individual", tools.initRepeat, list, init_individual, creator.Individual, n = 5)
注意: 此處的注冊函數(shù)有誤,因為此種寫法會導致creator.Individual被視作tools.initRepeat的第三個參數(shù)也就是重復次數(shù),而不會被視作init_individual的參數(shù)。因此init_individual應使用匿名函數(shù)形式,以避免這種情況。這里沒做修改。
3. 創(chuàng)建其他需要的參數(shù)和函數(shù)
toolbox.register("evaluate", evaluate) #注冊適應度函數(shù) toolbox.register("mate", tools.cxTwoPoint) #采用兩點交叉方法 toolbox.register("mutate", tools.mutFlipBit, indpb=0.1) #采用位翻轉變異發(fā),每個基因變異概率0.1 toolbox.register("select", tools.selNSGA2) # 因為是多目標優(yōu)化問題,使用 NSGA-II 選擇機制 population_size = 50 # 種群規(guī)模 generations = 40 # 繁殖代數(shù) crossover_prob = 0.9 # 交叉概率 mutation_prob = 0.2# 個體變異概率 population = toolbox.population(n = population_size) #生成規(guī)模為50的種群
在這個過程中,基因交叉,變異,選擇機制都有很多,各位讀者可以根據(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ù)名 | 類型 | 說明 |
---|---|---|
population | 注冊的種群類 | 當前種群。 |
toolbox | Toolbox 對象 | 包含注冊的交叉、變異和選擇操作。 |
cxpb | 浮點數(shù) | 表示兩個個體進行交叉的概率。 |
mutpb | 浮點數(shù) | 表示個體發(fā)生變異的概率。 |
varAnd 會從 toolbox 中調用注冊的函數(shù);toolbox.mate:交叉操作;toolbox.mutate:變異操作。
之后如有需要,可以輸出最后的種群,也可結合matplotlib繪制圖表。
到此這篇關于Python使用DEAP庫實現(xiàn)簡單遺傳算法的文章就介紹到這了,更多相關Python DEAP遺傳算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python中subprocess批量執(zhí)行l(wèi)inux命令
本篇文章給大家詳細講述了python中使用subprocess批量執(zhí)行l(wèi)inux命令的方法,有興趣的朋友參考學習下。2018-04-04Python干貨實戰(zhàn)之逆向登錄世界上最大的游戲平臺Stream
有些網(wǎng)頁中的數(shù)據(jù)進行了算法加密 這些算法代碼是JavaScript 加密的地方就是在js文件里,我們需要破解這些算法加密 就需要了解這加密的過程 獲取加密過程中的代碼 然后進行后續(xù)的反反爬蟲操作2021-10-10使用pytorch提取卷積神經(jīng)網(wǎng)絡的特征圖可視化
這篇文章主要給大家介紹了關于使用pytorch提取卷積神經(jīng)網(wǎng)絡的特征圖可視化的相關資料,文中給出了詳細的思路以及示例代碼,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2022-03-03