#include "stdioh"//标准io头文件
#include "stdlibh"//库文件
#include "timeh"//时间系头文件
#define N0 100000 //定义常量
typedef int keytype; //类型命名
typedef struct node //定义结构体
{ keytype key; //只是类型命名成keytype,其实就是int的
}Etp;//结构体类型叫做Etp
Etp R[N0+1]; // R[1]R[n] //定义数组
int n=50, count;//全局变量
void readData( Etp R[], int n)//读数据的函数
{ int i;
count=0;
srand( time( NULL ));//初始化时间种子
for( i=1; i<=n; i++) //对数组初始化
R[i]key=1000+
(int)((99990-1000)rand()/RAND_MAX); // 0RAND_MAX
}
void printData( Etp R[], int n )//打印显示数据的函数
{ int i;
for( i=1; i<=n; i++)
printf("%8d%s", //格式化显示数组的数据
R[i]key, i%5==0"\n":"");
printf("\ncount=%d\n", count);
}
void bubberSort( Etp R[], int n )//冒泡排序的函数
{ int i,j;//(这个函数块就是冒泡排序的算法程序)
bool swap;
for( i=1; i<=n-1; i++)
{ swap=false;
for( j=1; j<=n-i; j++)
if( count++,R[j]key>R[j+1]key )
{ R[0]=R[j];
R[j]=R[j+1];
R[j+1]=R[0];
swap=true;
}
if( !swap ) break;
}
}
void bubberSort1( Etp R[], int n )//这个也是另一个冒泡排序的函数
{ int j;//跟上面不同的是这个算法用的是递归的方式,上面的是非递归的
for( j=1; j<=n-1; j++)
if( count++,R[j]key>R[j+1]key )
{ R[0]=R[j];
R[j]=R[j+1];//________;//就是两个变量交换值
R[j+1]=R[0];
}
if( n>1 ) bubberSort1( R, n-1); //___________;//递归调用
}
void selectSort( Etp R[], int n )//这个是选择排序
{ int i,j,k;//(这个函数块就是选择排序的算法程序)
for( i=1; i<=n-1; i++)
{
k=i;
for( j=i+1; j<=n; j++)
if( count++,R[j]key<R[k]key ) k=j;
if( k!=i )
{ R[0]=R[i];
R[i]=R[k];
R[k]=R[0];
}
}
}
void insertSort( Etp R[], int n )//这个是插入排序
{ int i,j;
for( i=2; i<=n; i++)
{
R[0]=R[i];
j=i-1;
while( count++,R[j]key>R[0]key ) R[j+1]=R[j--];
R[j+1]=R[0];
count++;
}
}
void sift( Etp R[], int i, int m)//堆排序中的步骤
{ int k=2i;
R[0]=R[i];
while( k<=m )
{ if( count++, k+1<=m && R[k+1]key>R[k]key) k++;
if( count++,R[0]key<R[k]key ) R[i]=R[k];
else break;
i=k;
k=2i;
}
R[i]=R[0];
}
void heapSort( Etp R[], int n )//这个是堆排序
{ int j;
for( j=n/2; j>=1; j--) sift( R, j, n);
for( j=n; j>=2; j--)
{ R[0]=R[1];
R[1]=R[j];
R[j]=R[0];
sift( R, 1, j-1 );
}
}
int main()//主函数的进入口
{
readData( R, n );//读取数据
bubberSort1( R, n );//调用递归冒泡排序
printData( R, n);//显示数据
readData( R, n );//读取数据
selectSort( R, n );//调用选择排序
printData( R, n);//显示数据
readData( R, n );//读取数据
insertSort( R, n );//调用插入排序
printData( R, n);//显示数据
readData( R, n );//读取数据
heapSort( R, n );//调用堆排序
printData( R, n);//显示数据
return 0;
}
//诶·~注释完我总算看出来了,难道你要我解释各个排序的过程?
//那你还不如直接baidu或者看书,你要是不理解原理是不可能看懂过程的。
//注释也只是语句的解释,但是过程的含义是无法描述的
(1)关于fitness value,你要自己定义一个函数,如你所说从25个x变量经过一系列运算得到y值 可以其作为fitness value
(2)由于x的取值是离散的 染色体不一定要是二进制 最简单的做法是一个5进制的长为25的串。
发现的几处错误:
1、适应度函数里面if a[i]=4改为if a(i)==4,类似的还有if b[i]=4。不需要多解释了吧?一个是数组注意和C语言风格区别,另一个是判断相等的符号问题。
2、适应度函数应返回列向量,在fit函数最后加一句:fitness=fitness(:);
3、选择的结果是种群规模减小,不能使用固定的出示规模20,应把适应度函数里面两处循环for i=1:20改为for i=1:size(x,1)。
4、主函数里面rein应为reins。
代码写到一个M文件中:
function zd%% 初始化遗传算法参数
%初始化参数
NIND=20;
MAXGEN=100;
NVAR=8;
PRECI=1;
GGAP=09;% 进化代数,即迭代次数
% 种群规模
%% 初始化种群计算适应度值
% 初始化种群
FieldD=[rep(PRECI,[1,NVAR]);rep([0;1],[1,NVAR]);rep([1;0;1;1],[1,NVAR])];
Chrom=crtbp(NIND,NVARPRECI);
ObjV=fit(bs2rv(Chrom,FieldD));
gen=0;
while gen<MAXGEN
FitnV=ranking(ObjV);
SelCh=select('sus',Chrom,FitnV,GGAP);
SelCh=recombin('xovsp',SelCh,07);
SelCh=mut(SelCh,007);
ObjVSel=fit(bs2rv(SelCh,FieldD));
[Chrom ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel);
gen=gen+1
%找最好的染色体
trace(gen,1)=min(ObjV);
trace(gen,2)=sum(ObjV)/length(ObjV);
end
plot(trace(:,1)); hold on;
plot(trace(:,2)); grid;
legend('average','bestfitness');
function [fitness]=fit(x)
for i=1:size(x,1)
i
%随机产生一个种群
if (x(i,6)x(i,7)-x(i,8)x(i,6))(x(i,3)x(i,2)-x(i,4)x(i,1))==0
x(i,:)=unidrnd(2,1,8)-1;
end%染色体的适应度
end
a=x(:,1)+x(:,2)+x(:,3)+x(:,4);
b=x(:,5)+x(:,6)+x(:,7)+x(:,8);
for i=1:size(x,1)
i
if a(i)==4
c=1;
else
c=0;
end
if b(i)==4
d=1;
else
d=0;
end
fitness(i)=c+d;
end
fitness=fitness(:);
以上就是关于排序算法的设计(c语言)根据程序画流程图及对每句程序加注释全部的内容,包括:排序算法的设计(c语言)根据程序画流程图及对每句程序加注释、遗传算法matlab程序最后目标函数值与自己的初始点所求得的值偏差太大、matlab遗传算法代码检查错误等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)