⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gen.c

📁 一遗传算法的例子源程序
💻 C
字号:
#include <stdlib.h>
#include <string.h>
#include "lithos.h"

static int __cdecl compare(const Program *p0, const Program *p1)
{
	if (p1->fitness < p0->fitness)
		return -1;
	if (p1->fitness > p0->fitness)
		return 1;
	return p1->sort - p0->sort;
}

static int chooseParent()
{
	int i;
	for (i = 0; i < tournamentSize; i++)
	{
		int p = random() % population;
		tournament[i] = programs[p];
		tournament[i].index = p;
		tournament[i].sort = random();
	}
	qsort(tournament, tournamentSize, sizeof(Program), compare);
	return tournament[0].index;
}

static void copy(Program *from, Program *to)
{
	memcpy(to->code, from->code, from->size);
	to->size = from->size;
}

static int isLabel(int i)
{
	return i == LABEL0 || i == LABEL1;
}

static int findBlocks(char *code, int size, int *blocks)
{
	int i;
	int j = 0;
	blocks[j++] = 0;
	for (i = 0; i < size - 1; i++)
		if (isLabel(code[i]) && !isLabel(code[i + 1]) ||
			!isLabel(code[i]) && isLabel(code[i + 1]))
			blocks[j++] = i;
	blocks[j++] = size;
	return j;
}

static int chooseBlock(int i, int n)
{
	while (random() % 2)
		if (random() % 2)
		{
			if (i > 0)
				i--;
		}
		else
			if (i < n - 1)
				i++;
	return i;
}

static void crossover(Program *p, Program *p1)
{
	int n0, n1;
	int n;
	int b;
	int i, j;

	n0 = findBlocks(p->code, p->size, blocks0);
	n1 = findBlocks(p1->code, p1->size, blocks1);

	n = n0;
	if (n > n1)
		n = n1;
	b = random() % n;

	i = blocks0[chooseBlock(b, n0)];
	j = blocks1[chooseBlock(b, n1)];

	n = p1->size - j;
	if (n > maxSize - i)
		n = maxSize - i;
	memcpy(p->code + i, p1->code + j, n);
	p->size = i + n;
}

static void mutate(Program *p)
{
	do
	{
		int op;
		int i;

		if (p->size == 0)
			op = 0;
		else if (p->size == maxSize)
			op = 1 + random() % 2;
		else
			op = random() % 3;

		switch (op)
		{
		case 0:
			i = random() % (p->size + 1);
			memmove(p->code + i + 1, p->code + i, p->size - i);
			p->code[i] = random() % INSTRUCTIONS;
			p->size++;
			break;
		case 1:
			i = random() % p->size;
			p->code[i] = random() % INSTRUCTIONS;
			break;
		case 2:
			i = random() % p->size;
			memmove(p->code + i, p->code + i + 1, p->size - i - 1);
			p->size--;
			break;
		}
	}
	while (random() % 2);
}

void nextGeneration()
{
	int i;
	for (i = 0; i < population; i++)
		programs[i].sort = random();
	qsort(programs, population, sizeof(Program), compare);

	for (i = overselectionRate; i < population; i++)
	{
		int p = chooseParent();
		copy(&programs[p], &newPrograms[i]);
		if (choose(crossoverRate, mutationRate))
		{
			int p1 = chooseParent();
			crossover(&newPrograms[i], &programs[p1]);
		}
		else
			mutate(&newPrograms[i]);
	}

	for (i = overselectionRate; i < population; i++)
		copy(&newPrograms[i], &programs[i]);

	for (i = 0; i < population; i++)
		programs[i].fitness = 0;

	evaluated = 0;
	generations++;
	printf("Generation %d\n", generations);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -