混合蛙跳算法的基本原理及C/C++实现

2024-02-06 11:50

本文主要是介绍混合蛙跳算法的基本原理及C/C++实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、 混合蛙跳算法的基本原理

    对随机生成的青蛙群体F,共有n只青蛙。将青蛙按个体文化信息值的大小即适应度降序排列,然后把整个群体分成m个子群,每个子群有k只青蛙。对青蛙群体F,将第一只青蛙分入第1子群,第二只青蛙分入第2子群,第m只青蛙分入第m子群,第m+1只青蛙分入第1子群,第m+2只青蛙分入第2子群,依次类推,直到全部青蛙划分完毕,且满足关系式n=m×k。

对于青蛙群体F,具有全局最好适应度的解表示为Pg;对于每一个子群,具有最好适应度的解表示为Pb,最差适应度的解表示为Pw。首先对每个子族群进行局部搜索,即对子族群中最差适应度的青蛙个体进行更新操作,更新策略为:

Ds=min{int[rand(Pb-Pw)],Dmax}, Pb-Pw≥0 (1)

Ds=max{int[rand(Pb-Pw)],-Dmax}, Pb-Pw<0 (2) newDw=Pw+Ds(-Dmax≦Ds≦Dmax)(3)

 其中, Ds 表示青蛙个体的调整距离,rand()表示0和1之间的随机数,Dmax表示青蛙个体允许改变的最大步长。如果最差适应度的青蛙个体更新后的解newDw优于Pw,则取代Pw,否则用Pg代替公式(1-2)中的Pb执行更新策略,如果还是没有优于Pw,则用一个随机产生的解取代Pw。重复这种更新操作,直到设定的子群内更新次数。当所有子群的局部搜索完成后,将所有子群重新混合并排序和重新划分子群,然后又进行子群内局部搜索,如此循环直到满足终止条件。


2、 混合蛙跳算法的C/C++实现

相关变量定义部分:

#define G 100  /*混合迭代次数*/
#define P 200 /*个体总数*/
#define M 20 /*族群数*/
#define I 10 /*因此,一个族群中的个体数是10*/
#define V 20 /*个体维数*/
#define N 20 /*族群内更新次数*/
#define MAX 2.048
#define MIN -2.048
#define D 2.0 /*蛙跳的最大值*/
#define R rand()%100/100.0
typedef struct {
double d[V];
double fitness;
}Individal;
Individal pw[M];/*族群中个体最差位置*/
Individal pb[M];/*族群中个体最好位置*/
Individal px;/*全体中最好位置*/
Individal individual[P];/*全部个体*/
Individal pop[M][I];/*排序后的群组*/
Individal temp[M];
Individal tem;

适应度函数:

double fitness(int a)
{int i;double sum=0;for(i=0;i<V-1;i++){sum+=100*(individual[a].d[i]*individual[a].d[i]-individual[a].d[i+1])*(individual[a].d[i]*individual[a].d[i]-individual[a].d[i+1])+(individual[a].d[i]-1)*(individual[a].d[i]-1);}return sum;     
}
种群初始化函数:

void init()
{int i,j;for(i=0;i<P;i++){for(j=0;j<V;j++){individual[i].d[j]=R*(MAX-MIN)+MIN;}individual[i].fitness=fitness(i);}
}
按照适应度降序对全部个体进行排序和族群划分函数:
void sort()
{int i,j,k;for(i=1;i<P;i++){for(j=0;j<P-i;j++){if(individual[j].fitness<individual[j+1].fitness){tem=individual[j];individual[j]=individual[j+1];individual[j+1]=tem;}}}k=0;/*按照规则分组*/for(i=0;i<I;i++){for(j=0;j<M;j++){pop[j][i]=individual[k];k++;}}px=individual[P-1];for(i=0;i<M;i++){pw[i]=pop[i][0];pb[i]=pop[i][I-1];}
}

子种群个体重新排序函数:

void sortPop(int b)
{int i,j;for(i=1;i<I;i++){for(j=0;j<I-i;j++){if(pop[b][j].fitness<pop[b][j+1].fitness){tem=pop[b][j];pop[b][j]=pop[b][j+1];pop[b][j+1]=tem;}}}
}
种群内个体更新函数

void update()
{int i,j,k,l,n;double a;double b;for(n=0;n<N;n++){for(i=0;i<M;i++){    a=0.0;b=0.0;for(j=0;j<V;j++){   temp[i].d[j]=R*(pb[i].d[j]-pw[i].d[j]);if(abs(temp[i].d[j])>D){if(temp[i].d[j]>0){temp[i].d[j]=D;}else{temp[i].d[j]=-D;}}temp[i].d[j]+=pw[i].d[j];a+=temp[i].d[j]*temp[i].d[j];}temp[i].fitness=a;if(a<pw[i].fitness){pop[i][0]=temp[i];sortPop(i);pw[i]=pop[i][0];pb[i]=pop[i][I-1];}else{for(k=0;k<V;k++){temp[i].d[k]=R*(px.d[k]-pw[i].d[k]);if(abs(temp[i].d[k])>D){if(temp[i].d[k]>0){temp[i].d[k]=D;}else{temp[i].d[k]=-D;}}temp[i].d[k]+=pw[i].d[k];a+=temp[i].d[k]*temp[i].d[k];}temp[i].fitness=a;if(a<pw[i].fitness){pop[i][0]=temp[i];sortPop(i);pw[i]=pop[i][0];pb[i]=pop[i][I-1];}else{for(l=0;l<V;l++){pop[i][0].d[l]=R*(MAX-MIN)+MIN;b+=pop[i][0].d[l]*pop[i][0].d[l];}pop[i][0].fitness=b;sortPop(i);pw[i]=pop[i][0];pb[i]=pop[i][I-1];}}}}
}
更新种群函数:

void renew()
{int i,j,k;i=0;	for(j=0;j<M;j++){for(k=0;k<I;k++){individual[i]=pop[j][k]; i++;}}
}
结果输出函数:

void result()
{printf("%.8f\n",px.fitness);int i;for(i=0;i<V;i++){printf("x(%d)=%.8f\n",i,px.d[i]);}	
}
主函数:

void main()
{int i;init();for(i=0;i<G;i++){sort();update();renew();}result();printf("Completed!");
}
程序运行结果





这篇关于混合蛙跳算法的基本原理及C/C++实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

PyCharm中配置PyQt的实现步骤

《PyCharm中配置PyQt的实现步骤》PyCharm是JetBrains推出的一款强大的PythonIDE,结合PyQt可以进行pythion高效开发桌面GUI应用程序,本文就来介绍一下PyCha... 目录1. 安装China编程PyQt1.PyQt 核心组件2. 基础 PyQt 应用程序结构3. 使用 Q

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库