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

📄 ga-曲线.c

📁 遗传算法驱近函数级点的DOS绘图程序.该程序可以在5步情况下逼近函数最值.
💻 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 + -