免疫遗传算法C++实现
时间: 2023-09-15 11:17:55 浏览: 83
基于C++ 实现的遗传算法.zip
免疫遗传算法是一种基于免疫系统的优化算法,其主要思想是将生物免疫系统的进化和自适应机制运用到优化问题求解中。下面是一个简单的免疫遗传算法的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define POP_SIZE 20 // 种群规模
#define CHROM_LENGTH 20 // 染色体长度
#define MAX_ITER 1000 // 最大迭代次数
#define MUT_RATE 0.1 // 变异率
// 定义染色体结构体
typedef struct tagChrom {
int gene[CHROM_LENGTH];
double fit;
} Chrom;
// 初始化种群
void initialize(Chrom *pop) {
int i, j;
for (i = 0; i < POP_SIZE; i++) {
for (j = 0; j < CHROM_LENGTH; j++) {
pop[i].gene[j] = rand() % 2;
}
pop[i].fit = 0.0;
}
}
// 计算适应度
void evaluate(Chrom *pop) {
int i, j;
double sum;
for (i = 0; i < POP_SIZE; i++) {
sum = 0.0;
for (j = 0; j < CHROM_LENGTH; j++) {
sum += pop[i].gene[j];
}
pop[i].fit = sum / CHROM_LENGTH;
}
}
// 选择操作
void select(Chrom *pop, Chrom *new_pop) {
int i, j, k, r1, r2;
double sum_fit, r, accu_fit[POP_SIZE];
// 计算适应度总和
sum_fit = 0.0;
for (i = 0; i < POP_SIZE; i++) {
sum_fit += pop[i].fit;
}
// 计算累计适应度
accu_fit[0] = pop[0].fit / sum_fit;
for (i = 1; i < POP_SIZE; i++) {
accu_fit[i] = accu_fit[i - 1] + pop[i].fit / sum_fit;
}
// 选择
for (i = 0; i < POP_SIZE; i++) {
r = (double)rand() / RAND_MAX;
for (j = 0; j < POP_SIZE; j++) {
if (r <= accu_fit[j]) {
new_pop[i] = pop[j];
break;
}
}
}
}
// 交叉操作
void crossover(Chrom *pop, Chrom *new_pop) {
int i, j, k, p1, p2, cp;
for (i = 0; i < POP_SIZE; i += 2) {
p1 = rand() % POP_SIZE;
p2 = rand() % POP_SIZE;
cp = rand() % (CHROM_LENGTH - 1) + 1;
for (j = 0; j < cp; j++) {
new_pop[i].gene[j] = pop[p1].gene[j];
new_pop[i + 1].gene[j] = pop[p2].gene[j];
}
for (j = cp; j < CHROM_LENGTH; j++) {
new_pop[i].gene[j] = pop[p2].gene[j];
new_pop[i + 1].gene[j] = pop[p1].gene[j];
}
}
}
// 变异操作
void mutate(Chrom *pop) {
int i, j;
for (i = 0; i < POP_SIZE; i++) {
for (j = 0; j < CHROM_LENGTH; j++) {
if ((double)rand() / RAND_MAX < MUT_RATE) {
pop[i].gene[j] = 1 - pop[i].gene[j];
}
}
}
}
// 打印种群
void print_pop(Chrom *pop) {
int i, j;
for (i = 0; i < POP_SIZE; i++) {
for (j = 0; j < CHROM_LENGTH; j++) {
printf("%d ", pop[i].gene[j]);
}
printf("%.2f\n", pop[i].fit);
}
}
int main() {
Chrom pop[POP_SIZE], new_pop[POP_SIZE];
int iter;
srand(time(NULL));
// 初始化种群
initialize(pop);
// 迭代
for (iter = 0; iter < MAX_ITER; iter++) {
// 计算适应度
evaluate(pop);
// 选择
select(pop, new_pop);
// 交叉
crossover(pop, new_pop);
// 变异
mutate(new_pop);
// 更新种群
for (int i = 0; i < POP_SIZE; i++) {
pop[i] = new_pop[i];
}
}
// 打印最终种群及其适应度
print_pop(pop);
return 0;
}
```
这段代码实现了免疫遗传算法的基本操作,包括初始化种群、计算适应度、选择、交叉和变异。在实际应用中,还需要根据具体问题对算法进行改进和优化。
阅读全文