中文字幕 日本 在线 高清,久久精品国产99精品国,超碰人人香蕉,一区二区三区无码高清视频

人工蜂群(ABC)算法的群體智能優(yōu)化問(wèn)題方法(Python完整實(shí)現(xiàn))(人工蜂群算法是群智能優(yōu)化算法嗎)

人工蜂群(ABC)算法的群體智能優(yōu)化問(wèn)題方法(Python完整實(shí)現(xiàn))(人工蜂群算法是群智能優(yōu)化算法嗎)
人工蜂群(ABC)算法的群體智能優(yōu)化問(wèn)題方法(Python完整實(shí)現(xiàn))(人工蜂群算法是群智能優(yōu)化算法嗎)

群智能(SI)是計(jì)算智能(CI)的一個(gè)子領(lǐng)域,關(guān)注生物啟發(fā)式多智能體智能系統(tǒng)的發(fā)展。SI使用鳥(niǎo)群和魚(yú)群等天然代理的集體行為作為創(chuàng)建這些算法的靈感。

這些算法已被證明在解決實(shí)際問(wèn)題方面非常有效。一些可以使用SI算法解決的任務(wù)是聚類(lèi),行星映射,控制納米機(jī)器人和數(shù)據(jù)挖掘中的各種問(wèn)題,如特征選擇和分類(lèi)。

在數(shù)學(xué)上講,要使用計(jì)算智能算法解決現(xiàn)實(shí)世界中的優(yōu)化問(wèn)題,我們需要一個(gè)數(shù)學(xué)表示我們的問(wèn)題,這種表示稱(chēng)為目標(biāo)函數(shù),它是描述問(wèn)題和所有決策變量的數(shù)學(xué)規(guī)則。

簡(jiǎn)而言之,優(yōu)化問(wèn)題由搜索空間定義,搜索空間是我們將尋找解決方案的區(qū)域,一組決策變量,其中包含影響我們問(wèn)題的所有參數(shù),當(dāng)然還有目標(biāo)函數(shù),其中的數(shù)學(xué)規(guī)則這個(gè)問(wèn)題也給了我們一個(gè)候選解決方案的良好測(cè)量。

優(yōu)化問(wèn)題的目標(biāo)是從所有可行的解決方案中找到最佳解決方案。這通常意味著我們想要最小化或最大化目標(biāo)函數(shù)。換句話(huà)說(shuō),我們希望找到最小化我們的目標(biāo)函數(shù)值(也稱(chēng)為適應(yīng)值)的輸入決策變量集合。

人工蜂群算法

人工蜜蜂群體(ABC)算法是一種模擬蜜蜂群體行為的優(yōu)化算法,并于2005年首次提出由Karaboga提出進(jìn)行實(shí)參優(yōu)化。

在這個(gè)數(shù)學(xué)模型中,我們的蜜蜂群體由三種蜜蜂組成:工蜂,它們將在特定食物來(lái)源的蜂箱上工作。圍觀的蜜蜂會(huì)在員工身上進(jìn)行巡邏,以驗(yàn)證某一特定食物來(lái)源是否物有所值,而偵察蜂則會(huì)尋找新的食物來(lái)源。

在ABC算法中,食物源被定義為搜索空間中的一個(gè)位置(優(yōu)化問(wèn)題的候選解決方案),最初的食物源數(shù)等于蜂巢上的蜜蜂數(shù)量。食物來(lái)源的質(zhì)量是由該位置的目標(biāo)函數(shù)值(適應(yīng)值)來(lái)定義的。

