灰狼算法怎么选出下一代的前三头狼C语言代码
以下是灰狼算法选出下一代前三头狼的C语言代码示例:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define dim 10 // 维度
#define searchAgents_no 50 // 狼群数量
#define maxIter 100 // 最大迭代次数
#define a 2 // 系数a
#define r1 0.5 // 系数r1
#define r2 0.5 // 系数r2
double lb = -100; // 变量下界
double ub = 100; // 变量上界
// 狼群结构体
typedef struct{
double position[dim]; // 位置向量
double fitness; // 适应度值
} wolf;
// 初始化狼群
void init(wolf* pop){
for(int i=0; i<searchAgents_no; i++){
for(int j=0; j<dim; j++){
pop[i].position[j] = lb + (ub-lb)*((double)rand()/(double)RAND_MAX); // 随机初始化
}
pop[i].fitness = 0; // 初始适应度值为0
}
}
// 计算适应度值
double fitness(wolf* pop, int idx){
double sum = 0;
for(int i=0; i<dim; i++){
sum += pow(pop[idx].position[i], 2);
}
return sum;
}
// 更新位置向量
void update(wolf* pop, int idx, wolf* alpha, wolf* beta, wolf* delta){
double r1 = (double)rand()/(double)RAND_MAX; // 随机数r1
double r2 = (double)rand()/(double)RAND_MAX; // 随机数r2
double A1[dim], A2[dim], A3[dim], D_alpha[dim], D_beta[dim], D_delta[dim];
// 计算A1、A2、A3向量
for(int i=0; i<dim; i++){
A1[i] = 2*a*r1 - a;
A2[i] = 2*a*r2 - a;
A3[i] = 2*a*r2 - a;
}
// 计算距离向量D_alpha、D_beta、D_delta
for(int i=0; i<dim; i++){
D_alpha[i] = fabs(alpha->position[i] - pop[idx].position[i]);
D_beta[i] = fabs(beta->position[i] - pop[idx].position[i]);
D_delta[i] = fabs(delta->position[i] - pop[idx].position[i]);
}
// 更新位置向量
for(int i=0; i<dim; i++){
pop[idx].position[i] = (alpha->position[i] - A1[i]*D_alpha[i]) + (beta->position[i] - A2[i]*D_beta[i]) + (delta->position[i] - A3[i]*D_delta[i]);
if(pop[idx].position[i] < lb) pop[idx].position[i] = lb; // 越界处理
if(pop[idx].position[i] > ub) pop[idx].position[i] = ub;
}
}
// 狼群排序(按适应度值从小到大排序)
void sort(wolf* pop){
wolf temp;
for(int i=0; i<searchAgents_no; i++){
for(int j=i+1; j<searchAgents_no; j++){
if(pop[i].fitness > pop[j].fitness){
temp = pop[i];
pop[i] = pop[j];
pop[j] = temp;
}
}
}
}
int main(){
srand(time(NULL)); // 设置随机数种子
wolf pop[searchAgents_no]; // 狼群
wolf alpha, beta, delta; // 三头狼
init(pop); // 初始化狼群
for(int iter=0; iter<maxIter; iter++){ // 迭代
for(int i=0; i<searchAgents_no; i++){ // 计算适应度值
pop[i].fitness = fitness(pop, i);
}
sort(pop); // 狼群排序
alpha = pop[0]; // 第一头狼为alpha
beta = pop[1]; // 第二头狼为beta
delta = pop[2]; // 第三头狼为delta
for(int i=0; i<searchAgents_no; i++){ // 更新位置向量
update(pop, i, &alpha, &beta, &delta);
}
}
sort(pop); // 狼群排序
printf("前三头狼的位置向量:\n");
for(int i=0; i<3; i++){
printf("第%d头狼:", i+1);
for(int j=0; j<dim; j++){
printf("%.4f ", pop[i].position[j]);
}
printf("\n");
}
return 0;
}
说明:
- 该代码实现了灰狼算法选出下一代前三头狼的功能;
- 代码中使用了C语言的结构体来存储狼的信息,方便计算和操作;
- 为了随机生成位置向量,使用了C语言的rand()函数和srand()函数,需要先设置随机数种子,可以使用time()函数获取当前时间作为种子;
- 为了优化运行速度,狼群排序使用了简单选择排序算法,实际应用中可以使用更高效的排序算法
原文地址: https://www.cveoy.top/t/topic/gIKk 著作权归作者所有。请勿转载和采集!