最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

蜂群算法python案例

2023-06-19 07:41 作者:仿真資料吧  | 我要投稿

人工蜂群算法(Artificial Bee Colony,ABC)是一種優(yōu)化算法,可以用來解決函數(shù)最優(yōu)化問題。

實(shí)現(xiàn)步驟如下:

1. 初始化參數(shù):包括搜索空間的邊界、蜜蜂的數(shù)量、蜜蜂搜索鄰域的半徑等。

2. 初始化蜜蜂:隨機(jī)生成蜜蜂的初始位置和狀態(tài)(例如,找到一個(gè)更優(yōu)解或者沒有),并計(jì)算初始狀態(tài)的適應(yīng)度值。

3. 篩選蜜蜂:按照適應(yīng)度值對蜜蜂進(jìn)行排序,選擇適應(yīng)度最好的一些蜜蜂作為“精英蜜蜂”,其余的蜜蜂為普通蜜蜂。

4. 精英蜜蜂搜索:對于每一只精英蜜蜂,利用搜索鄰域內(nèi)的普通蜜蜂來更新位置和狀態(tài),如果新的位置得到了更好的適應(yīng)度值,就更新當(dāng)前的最優(yōu)位置。

5. 觀察蜜蜂搜索:對于每一只普通蜜蜂,選擇一個(gè)隨機(jī)的精英蜜蜂,并在其搜索鄰域中隨機(jī)選擇一個(gè)位置,計(jì)算該位置的適應(yīng)度值,如果比當(dāng)前位置更優(yōu),則更新位置和狀態(tài)。

6. 跟隨蜜蜂搜索:對于每一只跟隨蜜蜂,選擇另外兩只隨機(jī)的蜜蜂,并在其搜索鄰域中隨機(jī)選擇一個(gè)位置,計(jì)算該位置的適應(yīng)度值,如果比當(dāng)前位置更優(yōu),則更新位置和狀態(tài)。

7. 判斷終止條件:如果滿足終止條件(例如,達(dá)到最大迭代次數(shù)或者找到了最優(yōu)解),則停止搜索,否則回到步驟3。

實(shí)現(xiàn)人工蜂群算法時(shí),需要注意設(shè)置合適的參數(shù)和鄰域半徑,以及選擇合適的適應(yīng)度函數(shù)。此外,還需要注意避免算法陷入局部最優(yōu)解的情況,可以通過增加搜索空間、調(diào)整鄰域半徑等方法來提高搜索效果。

python案例代碼如下:

#python3.8.16
# -*- coding: utf-8 -*-
"""

"""
import numpy as np
# 蜂群算法參數(shù)
n_bees = 10 ?# 蜜蜂數(shù)量
n_ep = 100 ?# 迭代次數(shù)
limit = 70 ?# 每個(gè)搜索點(diǎn)周圍取樣的次數(shù)上限
r = 10 ?# 探索半徑
# 問題參數(shù)
bounds = [(0, 100), (0, 100)] ?# a、b的范圍
# 全局參數(shù)
k = 100
r = 1
sites = []
np.random.seed(10) ?# 設(shè)置全局隨機(jī)種子
# 約束條件函數(shù)
def constraint_func(x):
 ? ?a, b = x
 ? ?return 100- a - b
# 目標(biāo)函數(shù)
def obj_func(x):
 ? ?a, b = x
 ? ?return -a * b
# 適應(yīng)度函數(shù)
def fitness(x):
 ? ?penalty = 0
 ? ?if constraint_func(x) < 0:
 ? ? ? ?# penalty = abs(constraint_func(x))
 ? ? ? ?penalty = constraint_func(x)
 ? ?return obj_func(x) - k * penalty