來(lái)自蜜蜂的新興智能行為可以概括為幾個(gè)步驟:

  • 蜜蜂開(kāi)始隨機(jī)探索尋找良好食物來(lái)源的環(huán)境(fitness value)。
  • 找到食物來(lái)源后,蜜蜂成為員工蜜蜂,并開(kāi)始在發(fā)現(xiàn)的來(lái)源提取食物。
  • 員工蜜蜂用花蜜返回蜂巢并卸載花蜜。卸下花蜜后,她可以直接返回她發(fā)現(xiàn)的來(lái)源地點(diǎn),或者通過(guò)在舞池上跳舞來(lái)分享她的來(lái)源地點(diǎn)的信息。
  • 如果食物來(lái)源枯竭,員工蜜蜂就會(huì)成為一名偵察員并開(kāi)始隨機(jī)搜索新的食物來(lái)源。
  • 旁觀者蜜蜂在蜂巢內(nèi)等待觀察雇員蜜蜂的食物來(lái)源收集,并從更有利可圖的來(lái)源中選擇一個(gè)來(lái)源。
  • 食物來(lái)源的選擇與來(lái)源的質(zhì)量(適應(yīng)值)成正比。

盡管我們描述了三種類(lèi)型的蜜蜂,但在實(shí)施層面,我們意識(shí)到只有兩種類(lèi)型,即員工和旁觀者。偵察蜂實(shí)際上是一種可以由員工和旁觀者蜜蜂執(zhí)行的探索行為。

在本文中,我們將使用python,因?yàn)樗跀?shù)值計(jì)算中越來(lái)越顯示出高效性,并且更容易實(shí)現(xiàn)一組客觀基準(zhǔn)以重用我們的群智能算法。

import numpy as np

from scipy import optimize

from deap.benchmarks import schwefel

from abc import ABCMeta

from abc import abstractmethod

from six import add_metaclass

@add_metaclass(ABCMeta)

class ObjectiveFunction(object):

def __init__(self, name, dim, minf, maxf):

self.name = name

self.dim = dim

self.minf = minf

self.maxf = maxf

def sample(self):

return np.random.uniform(low=self.minf, high=self.maxf, size=self.dim)

def custom_sample(self):

return np.repeat(self.minf, repeats=self.dim)

np.random.uniform(low=0, high=1, size=self.dim) *

np.repeat(self.maxf – self.minf, repeats=self.dim)

@abstractmethod

def evaluate(self, x):

pass

class Sphere(ObjectiveFunction):

def __init__(self, dim):

super(Sphere, self).__init__(\’Sphere\’, dim, -100.0, 100.0)

def evaluate(self, x):

return sum(np.power(x, 2))

class Rosenbrock(ObjectiveFunction):

def __init__(self, dim):

super(Rosenbrock, self).__init__(\’Rosenbrock\’, dim, -30.0, 30.0)

def evaluate(self, x):

return optimize.rosen(x)

class Rastrigin(ObjectiveFunction):

def __init__(self, dim):

super(Rastrigin, self).__init__(\’Rastrigin\’, dim, -5.12, 5.12)

def evaluate(self, x):

return 10 * len(x)

np.sum(np.power(x, 2) – 10 * np.cos(2 * np.pi * np.array(x)))

class Schwefel(ObjectiveFunction):

def __init__(self, dim):

super(Schwefel, self).__init__(\’Schwefel\’, dim, -500.0, 500.0)

def evaluate(self, x):

return schwefel(x)[0]

