优化算法 | Gaining Sharing Knowledge based Algorithm(附MATLAB代码)

本文主要是介绍优化算法 | Gaining Sharing Knowledge based Algorithm(附MATLAB代码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天为各位讲解Gaining‑sharing knowledge based algorithm(GSK)为什么讲解这个算法呢,因为自适应GSK算法(Adaptive Gaining-Sharing Knowledge Based Algorithm,AGSK)是CEC2020比赛的优胜算法。在讲解性能强悍的AGSK算法前,有必要先理解GSK的基本思想,而后再向深刻理解AGSK算法迈进。


1.GSK算法基本思想

GSK算法的灵感来源于人在一生中获取和共享知识的过程,这个过程分为两个阶段:

1)初级获取和共享知识阶段,即人一生的前中期。在这一阶段,相比于通过大型网络(如工作、社交、朋友等)获取知识,人们更多地会通过小型网络(如家人、邻居、亲戚等)获取知识。虽然这一阶段的人们想法、观点尚未成熟,但是他们努力尝试分享自己的观点

2)高级获取和共享知识阶段,即人一生的中后期。这一阶段的人们通常会通过大型网络(如工作、社交、朋友等)获取知识,比如,这一阶段的人们通常喜欢成功学,相信成功者的观点,以使他们避免失败。这一阶段的人们思想十分成熟,他们会积极向他人分享自己的观点,期望帮助他人能从自己的分享中受益。


2.GSK算法数学描述

在了解GSK算法基本思想后,接下来对GSK算法进行数学描述:

假设第 i i i个体 x i = ( x i 1 , x i 2 , . . . , x i D ) , i = 1 , 2 , . . . , N x_i=(x_{i1},x_{i2},...,x_{iD}),i=1,2,...,N xi=(xi1,xi2,...,xiD),i=1,2,...,N的适应度值为 f i , i = 1 , 2 , . . . , N f_i,i=1,2,...,N fi,i=1,2,...,N,其中 D D D为问题维数, N N N为种群数目。下图可以清晰地展示两个阶段个体中初级部分高级部分的变化情况。

从上述分析过程和上图中可以看出,初级要素数目和高级要素数目是变化的,则个体中初级要素数目的计算公式如下:
D ( juniorphase  ) = ( problemsize  ) × ( 1 − G G E N ) k D(\text { juniorphase })=(\text { problemsize }) \times\left(1-\frac{G}{G E N}\right)^k D( juniorphase )=( problemsize )×(1GENG)k
个体中高级要素数目的计算公式如下:
D ( seniorphase  ) = problemsize  − D ( juniorphase  ) D(\text { seniorphase })=\text { problemsize }-D(\text { juniorphase }) D( seniorphase )= problemsize D( juniorphase )
其中, D ( juniorphase  ) D(\text { juniorphase }) D( juniorphase )表示初级要素数目, D ( seniorphase ) D(\text { seniorphase}) D( seniorphase)表示高级要素数目, p r o b l e m s i z e problemsize problemsize表示问题维数, G E N GEN GEN表示总迭代次数, G G G表示当前迭代次数, k ( k > 0 ) k(k>0) k(k>0)表示知识学习率。


3.GSK算法基本步骤

如GSK基本思想所阐述的一样,GSK算法也分为初级和高级获取与共享知识两个阶段。

01 | 初级获取和共享知识阶段

假设求解函数最小值问题,在这一阶段,更新 x i , i = 1 , 2 , . . . , N x_i,i=1,2,...,N xi,i=1,2,...,N的方法如下:

(1)将种群中的个体按照适应度值从小到大的顺序进行排序,排序结果如下: x best  , … … , x i − 1 , x i , x i + 1 , … … x worst  x_{\text {best }}, \ldots \ldots, x_{i-1}, x_i, x_{i+1}, \ldots \ldots x_{\text {worst }} xbest ,……,xi1,xi,xi+1,……xworst 

