智能优化算法之黏菌优化算法(SMA),附matlab代码

黏菌算法是2020年提出的一种智能优化算反,主要模拟的是自然界中多头绒泡菌在不同食物浓度下的觅食行为以及状态变化。黏菌主要分泌酶来消化食物,黏菌的前端延伸成扇形,后端由相互连接的静脉网络包围。环境中不同浓度的食物影响着黏菌静脉网络中细胞质的流动,从而形成黏菌觅食的不同状态。

1.算法原理

当黏菌接近食物时,黏菌算法的数学模型如下式表示:

X(t+1)=\left\{\begin{array}{cc}X_{b}(t)+v b \cdot\left(W \cdot X_{m}(t)-X_{n}(t)\right), & r<p \\v c \cdot X(t), & r \geq p\end{array}\right.

其中,t为当前迭代次数,Xb(t)为第t次迭代时黏菌个体最优的位置,Xm(t)和Xn(t)为随机选择两个黏菌个体的位置,vb作为控制参数范围是[-a,a],vc是从1线性下降到0的参数,r是[0,1]之间的随机值。W为黏菌质量,代表适应度权重。控制变量p和参数vb的数学模型公式如下:

p=tanh\left | S(i)-DF) \right |

vb=[-a,a]]

a的计算公式如式:

其中,i∈1,2,3…,n,S(i)是第 i 个黏菌适应度值,DF为所有迭代中最佳适应度值。适应度权重 W 如式所示:

其中,condition 表示适应度值排在前一半的黏菌个体。fitness sequence 为黏菌的适应度值序列,当求解最小值问题时,其使用升序排列方法。其中,目前迭代次数中最优适应度值用 OF 表示,最差适应度值用 MF 表示。当黏菌包裹食物时,黏菌算法的数学模型如式所示:

当黏菌抓取食物时,黏菌的静脉组织和生物振荡器产生变化。静脉接触的食物浓度越高,生物振
荡器产生的波越强,依靠这种变化,黏菌会抓取更高浓度的食物。黏菌静脉宽度的变化采用 W、vb 和vc 来实现。W 模拟了不同食物浓度下黏菌在附近的振荡频率。vb 在[-a,a]之间随机变化,随着迭代次数的增加,逐渐趋近于零。vc 的值在[-1,1]之间振荡,最终趋于 0。当黏菌选择食物时,vb 和 vc 之间的相互协同性发挥着重要的作用。

2.结果展示

以为CEC2005函数集为例,进行结果展示

 3.MATLAB核心代码

% 黏菌优化算法(SMA)
% max _ iter:最大迭代次数,N:种群大小,收敛曲线:收敛曲线,
function [Destination_fitness,bestPositions,Convergence_curve]=SMA(N,Max_iter,lb,ub,dim,fobj)

%% 初始化位置
bestPositions=zeros(1,dim);
Destination_fitness=inf;%将此更改为 -inf 以解决最大化问题
AllFitness = inf*ones(N,1);%记录所有粘菌的适应度
weight = ones(N,dim);%每个粘菌的适应度权重
%% 初始化随机解集
X=initialization(N,dim,ub,lb);
Convergence_curve=zeros(1,Max_iter);
it=1;  %迭代次数
lb=ones(1,dim).*lb; % 变量下限
ub=ones(1,dim).*ub; % 变量上限
z=0.03; % 参数

