【群智能算法】蜣螂优化算法 DBO算法【Python代码#3】


【可更换其他算法,获取资源请见文章第4节:资源获取】


1. 蜣螂优化算法DBO的数学模型介绍

1.1 滚球行为

蜣螂在整个搜索空间沿着光源的方向移动,在滚动过程中,按照如下的对滚球屎壳郎的位置进行更新:
在这里插入图片描述

其中,t代表当前迭代数,xi表示第i个蜣螂的位置信息;k代表一个常数,表示为偏转系数;α∈(0,1)是一个随机数;a 是一个自然系数,为-1或1;Xw是全局最差位置。

1.2 跳舞行为

当蜣螂遇到障碍物时,它会通过跳舞来重新定向,主要思想是通过正切函数来进行:
在这里插入图片描述
tan(θ) 为偏转系角。

1.3 繁殖行为

作者采用一种边界选择策略模型雌性蜣螂产卵的地方,定义如下:
在这里插入图片描述
X*为当前最佳位置;Lb表示下界,Ub表示上界。

在迭代过程中,卵球的位置是动态变化的,定义如下:
在这里插入图片描述
Bi表示为卵球的位置,b1和b2为1×D 的随机向量。

此外,一些成年蜣螂会从地下钻出来寻找食物,下面公式模拟了蜣螂的觅食过程:
在这里插入图片描述
Xb为全局最佳位置,Lbb和Ubb分别表示最佳觅食区域的上下界。
故成年蜣螂的位置更新公式为:
在这里插入图片描述
C1是服从正态分布的随机数;C2∈(0,1)是一个随机向量。

1.4 偷窃行为

部分蜣螂会从其他蜣螂那里偷粪球,假定Xb是争夺食物的最佳地点,因此具有偷盗行为的蜣螂位置更新描述如下:
在这里插入图片描述
g是服从均值为0,方差为1的正态分布的随机向量;S为一个常数。

2. 部分代码展示

import numpy as np
import DBO as fun1
import sys
import matplotlib.pyplot as plt


def main(argv):

    SearchAgents_no = 30
    Function_name = 'F1'
    Max_iteration = 500

    [fobj, lb, ub, dim] = fun1.Parameters(Function_name)
    [fMin, bestX, DBO_curve] = fun1.DBO(SearchAgents_no, Max_iteration, lb, ub, dim, fobj)
    print(['最优值为:', fMin])
    print(['最优变量为:', bestX])
    thr1 = np.arange(len(DBO_curve[0, :]))

    plt.plot(thr1, np.log(DBO_curve[0, :]))
    plt.xlabel('Iteration')
    plt.ylabel('Best score obtained so far')
    plt.title('Objective space')
    plt.show()

if __name__ == '__main__':
    main(sys.argv)

3. 仿真结果展示

在这里插入图片描述
在这里插入图片描述

4. 资源获取

可以获取完整代码资源。👇👇👇👀名片

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
以下是使用蜣螂算法优化LSTM超参数的Python代码: ```python import random import numpy as np import math import tensorflow as tf from sklearn.datasets import load_iris from sklearn.preprocessing import MinMaxScaler # 加载数据集 iris = load_iris() X = iris.data y = iris.target # 归一化数据 scaler = MinMaxScaler() X = scaler.fit_transform(X) # 设置LSTM网络结构 def lstm_model(n_input, n_hidden, n_classes): inputs = tf.keras.layers.Input(shape=(n_input, 1)) x = tf.keras.layers.LSTM(n_hidden, activation=&#39;tanh&#39;, return_sequences=True)(inputs) x = tf.keras.layers.LSTM(n_hidden, activation=&#39;tanh&#39;)(x) outputs = tf.keras.layers.Dense(n_classes, activation=&#39;softmax&#39;)(x) model = tf.keras.models.Model(inputs=inputs, outputs=outputs) return model # 计算模型的损失函数和准确率 def model_eval(model, X, y): y_pred = model.predict(X) y_pred = np.argmax(y_pred, axis=1) accuracy = np.mean(y_pred == y) loss = tf.keras.losses.sparse_categorical_crossentropy(y, y_pred) return accuracy, loss # 定义蜣螂算法 def firefly_algorithm(X, y, n_input, n_hidden, n_classes, max_generation, alpha=0.5, betamin=0.2, gamma=1.0): # 初始化火蝗 n_fireflies = 20 fireflies = [] for i in range(n_fireflies): n_hidden_layer = random.randint(8, 128) learning_rate = 10 ** random.uniform(-5, -2) model = lstm_model(n_input, n_hidden_layer, n_classes) accuracy, loss = model_eval(model, X, y) fireflies.append({&#39;model&#39;: model, &#39;accuracy&#39;: accuracy, &#39;loss&#39;: loss, &#39;n_hidden_layer&#39;: n_hidden_layer, &#39;learning_rate&#39;: learning_rate}) # 开始迭代 for t in range(max_generation): # 计算每个火蝗的亮度 for i in range(n_fireflies): for j in range(n_fireflies): if fireflies[i][&#39;accuracy&#39;] < fireflies[j][&#39;accuracy&#39;]: r = sum([(fireflies[i][&#39;model&#39;].get_weights()[k] - fireflies[j][&#39;model&#39;].get_weights()[k]) ** 2 for k in range(6)]) beta = betamin * math.exp(-gamma * r ** 2) # 移动火蝗 new_model_weights = [] for k in range(6): new_weight = fireflies[i][&#39;model&#39;].get_weights()[k] * (1 - beta) + fireflies[j][&#39;model&#39;].get_weights()[k] * beta + alpha * np.random.uniform(-1, 1, size=fireflies[i][&#39;model&#39;].get_weights()[k].shape) new_model_weights.append(new_weight) new_model = lstm_model(n_input, fireflies[i][&#39;n_hidden_layer&#39;], n_classes) new_model.set_weights(new_model_weights) new_accuracy, new_loss = model_eval(new_model, X, y) # 更新火蝗的亮度 if new_accuracy >= fireflies[i][&#39;accuracy&#39;]: fireflies[i][&#39;model&#39;] = new_model fireflies[i][&#39;accuracy&#39;] = new_accuracy fireflies[i][&#39;loss&#39;] = new_loss # 找到最优的模型 best_model = None best_accuracy = -1 for i in range(n_fireflies): if fireflies[i][&#39;accuracy&#39;] > best_accuracy: best_model = fireflies[i][&#39;model&#39;] best_accuracy = fireflies[i][&#39;accuracy&#39;] return best_model, best_accuracy # 调用蜣螂算法进行优化 best_model, best_accuracy = firefly_algorithm(X, y, n_input=X.shape[1], n_hidden=64, n_classes=len(np.unique(y)), max_generation=50) # 输出结果 print(&#39;Best accuracy:&#39;, best_accuracy) print(&#39;Best model:&#39;, best_model.summary()) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天`南

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值