C语言多元函数的遗传算法 遗传算法多元函数最优解原理

c语言实现*/遗传算法改进BP神经网络原理和算法实现怎么弄遗传算法有相当大的引用 。遗传算法在游戏中应用的现状在遗传编码时, 一般将瓦片的坐标作为基因进行实数编码, 染色体的第一个基因为起点坐标, 最后一个基因为终点坐标, 中间的基因为路径经过的每一个瓦片的坐标 。在生成染色体时, 由起点出发, 随机选择当前结点的邻居节点中的可通过节点, 将其坐标加入染色体, 依此循环, 直到找到目标点为止, 生成了一条染色体 。重复上述操作, 直到达到指定的种群规模 。遗传算法的优点:1、遗传算法是以决策变量的编码作为运算对象,可以直接对集合、序列、矩阵、树、图等结构对象进行操作 。这样的方式一方面有助于模拟生物的基因、染色体和遗传进化的过程,方便遗传操作算子的运用 。另一方面也使得遗传算法具有广泛的应用领域,如函数优化、生产调度、自动控制、图像处理、机器学习、数据挖掘等领域 。2、遗传算法直接以目标函数值作为搜索信息 。它仅仅使用适应度函数值来度量个体的优良程度,不涉及目标函数值求导求微分的过程 。因为在现实中很多目标函数是很难求导的,甚至是不存在导数的 , 所以这一点也使得遗传算法显示出高度的优越性 。3、遗传算法具有群体搜索的特性 。它的搜索过程是从一个具有多个个体的初始群体P(0)开始的,一方面可以有效地避免搜索一些不必搜索的点 。另一方面由于传统的单点搜索方法在对多峰分布的搜索空间进行搜索时很容易陷入局部某个单峰的极值点,而遗传算法的群体搜索特性却可以避免这样的问题,因而可以体现出遗传算法的并行化和较好的全局搜索性 。4、遗传算法基于概率规则 , 而不是确定性规则 。这使得搜索更为灵活 , 参数对其搜索效果的影响也尽可能的小 。5、遗传算法具有可扩展性 , 易于与其他技术混合使用 。以上几点便是遗传算法作为优化算法所具备的优点 。遗传算法的缺点:遗传算法在进行编码时容易出现不规范不准确的问题 。
C语言 遗传算法求f(x,y)=(1-x)^2+100(y-x^2)^2 的最小值 x,y都属于【0 , 2】#include "stdio.h"
#include "math.h"
#define NUM(64)
#define BITS(20)
typedef unsigned int uint;
typedef struct {
uintd;
double v;
double x;
double y;
}One;
typedef struct {
One pop[NUM];
}Gen;
Gen group;
#define Rand_pop() (rand()((1BITS) -1))
double range[2][2] = {{0.0, 2.0}, {0.0, 2.0}};
//min as best
double get_value(double x, double y) {
return pow(1.0-x, 2) + 100.0*pow(y-x*x, 2);
}
void get_xy(uint v, double* xx, double *yy) {
uint mx = (1(BITS/2));
uint x = v(mx - 1);
uint y = v(BITS/2);
*xx = range[0][0] + x*range[0][1]/mx;
*yy = range[1][0] + y*range[1][1]/mx;
}
void set_one(One* one, uint d)
{
one-d = d;
get_xy(d, one-x, one-y);
one-v = get_value(one-x, one-y);
}
void half_range(double *range, double x){
double hf = range[1]*0.3;
if (x - hfrange[0]) {
range[0] = x - hf;
}
range[1] = hf*2;
}
void scale_range()
{
One* one = group.pop[0];
int i;
uint hf = BITS/2;
uint mx = (1hf);
half_range(range[0], one-x);
half_range(range[1], one-y);
for (i = 0; iNUM; i++) {
if (one[i].xrange[0][0]
one[i].xrange[0][0] + range[0][1]
one[i].yrange[1][0]
one[i].yrange[1][0] + range[1][1]) {
one[i].d = (uint) ((one[i].x - range[0][0])/range[0][1]*mx) +
((uint)((one[i].y - range[1][0])/range[1][1]*mx)hf);
}
else {
set_one(one[i], one[i].d);

推荐阅读