%% 主循环
while  it <= Max_iter
    
    %=====适应度排序======
    for i=1:N
        % 检查解决方案是否超出搜索空间并将其带回
        Flag4ub=X(i,:)>ub;
        Flag4lb=X(i,:)<lb;
        X(i,:)=(X(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;
        AllFitness(i) = fobj(X(i,:));
    end
    
    [SmellOrder,SmellIndex] = sort(AllFitness); 
    worstFitness = SmellOrder(N);
    bestFitness = SmellOrder(1);

    S=bestFitness-worstFitness+eps;  %加上 eps 以避免分母为零

    %====计算每个粘菌的适应度权重=====
    for i=1:N
        for j=1:dim
            if i<=(N/2) 
                weight(SmellIndex(i),j) = 1+rand()*log10((bestFitness-SmellOrder(i))/(S)+1);
            else
                weight(SmellIndex(i),j) = 1-rand()*log10((bestFitness-SmellOrder(i))/(S)+1);
            end
        end
    end
    
    %====更新最佳适应度值和最佳位置=====
    if bestFitness < Destination_fitness
        bestPositions=X(SmellIndex(1),:);
        Destination_fitness = bestFitness;
    end
    
    a = atanh(-(it/Max_iter)+1);  
    b = 1-it/Max_iter;
    
    %====更新搜索代理的位置=====
    for i=1:N
        if rand<z    
            X(i,:) = (ub-lb)*rand+lb;
        else
            p =tanh(abs(AllFitness(i)-Destination_fitness)); 
            vb = unifrnd(-a,a,1,dim); 
            vc = unifrnd(-b,b,1,dim);
            for j=1:dim
                r = rand();
                A = randi([1,N]);  % 从总体中随机选择两个位置
                B = randi([1,N]);
                if r<p    
                    X(i,j) = bestPositions(j)+ vb(j)*(weight(i,j)*X(A,j)-X(B,j));
                else
                    X(i,j) = vc(j)*X(i,j);
                end
            end
        end
    end
    Convergence_curve(it)=Destination_fitness;
     display(['At iteration ', num2str(it), ' the best solution fitness is ', num2str(Destination_fitness)]);
    it=it+1;
      
end

end

完整代码获取方式:下方小卡片回复关键字:TGDM1209

参考文献:

[1] Li S, Chen H, Wang M, et al. Slime mould algorithm: A newmethod for stochastic optimization[J]. Future Generation Computer Systems. 2020, 111(1): 300-323.

[2]龚然,施文娟,朱振源.基于混沌映射和莱维飞行的黏菌优化算法[J].计算机与数字工程,2023,51(02):361-367.

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
多目标黏菌优化算法是一种基于生物黏菌聚集行为的优化算法,可以用于解决多目标优化问题。以下是一个简单的 Python 实现: ```python import random import numpy as np # 定义目标函数 def f1(x): return x[0]**2 + x[1]**2 def f2(x): return (x[0]-1)**2 + x[1]**2 # 定义多目标黏菌优化算法 def MOA(num_particles, num_iterations, num_objectives, search_space, w, c1, c2): # 初始化粒子群 particles = np.zeros((num_particles, len(search_space))) velocities = np.zeros((num_particles, len(search_space))) personal_best = np.zeros((num_particles, len(search_space))) personal_best_fitness = np.zeros((num_particles, num_objectives)) global_best = np.zeros((len(search_space))) global_best_fitness = np.zeros((num_objectives)) for i in range(num_particles): for j in range(len(search_space)): particles[i][j] = random.uniform(search_space[j][0], search_space[j][1]) personal_best[i] = particles[i] personal_best_fitness[i][0] = f1(particles[i]) personal_best_fitness[i][1] = f2(particles[i]) # 迭代优化 for t in range(num_iterations): for i in range(num_particles): # 计算粒子间距离 distances = np.zeros((num_particles)) for j in range(num_particles): distances[j] = np.linalg.norm(particles[i] - particles[j]) # 计算吸引力和斥力 attraction = np.zeros((len(search_space))) repulsion = np.zeros((len(search_space))) for j in range(num_particles): if i == j: continue if personal_best_fitness[j][0] < personal_best_fitness[i][0] and personal_best_fitness[j][1] < personal_best_fitness[i][1]: attraction += (personal_best[j] - particles[i]) / distances[j] if personal_best_fitness[j][0] > personal_best_fitness[i][0] or personal_best_fitness[j][1] > personal_best_fitness[i][1]: repulsion += (particles[i] - particles[j]) / distances[j]**2 # 更新速度和位置 velocities[i] = w * velocities[i] + c1 * random.uniform(0, 1) * attraction + c2 * random.uniform(0, 1) * repulsion particles[i] += velocities[i] # 限制位置在搜索空间内 for j in range(len(search_space)): if particles[i][j] < search_space[j][0]: particles[i][j] = search_space[j][0] if particles[i][j] > search_space[j][1]: particles[i][j] = search_space[j][1] # 更新个体最优解和全局最优解 fitness = np.zeros((num_objectives)) fitness[0] = f1(particles[i]) fitness[1] = f2(particles[i]) if all(fitness <= personal_best_fitness[i]): personal_best[i] = particles[i] personal_best_fitness[i] = fitness if all(fitness <= global_best_fitness): global_best = particles[i] global_best_fitness = fitness print("Iteration {}: f1 = {}, f2 = {}".format(t, global_best_fitness[0], global_best_fitness[1])) return global_best, global_best_fitness # 测试算法 search_space = [(-5, 5), (-5, 5)] w = 0.5 c1 = 0.5 c2 = 0.5 num_particles = 10 num_iterations = 100 num_objectives = 2 best_solution, best_fitness = MOA(num_particles, num_iterations, num_objectives, search_space, w, c1, c2) print("Best solution: {}, Best fitness: {}".format(best_solution, best_fitness)) ``` 在上述代码中,我们首先定义了两个目标函数 `f1` 和 `f2`。接着,我们实现了多目标黏菌优化算法 `MOA`,其中包括初始化粒子群、迭代优化等步骤。最后,我们使用一个简单的测试案例来演示算法的使用。在本例中,我们使用了两个目标函数,搜索空间为二维平面上的一个矩形区域,粒子数为 10,迭代次数为 100。算法的输出为最优解和最优解的适应度值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

今天吃饺子

不想刀我的可以选择爱我

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

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

打赏作者

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

抵扣说明:

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

余额充值