你可以在這里下載deap軟件包(https://deap.readthedocs.io/en/master/)。

人造蜂

為了開(kāi)始我們的算法的開(kāi)發(fā),我們必須找到一種方法在python代碼上表示我們的Bee代理。任何蜜蜂都需要有三個(gè)主要的通用功能。第一個(gè)是由于探索行為,一只蜜蜂離開(kāi)我們的決策邊界,它需要有能力返回蜂巢。第二個(gè)是能夠更新蜜蜂工作的實(shí)際食物來(lái)源的狀態(tài),并評(píng)估新鄰里地區(qū)是否是更好的食物來(lái)源。最后一個(gè)意識(shí)到何時(shí)食物來(lái)源枯竭,現(xiàn)在蜜蜂必須尋找一些新的食物來(lái)源。

考慮到這一點(diǎn),我們可以在python中實(shí)現(xiàn)類(lèi)ArtificialBee,如下所示:

import numpy as np

from copy import deepcopy

from abc import ABCMeta

from six import add_metaclass

@add_metaclass(ABCMeta)

class ArtificialBee(object):

TRIAL_INITIAL_DEFAULT_VALUE = 0

INITIAL_DEFAULT_PROBABILITY = 0.0

def __init__(self, obj_function):

self.pos = obj_function.custom_sample()

self.obj_function = obj_function

self.minf = obj_function.minf

self.maxf = obj_function.maxf

self.fitness = obj_function.evaluate(self.pos)

self.trial = ArtificialBee.TRIAL_INITIAL_DEFAULT_VALUE

self.prob = ArtificialBee.INITIAL_DEFAULT_PROBABILITY

def evaluate_boundaries(self, pos):

if (pos < self.minf).any() or (pos > self.maxf).any():

pos[pos > self.maxf] = self.maxf

pos[pos < self.minf] = self.minf

return pos

def update_bee(self, pos, fitness):

if fitness <= self.fitness:

self.pos = pos

self.fitness = fitness

self.trial = 0

else:

self.trial = 1

def reset_bee(self, max_trials):

if self.trial >= max_trials:

self.__reset_bee()

def __reset_bee(self):

self.pos = self.obj_function.custom_sample()

self.fitness = self.obj_function.evaluate(self.pos)

self.trial = ArtificialBee.TRIAL_INITIAL_DEFAULT_VALUE

self.prob = ArtificialBee.INITIAL_DEFAULT_PROBABILITY

員工蜜蜂

員工蜜蜂的主要行為是從員工正在工作的食物來(lái)源中提取食物。在實(shí)施層面,這種行為可以被看作是靠近員工蜜蜂的位置產(chǎn)生一個(gè)新的位置,并評(píng)估這個(gè)新位置是否有更多的食物。員工蜜蜂總是會(huì)記住迄今為止取得的最佳食物來(lái)源地位,直到它耗盡為止。

該EmployeeBee類(lèi)可以實(shí)現(xiàn)如下:

class EmployeeBee(ArtificialBee):

def explore(self, max_trials):

if self.trial <= max_trials:

component = np.random.choice(self.pos)

phi = np.random.uniform(low=-1, high=1, size=len(self.pos))

n_pos = self.pos (self.pos – component) * phi

n_pos = self.evaluate_boundaries(n_pos)

n_fitness = self.obj_function.evaluate(n_pos)

self.update_bee(n_pos, n_fitness)

def get_fitness(self):

return 1 / (1 self.fitness) if self.fitness >= 0 else 1 np.abs(self.fitness)

def compute_prob(self, max_fitness):

self.prob = self.get_fitness() / max_fitness

旁觀者蜜蜂

旁觀者蜜蜂將巡視員工蜜蜂的工作。會(huì)飛過(guò)蜂房,檢查他們工作的進(jìn)展情況,并評(píng)估哪些員工在收集食物方面更加成功。

旁觀者的蜜蜂總是以最優(yōu)秀的員工為目標(biāo),采用概率方法作為“交匯點(diǎn)”,其他蜜蜂應(yīng)該來(lái)到這個(gè)成功的位置,希望能提取更多的食物。

在實(shí)施層面上,旁觀者蜜蜂將通過(guò)最優(yōu)秀的員工進(jìn)行調(diào)查并嘗試改善食物來(lái)源。經(jīng)過(guò)特定次數(shù)的試驗(yàn)后,旁觀者蜜蜂會(huì)告訴蜂房這種食物來(lái)源已耗盡,必須丟棄。

該OnlookerBee類(lèi)可以實(shí)現(xiàn)如下:

class OnLookerBee(ArtificialBee):

def onlook(self, best_food_sources, max_trials):

candidate = np.random.choice(best_food_sources)

self.__exploit(candidate.pos, candidate.fitness, max_trials)

def __exploit(self, candidate, fitness, max_trials):

if self.trial <= max_trials:

component = np.random.choice(candidate)

phi = np.random.uniform(low=-1, high=1, size=len(candidate))

n_pos = candidate (candidate – component) * phi

n_pos = self.evaluate_boundaries(n_pos)

n_fitness = self.obj_function.evaluate(n_pos)

if n_fitness <= fitness:

self.pos = n_pos

self.fitness = n_fitness

self.trial = 0

else:

self.trial = 1

完全人工蜂群算法

在實(shí)現(xiàn)將要使用的主要類(lèi)型的代理之后,它有時(shí)間用一些python代碼實(shí)際實(shí)現(xiàn)前面描述的所有步驟。

注意我們已經(jīng)在分離的方法中實(shí)現(xiàn)了我們算法的每一步。首先我們重置我們的ABC算法的內(nèi)部參數(shù),并將我們的員工蜜蜂和旁觀者蜜蜂初始化為隨機(jī)位置。一個(gè)在現(xiàn)實(shí)世界問(wèn)題中取得成功的默認(rèn)策略是將整個(gè)蜂房的一半初始化為員工蜜蜂,而將另一半初始化為旁觀者蜜蜂。

之后,我們開(kāi)始派員工蜜蜂在他們各自的最初食物來(lái)源收集食物,并且總是在周?chē)鷮ふ腋玫氖澄?。一旦員工蜜蜂階段完成,我們會(huì)派出旁觀者蜜蜂來(lái)巡視他們的工作,并評(píng)估每種食物來(lái)源的食物提取效果。最后,是時(shí)候檢查一些食物來(lái)源是否已經(jīng)耗盡,此時(shí)無(wú)論是員工還是旁觀者都可以成為偵察蜂,并開(kāi)始尋找新食物來(lái)源的探索過(guò)程。