# 蜂群算法
def fit_bee_hive(num_bees=20, num_sites=None, num_iterations=20, limit=100):
 ? ?global sites, k, r, bounds
 ? ?limit = limit
 ? ?if num_sites is None:
 ? ? ? ?num_sites = num_bees
 ? ?if num_sites > num_bees:
 ? ? ? ?num_sites = num_bees

 ? ?sites = [('employed', np.random.uniform(*bounds, size=2)) for i in range(num_bees)]
 ? ?best_x, best_obj_val = None, float('inf')

 ? ?for i in range(num_iterations):
 ? ? ? ?best_f = 0
 ? ? ? ?for j, (status, site) in enumerate(sites):
 ? ? ? ? ? ?if status == 'employed':
 ? ? ? ? ? ? ? ?neighbor_idx = np.random.choice(list(set(range(num_sites)) - {j}))
 ? ? ? ? ? ? ? ?neighbor_site = np.array(sites[neighbor_idx][1])
 ? ? ? ? ? ? ? ?neighbor_site_diff = neighbor_site - np.array(site)
 ? ? ? ? ? ? ? ?new_solution, new_f = explore_patch(np.array(site) + r * np.random.uniform(-1, 1, size=2) * neighbor_site_diff)

 ? ? ? ? ? ? ? ?if new_f < fitness(site):
 ? ? ? ? ? ? ? ? ? ?sites[j] = ('employed', new_solution)
 ? ? ? ? ? ? ? ?else:
 ? ? ? ? ? ? ? ? ? ?sites[j] = ('onlooker', site)

 ? ? ? ? ? ?elif status == 'onlooker':
 ? ? ? ? ? ? ? ?site_idx = select_site()
 ? ? ? ? ? ? ? ?site = sites[site_idx][1]
 ? ? ? ? ? ? ? ?new_solution, new_f = explore_patch(np.array(site) + r * np.random.uniform(-1, 1, size=2) * (np.array(site) - np.array(sites[j-1][1])))

 ? ? ? ? ? ? ? ?if new_f < fitness(site):
 ? ? ? ? ? ? ? ? ? ?sites[site_idx] = ('employed', new_solution)
 ? ? ? ? ? ? ? ? ? ?sites[j] = ('scout', np.random.uniform(*bounds, size=2))
 ? ? ? ? ? ? ? ?else:
 ? ? ? ? ? ? ? ? ? ?sites[j] = ('onlooker', site)

 ? ? ? ? ? ?elif status == 'scout':
 ? ? ? ? ? ? ? ?sites[j] = ('employed', np.random.uniform(*bounds, size=2))

 ? ? ? ?for status, site in sites:
 ? ? ? ? ? ?if fitness(site) < best_obj_val:
 ? ? ? ? ? ? ? ?best_x, best_obj_val = site, fitness(site)

 ? ? ? ?print('Iteration', i+1, ': Best objective value =', best_obj_val)

 ? ?return best_x, best_obj_val

# 探索新解的函數(shù)
def explore_patch(site):
 ? ?found_better = False
 ? ?best_solution = None
 ? ?best_f = 0
 ? ?for i in range(limit):
 ? ? ? ?new_x = site + r * np.random.uniform(-1, 1, size=2)
 ? ? ? ?new_x = np.clip(new_x, *np.array(bounds).T)
 ? ? ? ?new_f = fitness(new_x)
 ? ? ? ?if not found_better or new_f < best_f:
 ? ? ? ? ? ?best_solution = new_x
 ? ? ? ? ? ?best_f = new_f
 ? ? ? ? ? ?found_better = True
 ? ?return best_solution, best_f

# 選擇蜜蜂站點(diǎn)的函數(shù)
def select_site():
 ? ?fitness_values = np.array([fitness(site) for status, site in sites if status != 'scout'])
 ? ?probs = fitness_values / np.sum(fitness_values)
 ? ?return np.random.choice(np.arange(len(sites))[np.array([status != 'scout' for status, site in sites])], p=probs)

# 運(yùn)行蜂群算法
best_x, best_obj_val = fit_bee_hive(num_bees=n_bees, num_iterations=n_ep, limit=limit)
print('Best solution:', best_x)
print('Best objective value:', best_obj_val)

#運(yùn)行結(jié)果

#運(yùn)行結(jié)果

Iteration 93 : Best objective value = -2499.9970645285075 Iteration 94 : Best objective value = -2499.9970645285075 Iteration 95 : Best objective value = -2499.9970645285075 Iteration 96 : Best objective value = -2499.9970645285075 Iteration 97 : Best objective value = -2499.9970645285075 Iteration 98 : Best objective value = -2499.9970645285075 Iteration 99 : Best objective value = -2499.9970645285075 Iteration 100 : Best objective value = -2499.9970645285075 Best solution: [49.96560948 50.03435544] Best objective value: -2499.9970645285075


蜂群算法python案例的評論 (共 條)

分享到微博請遵守國家法律
汉中市| 宁国市| 富蕴县| 秦安县| 达日县| 桦甸市| 会宁县| 琼结县| 新竹县| 应城市| 辛集市| 武功县| 集贤县| 博乐市| 新邵县| 泽州县| 无极县| 淮滨县| 桦南县| 封开县| 扎鲁特旗| 屏南县| 枣强县| 齐齐哈尔市| 延庆县| 衡南县| 梓潼县| 天峻县| 浮山县| 巴塘县| 巴彦县| 出国| 天峨县| 镇远县| 太原市| 武穴市| 依兰县| 屏边| 萝北县| 邢台市| 定安县|