(2) x i , i = 1 , 2 , . . . , N x_i,i=1,2,...,N xi,i=1,2,...,N的更新公式如下:
x i n e w = { x i + k f × [ ( x i − 1 − x i + 1 ) + ( x r − x i ) ] f ( x i ) > f ( x r ) x i + k f × [ ( x i − 1 − x i + 1 ) + ( x i − x r ) ] f ( x i ) ≤ f ( x r ) x_i^{n e w}= \begin{cases}x_i+k_f \times\left[\left(x_{i-1}-x_{i+1}\right)+\left(x_r-x_i\right)\right] & f\left(x_i\right)>f\left(x_r\right) \\ x_i+k_f \times\left[\left(x_{i-1}-x_{i+1}\right)+\left(x_i-x_r\right)\right] & f\left(x_i\right) \leq f\left(x_r\right)\end{cases} xinew={xi+kf×[(xi1xi+1)+(xrxi)]xi+kf×[(xi1xi+1)+(xixr)]f(xi)>f(xr)f(xi)f(xr)
其中 x i n e w x_i^{n e w} xinew为更新后的个体, x r x_r xr为随机选择的个体, k f k_f kf为知识因素参数。
初级获取和共享知识阶段算法伪代码如下,其中 k r k_r kr为知识比率:

02 | 高级获取和共享知识阶段

假设求解函数最小值问题,在这一阶段,更新 x i , i = 1 , 2 , . . . , N x_i,i=1,2,...,N xi,i=1,2,...,N的方法如下:

(1)将种群中的个体按照适应度值从小到大的顺序进行排序,然后将排序后的个体分成3类,即最佳个体、中等个体、最差个体,其中最佳个体占比 p p p,最差个体占比 p p p,中等个体占比 1 − 2 p 1-2p 12p,通常取 p = 0.1 p=0.1 p=0.1

(2) x i , i = 1 , 2 , . . . , N x_i,i=1,2,...,N xi,i=1,2,...,N的更新公式如下:
x i n e w = { x i + k f × [ ( x p b e s t − x p w o r s t ) + ( x m − x i ) ] f ( x i ) > f ( x m ) x i + k f × [ ( x p b e s t − x p w o r s t ) + ( x i − x m ) ] f ( x i ) ≤ f ( x m ) x_i^{n e w}= \begin{cases}x_i+k_f \times\left[\left(x_{pbest}-x_{pworst}\right)+\left(x_m-x_i\right)\right] & f\left(x_i\right)>f\left(x_m\right) \\ x_i+k_f \times\left[\left(x_{pbest}-x_{pworst}\right)+\left(x_i-x_m\right)\right] & f\left(x_i\right) \leq f\left(x_m\right)\end{cases} xinew={xi+kf×[(xpbestxpworst)+(xmxi)]xi+kf×[(xpbestxpworst)+(xixm)]f(xi)>f(xm)f(xi)f(xm)
其中 x i n e w x_i^{n e w} xinew为更新后的个体, x p b e s t x_{pbest} xpbest最佳个体中随机选择的个体, x p w o r s t x_{pworst} xpworst最差个体中随机选择的个体, x m x_{m} xm中等个体中随机选择的个体, k f k_f kf为知识因素参数。
高级获取和共享知识阶段算法伪代码如下,其中 k r k_r kr为知识比率:

03 | GSK算法伪代码及流程图


4.GSK算法MATLAB代码

GSK算法MATLAB代码链接为:https://www.mathworks.com/matlabcentral/fileexchange/73730-gaining-sharing-knowledge-based-algorithm,各位也可在公号后台回复【GSK】即可提取代码(不包括【】)。

求解CEC2017为例,GSK算法文件夹共包含如下文件:

主函数GSK.m代码如下所示:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%Gaining-Sharing Knowledge Based Algorithm for Solving Optimization
%%Problems: A Novel Nature-Inspired Algorithm
%% Authors: Ali Wagdy Mohamed, Anas A. Hadi , Ali Khater Mohamed
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%clc;
clear all;format long;
Alg_Name='GSK';
n_problems=30;
ConvDisp=1;
Run_No=51;for problem_size = [10 30 50 100]max_nfes = 10000 * problem_size;rand('seed', sum(100 * clock));val_2_reach = 10^(-8);max_region = 100.0;min_region = -100.0;lu = [-100 * ones(1, problem_size); 100 * ones(1, problem_size)];fhd=@cec17_func;analysis= zeros(30,6);for func = 1 : n_problemsoptimum = func * 100.0;%% Record the best resultsoutcome = [];fprintf('\n-------------------------------------------------------\n')fprintf('Function = %d, Dimension size = %d\n', func, problem_size)dim1=[];dim2=[];for run_id = 1 : Run_Nobsf_error_val=[];run_funcvals = [];pop_size = 100;G_Max=fix(max_nfes/pop_size);%% Initialize the main populationpopold = repmat(lu(1, :), pop_size, 1) + rand(pop_size, problem_size) .* (repmat(lu(2, :) - lu(1, :), pop_size, 1));pop = popold; % the old population becomes the current populationfitness = feval(fhd,pop',func);fitness = fitness';nfes = 0;bsf_fit_var = 1e+300;%%%%%%%%%%%%%%%%%%%%%%%% for outfor i = 1 : pop_sizenfes = nfes + 1;%%      if nfes > max_nfes; exit(1); endif nfes > max_nfes; break; endif fitness(i) < bsf_fit_varbsf_fit_var = fitness(i);endrun_funcvals = [run_funcvals;bsf_fit_var];end%%%%%%%%%%%%%%%%%%%%%%%% Parameter settings%%%%%%%%%%KF=0.5;% Knowledge FactorKR=0.9;%Knowledge RatioK=10*ones(pop_size,1);%Knowledge Rateg=0;%% main loopwhile nfes < max_nfesg=g+1;D_Gained_Shared_Junior=ceil((problem_size)*(1-g/G_Max).^K);D_Gained_Shared_Senior=problem_size-D_Gained_Shared_Junior;pop = popold; % the old population becomes the current population[valBest, indBest] = sort(fitness, 'ascend');[Rg1, Rg2, Rg3] = Gained_Shared_Junior_R1R2R3(indBest);[R1, R2, R3] = Gained_Shared_Senior_R1R2R3(indBest);R01=1:pop_size;Gained_Shared_Junior=zeros(pop_size, problem_size);ind1=fitness(R01)>fitness(Rg3);if(sum(ind1)>0)Gained_Shared_Junior (ind1,:)= pop(ind1,:) + KF*ones(sum(ind1), problem_size) .* (pop(Rg1(ind1),:) - pop(Rg2(ind1),:)+pop(Rg3(ind1), :)-pop(ind1,:)) ;endind1=~ind1;if(sum(ind1)>0)Gained_Shared_Junior(ind1,:) = pop(ind1,:) + KF*ones(sum(ind1), problem_size) .* (pop(Rg1(ind1),:) - pop(Rg2(ind1),:)+pop(ind1,:)-pop(Rg3(ind1), :)) ;endR0=1:pop_size;Gained_Shared_Senior=zeros(pop_size, problem_size);ind=fitness(R0)>fitness(R2);if(sum(ind)>0)Gained_Shared_Senior(ind,:) = pop(ind,:) + KF*ones(sum(ind), problem_size) .* (pop(R1(ind),:) - pop(ind,:) + pop(R2(ind),:) - pop(R3(ind), :)) ;endind=~ind;if(sum(ind)>0)Gained_Shared_Senior(ind,:) = pop(ind,:) + KF*ones(sum(ind), problem_size) .* (pop(R1(ind),:) - pop(R2(ind),:) + pop(ind,:) - pop(R3(ind), :)) ;endGained_Shared_Junior = boundConstraint(Gained_Shared_Junior, pop, lu);Gained_Shared_Senior = boundConstraint(Gained_Shared_Senior, pop, lu);D_Gained_Shared_Junior_mask=rand(pop_size, problem_size)<=(D_Gained_Shared_Junior(:, ones(1, problem_size))./problem_size); D_Gained_Shared_Senior_mask=~D_Gained_Shared_Junior_mask;D_Gained_Shared_Junior_rand_mask=rand(pop_size, problem_size)<=KR*ones(pop_size, problem_size);D_Gained_Shared_Junior_mask=and(D_Gained_Shared_Junior_mask,D_Gained_Shared_Junior_rand_mask);D_Gained_Shared_Senior_rand_mask=rand(pop_size, problem_size)<=KR*ones(pop_size, problem_size);D_Gained_Shared_Senior_mask=and(D_Gained_Shared_Senior_mask,D_Gained_Shared_Senior_rand_mask);ui=pop;ui(D_Gained_Shared_Junior_mask) = Gained_Shared_Junior(D_Gained_Shared_Junior_mask);ui(D_Gained_Shared_Senior_mask) = Gained_Shared_Senior(D_Gained_Shared_Senior_mask);children_fitness = feval(fhd, ui', func);children_fitness = children_fitness';for i = 1 : pop_sizenfes = nfes + 1;if nfes > max_nfes; break; endif children_fitness(i) < bsf_fit_varbsf_fit_var = children_fitness(i);bsf_solution = ui(i, :);endrun_funcvals = [run_funcvals;bsf_fit_var];end[fitness, Child_is_better_index] = min([fitness, children_fitness], [], 2);popold = pop;popold(Child_is_better_index == 2, :) = ui(Child_is_better_index == 2, :);% fprintf('NFES:%d, bsf_fit:%1.6e,pop_Size:%d,D_Gained_Shared_Junior:%2.2e,D_Gained_Shared_Senior:%2.2e\n', nfes,bsf_fit_var,pop_size,problem_size*sum(sum(D_Gained_Shared_Junior))/(pop_size*problem_size),problem_size*sum(sum(D_Gained_Shared_Senior))/(pop_size*problem_size))end % end while loopbsf_error_val = bsf_fit_var - optimum;if bsf_error_val < val_2_reachbsf_error_val = 0;end         fprintf('%d th run, best-so-far error value = %1.8e\n', run_id , bsf_error_val)outcome = [outcome bsf_error_val];%% plot convergence figuresif (ConvDisp)run_funcvals=run_funcvals-optimum;run_funcvals=run_funcvals';dim1(run_id,:)=1:length(run_funcvals);dim2(run_id,:)=log10(run_funcvals);end%%%%%%%%%%%%%%%%%%%%%%%%%%%end %% end 1 run%% save ststiatical output in analysis file%%%%analysis(func,1)=min(outcome);analysis(func,2)=median(outcome);analysis(func,3)=max(outcome);analysis(func,4)=mean(outcome);analysis(func,5)=std(outcome);median_figure=find(outcome== median(outcome));analysis(func,6)=median_figure(1);file_name=sprintf('Results\\%s_CEC2017_Problem#%s_problem_size#%s',Alg_Name,int2str(func),int2str(problem_size));save(file_name,'outcome');%% print statistical output and save convergence figures%%%fprintf('%e\n',min(outcome));fprintf('%e\n',median(outcome));fprintf('%e\n',mean(outcome));fprintf('%e\n',max(outcome));fprintf('%e\n',std(outcome));dim11=dim1(median_figure,:);dim22=dim2(median_figure,:);file_name=sprintf('Figures\\Figure_Problem#%s_Run#%s',int2str(func),int2str(median_figure));save(file_name,'dim1','dim2');end %% end 1 function runfile_name=sprintf('Results\\analysis_%s_CEC2017_problem_size#%s',Alg_Name,int2str(problem_size));save(file_name,'analysis');
end %% end all function runs in all dimensions

5.GSK算法实例验证

以求解CEC2017第6个测试函数为例,该函数为Shifted and Rotated Schaffer’s F7 Function:
F 6 ( x ) = f 20 ( M ( 0.5 ( x − o 6 ) 100 ) ) + F 6 ∗ F_6(\boldsymbol{x})=f_{20}\left(\mathbf{M}\left(\frac{0.5\left(\boldsymbol{x}-\boldsymbol{o}_6\right)}{100}\right)\right)+F_6 * F6(x)=f20(M(1000.5(xo6)))+F6
该函数具有4个特性:多模态、不可分离、不对称、局部最优点数量巨大,该函数图像如下:

当求解问题维数为10维时,求解结果如下,求解最优值为600,已经达到全局最优值:

参考文献

[1] Mohamed A W, Hadi A A, Mohamed A K. Gaining-sharing knowledge based algorithm for solving optimization problems: a novel nature-inspired algorithm[J]. International Journal of Machine Learning and Cybernetics, 2020, 11(7): 1501-1529.

[2] https://www.mathworks.com/matlabcentral/fileexchange/73730-gaining-sharing-knowledge-based-algorithm


OK,今天就到这里啦,各位可点击下方图片留言,下方图书为作者撰写书籍,助力各位快速入门智能优化算法。


咱们下期再见

近期你可能错过了的好文章

新书上架 | 《MATLAB智能优化算法:从写代码到算法思想》

优化算法 | 灰狼优化算法(文末有福利)

优化算法 | 鲸鱼优化算法

遗传算法(GA)求解带时间窗的车辆路径(VRPTW)问题MATLAB代码

粒子群优化算法(PSO)求解带时间窗的车辆路径问题(VRPTW)MATLAB代码

知乎 | bilibili | CSDN:随心390
公号 | 优化算法交流地

这篇关于优化算法 | Gaining Sharing Knowledge based Algorithm(附MATLAB代码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/849999

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了