c语言 排课系统 利用栈,如何用c语言去实现排课系统的开发,
排课系统的开发是基于遗传算法的这里有遗传算法框架,可运行的!!就是不懂得排课系统的分析需求!如何改造适应度函数,求高手指点……
#include
#include
#include
#include
#define POPSIZE 500 //种群大小
#define chromlength 8 //染色体长度
int popsize ; //种群大小
int maxgeneration; //最大世代数
double pc = 0.0; //交叉率
double pm = 0.0; //变异率
struct individual //定义染色体个体结构体
{
int chrom[chromlength]; //定义染色体二进制表达形式,edit by ppme 将char 转为 int
double value; //染色体的值
double fitness; //染色体的适应值
};
int generation; //当前执行的世代数
int best_index; //最好的染色体索引序号
int worst_index; //最差的染色体索引序号
struct individual bestindividual; //最佳染色体个体
struct individual worstindividual; //最差染色体个体
struct individual currentbest; //当前最好的染色体个体 currentbest
struct individual population[POPSIZE];//种群数组
//函数声明
void generateinitialpopulation(); //ok-初始化当代种群
void generatenextpopulation(); //??产生下一代种群
void evaluatepopulation(); //评价种群
void calculateobjectfitness(); //计算种群适应度
//long decodechromosome(char *,int,int);//染色体解码
double decodechromosome(int,int); //染色体解码
void findbestandworstindividual(); //寻找最好的和最坏的染色体个体
void performevolution(); //进行演变进化
void selectoperator(); //选择操作
void crossoveroperator(); //交换操作
void mutationoperator(); //变异操作
void input(); //输入接口
void outputtextreport(); //输出文字报告
void main() //主函数
{
int i;
srand((unsigned)time(NULL)); //强制类型转化,以当前时间戳定义随机数种子
printf("本程序为求函数y=x*x的最大值\n");
generation=0; //初始化generation当前执行的代
input(); //初始化种群大小、交叉率、变异率
/*edit by ppme*/
//调试用。。。。。显示input()结果
printf("popsize %d;maxgeneration %d;pc %f;pm %f\n\n",popsize,maxgeneration,pc,pm);
/*edit by ppme*/
generateinitialpopulation(); //产生初始化种群
evaluatepopulation(); //评价当前种群,(A.计算种群/个体的适应度;B.找出最好和最差的个体)
while(generation
{
generation++;
generatenextpopulation(); //生成子代种群(A.选择; B.交叉; C.变异)
evaluatepopulation(); //评价新生子代种群
performevolution(); //进行子代进化
outputtextreport(); //输入当代最终种群
}
printf("\n");
printf(" 统计结果: ");
printf("\n");
printf("最大函数值等于:%f\n",currentbest.fitness);
printf("其染色体编码为:");
//计算currentbest的value
for( i = 0 ; i < chromlength ; i++ )
printf(" %d",currentbest.chrom[i]);
}
void generateinitialpopulation( ) //种群初始化
{
int i,j;
srand((unsigned)time(NULL)); //强制类型转化,以当前时间戳定义随机数种子
for (i=0;i
{
for(j=0;j
{
population[i].chrom[j]=(rand()%10<5)?0:1; //rand()%10随机产生0-9的整数
//,小于5标注0,否则标注1
}
}
}
void generatenextpopulation() //生成下一代
{
selectoperator();
crossoveroperator();
mutationoperator();
}
void evaluatepopulation() //评价种群???
{
calculateobjectfitness(); //计算种群?个体的适应度
findbestandworstindividual(); //赵到最好和最差的染色体个体
}
void calculateobjectfitness() //计算染色体个体适应值和适应度
{
int i;
int j;
printf("calculateobjectfitness is executing!");
for(i=0;i
{
double temp;
temp=decodechromosome(i,chromlength); //计算个体适应值
population[i].value=(double)temp;
population[i].fitness=population[i].value*population[i].value;
}
//调试用
printf("显示当前种群结果:\n");
for(i = 0 ; i < popsize ; i++)
{
for(j = 0 ; j < chromlength ; j++)
{
printf(" %d",population[i].chrom[j]);
}
printf(" %lf",population[i].value);
printf(" %lf",population[i].fitness);
printf("\n");
}
}
//error
double decodechromosome(int pop_index , int length) //给染色体解码
{
int i;
double decimal=0;
for( i = 0 ; i < length ; i++ )
decimal += population[pop_index].chrom[i]*pow(2,i); //遍历染色体二进制编码,
return (decimal); //并计算出其10进制的value值
}
void findbestandworstindividual( ) //求最佳个体和最差个体
{
int i;
double sum=0.0;
bestindividual=population[0];
worstindividual=population[0];
for (i=1;i
{
if (population[i].fitness>bestindividual.fitness) //依次比较,找出最佳个体
{
bestindividual=population[i];
best_index=i;
}
else if (population[i].fitness
{
worstindividual=population[i];
worst_index=i;
}
sum+=population[i].fitness; //sum 存放种群总体适应值
}//for
if (generation==0)
{
currentbest=bestindividual; //第一代最好的暂时存放在currentbest
}
else
{
if(bestindividual.fitness>=currentbest.fitness)//第n代最好的,通过比较大于以往最好个体的话,
{ //暂时存放在currentbest
currentbest=bestindividual;
}
}
}
void performevolution() //演示评价结果
{
if (bestindividual.fitness>currentbest.fitness)
{
currentbest=population[best_index];
}
else
{
population[worst_index]=currentbest;
}
}
void selectoperator() //比例选择算法
{
int i,index;
double p,sum=0.0; //p存放随机概率,sum存放个体适应率和累计适应率
double cfitness[POPSIZE]; //当代种群染色体个体的适应率
struct individual newpopulation[POPSIZE]; //新种群
srand((unsigned) time(NULL)); //种下随机种子
for(i=0;i
{
sum+=population[i].fitness; //sum存放种群适应值总和
}
for(i=0;i
cfitness[i]=population[i].fitness/sum; // cfitness[] = fitness/sum得到个体适应率
}
for(i=1;i
cfitness[i]=cfitness[i-1]+cfitness[i]; //cfitness[]= cfitness[i-1]+cfitness[i]得到种群
} //累计适应率
for (i=0;i
{
p=rand()%1000/1000.0; //得到千分位小数
index=0;
while (p>cfitness[index])
{
index++;
}
newpopulation[i]=population[index]; //选出的个体组成新的一代,暂时存放于newpopulation[]中
}
for(i=0;i
population[i]=newpopulation[i]; //全局变量populaiton存放新的种群(有重复的值)
}
}
void crossoveroperator() //交叉算法
{
int i,j;
int index[POPSIZE];
int point,temp;
double p;
srand((unsigned) time(NULL)); //种下随机种子
for (i=0;i
index[i]=i;
}
for (i=0;i
point=rand()%(popsize-i); //打乱种群顺序
temp=index[i];
index[i]=index[point+i];
index[point+i]=temp;
}
for (i=0;i
p=rand()%1000/1000.0;
if (p
point=rand()%(chromlength-1)+1;
for (j=point; j
temp=population[index[i]].chrom[j];
population[index[i]].chrom[j]=population[index[i+1]].chrom[j];
population[index[i+1]].chrom[j]=temp;
}
}
}
}
void mutationoperator() //变异操作
{
int i,j;
double p;
srand((unsigned) time(NULL)); //种下随机种子
for (i=0;i
for(j=0;j
p=rand()%1000/1000.0;
if (p
population[i].chrom[j]=(population[i].chrom[j]==0)?1:0;
}
}
}
}
void input() //数据输入
{
printf("初始化全局变量:\n");
printf(" 种群大小(50-500偶数):");
scanf("%d", &popsize); //输入种群大小,必须为偶数
if((popsize%2) != 0)
{
printf( " 种群大小已设置为偶数\n");
popsize++;
};
printf(" 最大世代数(100-300):"); //输入最大世代数
scanf("%d", &maxgeneration);
printf(" 交叉率(0.2-0.99):"); //输入交叉率
scanf("%lf", &pc);
printf(" 变异率(0.001-0.1):"); //输入变异率
scanf("%lf", &pm);
}
void outputtextreport()//数据输出
{
int i;
double sum;
double average;
sum=0.0;
for(i=0;i
{
sum+=population[i].value;
}
average=sum/popsize;
printf("当前世代=%d\n当前世代染色体平均值=%f\n当前世代染色体最高值=%f\n",generation,average,population[best_index].value);
}
评分
c语言 排课系统 利用栈,如何用c语言去实现排课系统的开发,相关推荐
- 如何用c语言读取硬盘串号_如何用C语言实现OOP
我们知道面向对象的三大特性分别是:封装.继承.多态.很多语言例如:C++和Java等都是面向对象的编程语言,而我们通常说C是面向过程的语言,那么是否可以用C实现简单的面向对象呢?答案是肯定的!C有一种 ...
- c语言 排课系统 利用栈,C语言-课表排课系统
功能模块概要说明: 1.输入函数: char* uscanf(int,int,int) //图形模式下输入函数,大小写26个字母0-9数字外加空格键为有效输入,可以使用BACKSPACE. 2.开始界 ...
- 用c语言写一个两线程程序,如何用C语言实现多线程
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Windows操作系统,C语言实现多线程: #include #include DWORD APIENTRY ThreadOne ( LPVOID thr ...
- 考试系统主服务器进入 分机进不去,为什么驾校考试系统网址进不去
1 夜间驾驶机动车驶近坡道顶端路段时,应开启远光灯加速冲过坡顶.查看本题分析 2 驾驶机动车以70公里/小时的速度在没有限速标志的同向3车道的高速公路上行驶,应该走最右侧车道.查看本题分析 3 看到这 ...
- C语言中字符数据超过127,如何用C语言显示ascii码超过127的字符
C语言的程序代码如下: #include "stdio.h" main() {inti; for (i=1;i<256;i++) { printf("%c &quo ...
- c语言求矩阵特征值的程序,如何用C语言编写求对称矩阵的特征值和特征向量的程序编写对称矩阵的特征值和特征向量,其中矩阵用二维数组保存.特征向量要求有大到小放到数组里....
优质解答 //数值计算程序-特征值和特征向量 // //约化对称矩阵为三对角对称矩阵 //利用Householder变换将n阶实对称矩阵约化为对称三对角矩阵 //a-长度为n*n的数组,存放n阶实对称 ...
- c语言实现文件数据删除视频,如何用c语言实现删除文件中指定的数据;例如
匿名用户 1级 2012-05-21 回答 你的描述不清晰,B1和B2两个结构数组,到底要删除哪个?B[2]是肯定不对的,这两个数组的长度都是2,下标只能是0和1,即B1[0], B1[1], B2[ ...
- 用c语言编写名字用字母表示,如何用C语言编写自己的姓名和学号
可以参考下面的代码:#include<stdio.h>#include<stdlib.h>intmain(void){FILE*fp=fopen("data.txt& ...
- 用c语言求最大公约数的流程图,如何用c语言求最大公约数和最小公倍数
a=g_cd(m,n); if (m>n) //最小公倍数=较大的数*(较小的数/最大公约数) { b=n; b/=a; return m*b; } else { b=m; b/=a; retu ...
最新文章
- 字符流中第一个不重复的字符
- 32. Leetcode 141. 环形链表 (链表-双指针-环形链表)
- Quartz整合Spring
- 无法访问 gcr.io 的解决方案
- linux+geth+不能同步公链数据,以太坊(ETH)同步公链数据
- Oracle导入dmp文件报12504,ORA-12504:TNS :监听程序在 CONNECT_DATA 中未获得SERVICE_NAME...
- python用符号计算检验多维数组的计算
- 1024带给程序员的福利
- T-SQL MAX Functions
- Android Studio 使用socks代理
- Knockout v3.4.0 中文版教程-6-计算监控-可写的计算监控
- 二、JAVA基础、语法
- git 关于Git每次进入都需要输入用户名和密码的问题解决
- Windows下安装GitHub客户端
- Autodesk Maya 2009标准培训教材
- Savitzky-Golay 滤波器
- 【问】批量删除作废会员的语句
- 计算机截图工具无法运行,重装win7系统后打开截图工具显示“截图工具当前未在计算机上运行”如何解决...
- 马尔科夫不等式和坎泰利不等式的证明
- HTML源码小游戏——坦克大战、飞机大战、捕鱼达人