完整的ABC算法可以實(shí)現(xiàn)如下:

class ABC(object):

def __init__(self, obj_function, colony_size=30, n_iter=5000, max_trials=100):

self.colony_size = colony_size

self.obj_function = obj_function

self.n_iter = n_iter

self.max_trials = max_trials

self.optimal_solution = None

self.optimality_tracking = []

def __reset_algorithm(self):

self.optimal_solution = None

self.optimality_tracking = []

def __update_optimality_tracking(self):

self.optimality_tracking.append(self.optimal_solution.fitness)

def __update_optimal_solution(self):

n_optimal_solution =

min(self.onlokeer_bees self.employee_bees,

key=lambda bee: bee.fitness)

if not self.optimal_solution:

self.optimal_solution = deepcopy(n_optimal_solution)

else:

if n_optimal_solution.fitness < self.optimal_solution.fitness:

self.optimal_solution = deepcopy(n_optimal_solution)

def __initialize_employees(self):

self.employee_bees = []

for itr in range(self.colony_size // 2):

self.employee_bees.append(EmployeeBee(self.obj_function))

def __initialize_onlookers(self):

self.onlokeer_bees = []

for itr in range(self.colony_size // 2):

self.onlokeer_bees.append(OnLookerBee(self.obj_function))

def __employee_bees_phase(self):

map(lambda bee: bee.explore(self.max_trials), self.employee_bees)

def __calculate_probabilities(self):

sum_fitness = sum(map(lambda bee: bee.get_fitness(), self.employee_bees))

map(lambda bee: bee.compute_prob(sum_fitness), self.employee_bees)

def __select_best_food_sources(self):

self.best_food_sources =

filter(lambda bee: bee.prob > np.random.uniform(low=0, high=1),

self.employee_bees)

while not self.best_food_sources:

self.best_food_sources =

filter(lambda bee: bee.prob > np.random.uniform(low=0, high=1),

self.employee_bees)

def __onlooker_bees_phase(self):

map(lambda bee: bee.onlook(self.best_food_sources, self.max_trials),

self.onlokeer_bees)

def __scout_bees_phase(self):

map(lambda bee: bee.reset_bee(self.max_trials),

self.onlokeer_bees self.employee_bees)

def optimize(self):

self.__reset_algorithm()

self.__initialize_employees()

self.__initialize_onlookers()

for itr in range(self.n_iter):

self.__employee_bees_phase()

self.__update_optimal_solution()

self.__calculate_probabilities()

self.__select_best_food_sources()

self.__onlooker_bees_phase()

self.__scout_bees_phase()

self.__update_optimal_solution()

self.__update_optimality_tracking()

print(\”iter: {} = cost: {}\”

.format(itr, \”.03e\” % self.optimal_solution.fitness))

Bechmark功能測(cè)試

SI算法優(yōu)于經(jīng)典和基于梯度的方法的優(yōu)點(diǎn)是能夠在非可微函數(shù)和多模函數(shù)上表現(xiàn)得非常好。

就優(yōu)化問(wèn)題而言,有幾個(gè)眾所周知的基準(zhǔn)函數(shù)用于評(píng)估優(yōu)化算法的性能。其中一些函數(shù)在我們的objective_function.py上實(shí)現(xiàn),其公式如下所示。

人工蜂群(ABC)算法的群體智能優(yōu)化問(wèn)題方法(Python完整實(shí)現(xiàn))(人工蜂群算法是群智能優(yōu)化算法嗎)

用于測(cè)量?jī)?yōu)化算法性能的一些對(duì)象函數(shù)列表

