📄 ga-曲线.c
字号:
#include "stdio.h"
#include "math.h"
#include "conio.h"
#include "stdlib.h"
#include "graphics.h"
#define closegr closegraph
int steps=0;
int xBinary[20][24];
double total=0;
double averagePercentFx = 1.0/20.0;
double percentFx[20];
double xValue[20][2];
double fx[20];
void reproduction();
void crossover();
void mutation();
void init();
void decode();
void calculateFx();
void calculatePercentFx();
void createIndividualString();
int display();
void reproduction(){
decode();
calculateFx();
calculatePercentFx();
createIndividualString();
}
void crossover(){
int tempB[20][24];
int k=0,i=0,n=0;
for(k=0;k<20;k++){
for(i=0;i<24;i++){
tempB[k][i]=0;
}
}
for(k=0;k<10;k++){
n = rand()%11;
if(n<0){
n=-n;
}
if((steps%2)==0){
for(i=0;i<24;i++){
if(i>n&&i<11+n){
tempB[2*k][i]=xBinary[2*k+1][i];
tempB[2*k+1][i]=xBinary[2*k][i];
}else{
tempB[2*k][i]=xBinary[2*k][i];
tempB[2*k+1][i]=xBinary[2*k+1][i];
}
}
}else{
if((k%2)==1){
for(i=0;i<24;i++){
if(i>n&&i<11+n){
tempB[2*k-1][i]=xBinary[2*k+1][i];
tempB[2*k+1][i]=xBinary[2*k-1][i];
}else{
tempB[2*k-1][i]=xBinary[2*k-1][i];
tempB[2*k+1][i]=xBinary[2*k+1][i];
}
}
}else{
for(i=0;i<24;i++){
if(i>n&&i<11+n){
tempB[2*k][i]=xBinary[2*(k+1)][i];
tempB[2*(k+1)][i]=xBinary[2*k][i];
}else{
tempB[2*k][i]=xBinary[2*k][i];
tempB[2*(k+1)][i]=xBinary[2*(k+1)][i];
}
}
}
}
}
for(k=0;k<20;k++){
for(i=0;i<24;i++){
xBinary[k][i]=tempB[k][i];
}
}
}
void mutation(){
int pc,i=0,j=0;
for(i=0;i<20;i++){
pc = rand()%10000;
if(pc<=10){
j=rand()%24;
if(xBinary[i][j]==0){
xBinary[i][j]=1;
}else{
xBinary[i][j]=0;
}
}
}
}
void init(){
int i=0,j=0;
for(i=0;i<20;i++){
xValue[i][0]=0;
xValue[i][1]=0;
}
for(i=0;i<20;i++){
for(j=0;j<24;j++){
xBinary[i][j]=rand()%2;
if(xBinary[i][j]<0){
xBinary[i][j]=-xBinary[i][j];
}
}
}
}
void decode(){
int i,k=0;
double temp=0;
for(k=0;k<20;k++){
temp=0;
for(i=0;i<12;i++){
temp=temp+0.001*(xBinary[k][i]*pow(2,i));
}
xValue[k][0]=temp-2.048;
temp=0;
for(i=12;i<24;i++){
temp=temp+0.001*(xBinary[k][i]*pow(2,(i-12)));
}
xValue[k][1]=temp-2.048;
}
}
void calculateFx(){
int i=0;
total = 0;
for(i=0;i<20;i++){
fx[i]=100*pow((pow(xValue[i][0],2)-xValue[i][1]),2)
+pow((1-xValue[i][0]),2);
total = total+fx[i];
}
}
void calculatePercentFx(){
int k=0;
for(k=0;k<20;k++){
percentFx[k]=fx[k]/total;
}
}
void createIndividualString(){
int exp[20],num=0;
double tempd=0;
int temp[20][24];
int k=0,i=0,j=0;
for(i=0;i<20;i++){
exp[i]=0;
}
for(k=0;k<20;k++){
for(i=0;i<24;i++){
temp[k][i]=0;
}
}
for(k=0;k<20;k++){
tempd = percentFx[k]*20; /* fi = percentFx[k]/averagePercentFx; */
exp[k]=(int)tempd;
tempd = tempd - exp[k];
if(tempd>0.5){
exp[k]=exp[k]+1;
}
}
for(k=0;k<20;k++){
if(num==20){
break;
}
if(exp[k]>0){
for(i=0;i<exp[k];i++){
if(i>=exp[k]){
break;
}
for(j=0;j<24;j++){
temp[num][j]=xBinary[k][j];
}
num++;
}
}
}
for(k=0;k<20;k++){
for(j=0;j<24;j++){
xBinary[k][j]=temp[k][j];
}
}
}
void initgr(void) /* BGI初始化 */
{
int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同样效果 */
int arw[16]={10,200,10,400,10,400,200,400};/*坐标系坐标*/
registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */
initgraph(&gd, &gm, "");
}
int display(){
int i=0,j=0;
double tempd=0;
tempd = fx[0];
for(i=0;i<20;i++){
if(tempd<fx[i]){
tempd = (int)fx[i];
j=i;
}
}
/*printf("Fx = %.3f\n",tempd);*/
return tempd;
}
main(){
int i=0,m;
int a,b;
int max = 8;
/*double tempd;*/
/*char arw[8];*/
/*arw[8]={a,b-150,a,b,a,b,a+160,b};坐标系坐标*/
init();
initgr();
a=getmaxx()/2-50;
b=getmaxy()/2+50;
setbkcolor(15);
setcolor(1);
line(a,b-160,a,b);
line(a,b,a+170,b);
circle(a,b-157,1);
circle(a+167,b,1);
/*drawpoly(4,arw);*/
circle(a,b+5,3);
/*setcolor(3);*/
for(i=1;i<10;i++)
{
if(i%2==0){
line(a+5*i,b-(int)3905.926/30,a+5+5*i,b-(int)3905.926/30);
}
continue;
}
setcolor(4);
for(i=0;i<max;i++){
steps=i%2;
reproduction();
m=display();
circle(a+20+20*i,b-(int)(m/30),2);
crossover();
mutation();
}
getch(); /* 暂停一下,看看前面绘图代码的运行结果 */
closegr(); /* 恢复TEXT屏幕模式 */
return 0;
/*printf("\ninput any key to exit !");
printf("\n");*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -