用c写个遗传算法基础模型
时间: 2023-03-23 11:01:36 浏览: 43
遗传算法是一种基于自然选择和遗传进化原理的优化算法,可以用于寻找问题的最优解或次优解。下面是一个基础的遗传算法模型,使用C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define POP_SIZE 10 // 种群大小
#define GEN_LEN 6 // 基因长度
#define MAX_GEN 100 // 最大迭代次数
#define CROSS_RATE 0.6 // 交叉概率
#define MUT_RATE 0.1 // 变异概率
// 随机生成一个0或1的二进制数
int rand_bit() {
return rand() % 2;
}
// 随机生成一个长度为len的二进制串
void rand_gen(int len, int *gen) {
for (int i = 0; i < len; i++) {
gen[i] = rand_bit();
}
}
// 计算个体的适应度,这里的适应度定义为二进制数的十进制值
int calc_fit(int *gen) {
int fit = 0;
for (int i = 0; i < GEN_LEN; i++) {
fit += gen[i] * (1 << (GEN_LEN - i - 1));
}
return fit;
}
// 选择操作,这里采用轮盘赌算法
void select(int pop[][GEN_LEN], int *fit) {
int sum_fit = 0;
for (int i = 0; i < POP_SIZE; i++) {
sum_fit += fit[i];
}
int *select_prob = malloc(POP_SIZE * sizeof(int));
select_prob[0] = fit[0] * 100 / sum_fit;
for (int i = 1; i < POP_SIZE; i++) {
select_prob[i] = select_prob[i-1] + fit[i] * 100 / sum_fit;
}
int new_pop[POP_SIZE][GEN_LEN];
for (int i = 0; i < POP_SIZE; i++) {
int r = rand() % 100;
for (int j = 0; j < POP_SIZE; j++) {
if (r < select_prob[j]) {
for (int k = 0; k < GEN_LEN; k++) {
new_pop[i][k] = pop[j][k];
}
break;
}
}
}
for (int i = 0; i < POP_SIZE; i++) {
for (int j = 0; j < GEN_LEN; j++) {
pop[i][j] = new_pop[i][j];
}
}
free(select_prob);
}
// 交叉操作,这里采用单点交叉
void crossover(int *gen1, int *gen2) {
int pos = rand() % GEN_LEN;
for (int i = pos; i < GEN_LEN; i++) {
int tmp = gen1[i];
gen1[i] = gen2[i];
gen2[i] = tmp;
}
}
// 变异操作,这里采用单点变异
void mutate(int *gen) {
int pos = rand() % GEN_LEN;
gen[pos] = !gen[pos];
}
int main() {
srand(time(NULL));