為了測(cè)試我們的框架并檢查我們的ABC算法是否按預(yù)期行事,我們可以實(shí)現(xiàn)以下測(cè)試代碼并繪制迭代中的適應(yīng)值,并評(píng)估最小化過(guò)程對(duì)每個(gè)函數(shù)的執(zhí)行情況。

import numpy as np

import matplotlib.pyplot as plt

from algorithm.abc import ABC

from matplotlib.style import use

from objection_function import Rastrigin

from objection_function import Rosenbrock

from objection_function import Sphere

from objection_function import Schwefel

use(\’classic\’)

def get_objective(objective, dimension=30):

objectives = {\’Sphere\’: Sphere(dimension),

\’Rastrigin\’: Rastrigin(dimension),

\’Rosenbrock\’: Rosenbrock(dimension),

\’Schwefel\’: Schwefel(dimension)}

return objectives[objective]

def simulate(obj_function, colony_size=30, n_iter=5000,

max_trials=100, simulations=30):

itr = range(n_iter)

values = np.zeros(n_iter)

box_optimal = []

for _ in range(simulations):

optimizer = ABC(obj_function=get_objective(obj_function),

colony_size=colony_size, n_iter=n_iter,

max_trials=max_trials)

optimizer.optimize()

values = np.array(optimizer.optimality_tracking)

box_optimal.append(optimizer.optimal_solution.fitness)

print(optimizer.optimal_solution.pos)

values /= simulations

plt.plot(itr, values, lw=0.5, label=obj_function)

plt.legend(loc=\’upper right\’)

def main():

plt.figure(figsize=(10, 7))

simulate(\’Rastrigin\’)

plt.ticklabel_format(axis=\’y\’, style=\’sci\’, scilimits=(-2, 2))

plt.xticks(rotation=45)

plt.show()

if __name__ == \’__main__\’:

main()

我們可以通過(guò)分析每個(gè)基準(zhǔn)函數(shù)的適應(yīng)度圖和迭代次數(shù)來(lái)檢查結(jié)果,還可以檢查optimizer.optimal_solution.pos的輸出結(jié)果,并檢查ABC是否具有非常好的近似值我們的基準(zhǔn)功能的最佳點(diǎn)。

人工蜂群(ABC)算法的群體智能優(yōu)化問(wèn)題方法(Python完整實(shí)現(xiàn))(人工蜂群算法是群智能優(yōu)化算法嗎)

看起來(lái)ABC在Sphere功能方面做得很好

人工蜂群(ABC)算法的群體智能優(yōu)化問(wèn)題方法(Python完整實(shí)現(xiàn))(人工蜂群算法是群智能優(yōu)化算法嗎)

它對(duì)Rosenbrock收斂得如此之快以至于你幾乎看不到該圖

人工蜂群(ABC)算法的群體智能優(yōu)化問(wèn)題方法(Python完整實(shí)現(xiàn))(人工蜂群算法是群智能優(yōu)化算法嗎)

Rastrigin功能也是一個(gè)很好的表現(xiàn)

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶(hù)自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。

(0)
上一篇 2024年3月29日 下午2:01
下一篇 2024年3月29日 下午2:15

相關(guān)推薦