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

📄 nsga2r.c

📁 用于多目标优化的程序
💻 C
字号:
/* NSGA-II routine (implementation of the 'main' function) */# include <stdio.h># include <stdlib.h># include <math.h># include "global.h"# include "rand.h"int nreal;int nbin;int nobj;int ncon;int popsize;double pcross_real;double pcross_bin;double pmut_real;double pmut_bin;double eta_c;double eta_m;int ngen;int nbinmut;int nrealmut;int nbincross;int nrealcross;int *nbits;double *min_realvar;double *max_realvar;double *min_binvar;double *max_binvar;int bitlength;int main (int argc, char **argv){    int i;    FILE *fpt1;    FILE *fpt2;    FILE *fpt3;    FILE *fpt4;    FILE *fpt5;    population *parent_pop;    population *child_pop;    population *mixed_pop;    if (argc<2)    {        printf("\n Usage ./nsga2r random_seed \n");        exit(1);    }    seed = (double)atof(argv[1]);    if (seed<=0.0 || seed>=1.0)    {        printf("\n Entered seed value is wrong, seed value must be in (0,1) \n");        exit(1);    }    fpt1 = fopen("initial_pop.out","w");    fpt2 = fopen("final_pop.out","w");    fpt3 = fopen("best_pop.out","w");    fpt4 = fopen("all_pop.out","w");    fpt5 = fopen("params.out","w");    fprintf(fpt1,"# This file contains the data of initial population\n");    fprintf(fpt2,"# This file contains the data of final population\n");    fprintf(fpt3,"# This file contains the data of final feasible population (if found)\n");    fprintf(fpt4,"# This file contains the data of all generations\n");    fprintf(fpt5,"# This file contains information about inputs as read by the program\n");    printf("\n Enter the problem relevant and algorithm relevant parameters ... ");    printf("\n Enter the population size (a multiple of 4) : ");    scanf("%d",&popsize);    if (popsize<4 || (popsize%4)!= 0)    {        printf("\n population size read is : %d",popsize);        printf("\n Wrong population size entered, hence exiting \n");        exit (1);    }    printf("\n Enter the number of generations : ");    scanf("%d",&ngen);    if (ngen<1)    {        printf("\n number of generations read is : %d",ngen);        printf("\n Wrong nuber of generations entered, hence exiting \n");        exit (1);    }    printf("\n Enter the number of objectives : ");    scanf("%d",&nobj);    if (nobj<1)    {        printf("\n number of objectives entered is : %d",nobj);        printf("\n Wrong number of objectives entered, hence exiting \n");        exit (1);    }    printf("\n Enter the number of constraints : ");    scanf("%d",&ncon);    if (ncon<0)    {        printf("\n number of constraints entered is : %d",ncon);        printf("\n Wrong number of constraints enetered, hence exiting \n");        exit (1);    }    printf("\n Enter the number of real variables : ");    scanf("%d",&nreal);    if (nreal<0)    {        printf("\n number of real variables entered is : %d",nreal);        printf("\n Wrong number of variables entered, hence exiting \n");        exit (1);    }    if (nreal != 0)    {        min_realvar = (double *)malloc(nreal*sizeof(double));        max_realvar = (double *)malloc(nreal*sizeof(double));        for (i=0; i<nreal; i++)        {            printf ("\n Enter the lower limit of real variable %d : ",i+1);            scanf ("%lf",&min_realvar[i]);            printf ("\n Enter the upper limit of real variable %d : ",i+1);            scanf ("%lf",&max_realvar[i]);            if (max_realvar[i] <= min_realvar[i])            {                printf("\n Wrong limits entered for the min and max bounds of real variable, hence exiting \n");                exit(1);            }        }        printf ("\n Enter the probability of crossover of real variable (0.6-1.0) : ");        scanf ("%lf",&pcross_real);        if (pcross_real<0.0 || pcross_real>1.0)        {            printf("\n Probability of crossover entered is : %e",pcross_real);            printf("\n Entered value of probability of crossover of real variables is out of bounds, hence exiting \n");            exit (1);        }        printf ("\n Enter the probablity of mutation of real variables (1/nreal) : ");        scanf ("%lf",&pmut_real);        if (pmut_real<0.0 || pmut_real>1.0)        {            printf("\n Probability of mutation entered is : %e",pmut_real);            printf("\n Entered value of probability of mutation of real variables is out of bounds, hence exiting \n");            exit (1);        }        printf ("\n Enter the value of distribution index for crossover (5-20): ");        scanf ("%lf",&eta_c);        if (eta_c<=0)        {            printf("\n The value entered is : %e",eta_c);            printf("\n Wrong value of distribution index for crossover entered, hence exiting \n");            exit (1);        }        printf ("\n Enter the value of distribution index for mutation (5-50): ");        scanf ("%lf",&eta_m);        if (eta_m<=0)        {            printf("\n The value entered is : %e",eta_m);            printf("\n Wrong value of distribution index for mutation entered, hence exiting \n");            exit (1);        }    }    printf("\n Enter the number of binary variables : ");    scanf("%d",&nbin);    if (nbin<0)    {        printf ("\n number of binary variables entered is : %d",nbin);        printf ("\n Wrong number of binary variables entered, hence exiting \n");        exit(1);    }    if (nbin != 0)    {        nbits = (int *)malloc(nbin*sizeof(int));        min_binvar = (double *)malloc(nbin*sizeof(double));        max_binvar = (double *)malloc(nbin*sizeof(double));        for (i=0; i<nbin; i++)        {            printf ("\n Enter the number of bits for binary variable %d : ",i+1);            scanf ("%d",&nbits[i]);            if (nbits[i] < 1)            {                printf("\n Wrong number of bits for binary variable entered, hence exiting");                exit(1);            }            printf ("\n Enter the lower limit of binary variable %d : ",i+1);            scanf ("%lf",&min_binvar[i]);            printf ("\n Enter the upper limit of binary variable %d : ",i+1);            scanf ("%lf",&max_binvar[i]);            if (max_binvar[i] <= min_binvar[i])            {                printf("\n Wrong limits entered for the min and max bounds of binary variable entered, hence exiting \n");                exit(1);            }        }        printf ("\n Enter the probability of crossover of binary variable (0.6-1.0): ");        scanf ("%lf",&pcross_bin);        if (pcross_bin<0.0 || pcross_bin>1.0)        {            printf("\n Probability of crossover entered is : %e",pcross_bin);            printf("\n Entered value of probability of crossover of binary variables is out of bounds, hence exiting \n");            exit (1);        }        printf ("\n Enter the probability of mutation of binary variables (1/nbits): ");        scanf ("%lf",&pmut_bin);        if (pmut_bin<0.0 || pmut_bin>1.0)        {            printf("\n Probability of mutation entered is : %e",pmut_bin);            printf("\n Entered value of probability  of mutation of binary variables is out of bounds, hence exiting \n");            exit (1);        }    }    if (nreal==0 && nbin==0)    {        printf("\n Number of real as well as binary variables, both are zero, hence exiting \n");        exit(1);    }    printf("\n Input data successfully entered, now performing initialization \n");    fprintf(fpt5,"\n Population size = %d",popsize);    fprintf(fpt5,"\n Number of generations = %d",ngen);    fprintf(fpt5,"\n Number of objective functions = %d",nobj);    fprintf(fpt5,"\n Number of constraints = %d",ncon);    fprintf(fpt5,"\n Number of real variables = %d",nreal);    if (nreal!=0)    {        for (i=0; i<nreal; i++)        {            fprintf(fpt5,"\n Lower limit of real variable %d = %e",i+1,min_realvar[i]);            fprintf(fpt5,"\n Upper limit of real variable %d = %e",i+1,max_realvar[i]);        }        fprintf(fpt5,"\n Probability of crossover of real variable = %e",pcross_real);        fprintf(fpt5,"\n Probability of mutation of real variable = %e",pmut_real);        fprintf(fpt5,"\n Distribution index for crossover = %e",eta_c);        fprintf(fpt5,"\n Distribution index for mutation = %e",eta_m);    }    fprintf(fpt5,"\n Number of binary variables = %d",nbin);    if (nbin!=0)    {        for (i=0; i<nbin; i++)        {            fprintf(fpt5,"\n Number of bits for binary variable %d = %d",i+1,nbits[i]);            fprintf(fpt5,"\n Lower limit of binary variable %d = %e",i+1,min_binvar[i]);            fprintf(fpt5,"\n Upper limit of binary variable %d = %e",i+1,max_binvar[i]);        }        fprintf(fpt5,"\n Probability of crossover of binary variable = %e",pcross_bin);        fprintf(fpt5,"\n Probability of mutation of binary variable = %e",pmut_bin);    }    fprintf(fpt5,"\n Seed for random number generator = %e",seed);    bitlength = 0;    if (nbin!=0)    {        for (i=0; i<nbin; i++)        {            bitlength += nbits[i];        }    }    fprintf(fpt1,"# of objectives = %d, # of constraints = %d, # of real_var = %d, # of bits of bin_var = %d, constr_violation, rank, crowding_distance\n",nobj,ncon,nreal,bitlength);    fprintf(fpt2,"# of objectives = %d, # of constraints = %d, # of real_var = %d, # of bits of bin_var = %d, constr_violation, rank, crowding_distance\n",nobj,ncon,nreal,bitlength);    fprintf(fpt3,"# of objectives = %d, # of constraints = %d, # of real_var = %d, # of bits of bin_var = %d, constr_violation, rank, crowding_distance\n",nobj,ncon,nreal,bitlength);    fprintf(fpt4,"# of objectives = %d, # of constraints = %d, # of real_var = %d, # of bits of bin_var = %d, constr_violation, rank, crowding_distance\n",nobj,ncon,nreal,bitlength);    nbinmut = 0;    nrealmut = 0;    nbincross = 0;    nrealcross = 0;    parent_pop = (population *)malloc(sizeof(population));    child_pop = (population *)malloc(sizeof(population));    mixed_pop = (population *)malloc(sizeof(population));    allocate_memory_pop (parent_pop, popsize);    allocate_memory_pop (child_pop, popsize);    allocate_memory_pop (mixed_pop, 2*popsize);    randomize();    initialize_pop (parent_pop);    printf("\n Initialization done, now performing first generation");    decode_pop(parent_pop);    evaluate_pop (parent_pop);    assign_rank_and_crowding_distance (parent_pop);    report_pop (parent_pop, fpt1);    fprintf(fpt4,"# gen = 1\n");    report_pop(parent_pop,fpt4);    printf("\n gen = 1");    fflush(stdout);    fflush(fpt1);    fflush(fpt2);    fflush(fpt3);    fflush(fpt4);    fflush(fpt5);    for (i=2; i<=ngen; i++)    {        selection (parent_pop, child_pop);        mutation_pop (child_pop);        decode_pop(child_pop);        evaluate_pop(child_pop);        merge (parent_pop, child_pop, mixed_pop);        fill_nondominated_sort (mixed_pop, parent_pop);        /* Comment following three lines if information for all        generations is not desired, it will speed up the execution */        fprintf(fpt4,"# gen = %d\n",i);        report_pop(parent_pop,fpt4);        fflush(fpt4);        printf("\n gen = %d",i);    }    printf("\n Generations finished, now reporting solutions");    report_pop(parent_pop,fpt2);    report_feasible(parent_pop,fpt3);    if (nreal!=0)    {        fprintf(fpt5,"\n Number of crossover of real variable = %d",nrealcross);        fprintf(fpt5,"\n Number of mutation of real variable = %d",nrealmut);    }    if (nbin!=0)    {        fprintf(fpt5,"\n Number of crossover of binary variable = %d",nbincross);        fprintf(fpt5,"\n Number of mutation of binary variable = %d",nbinmut);    }    fflush(stdout);    fflush(fpt1);    fflush(fpt2);    fflush(fpt3);    fflush(fpt4);    fflush(fpt5);    fclose(fpt1);    fclose(fpt2);    fclose(fpt3);    fclose(fpt4);    fclose(fpt5);    if (nreal!=0)    {        free (min_realvar);        free (max_realvar);    }    if (nbin!=0)    {        free (min_binvar);        free (max_binvar);        free (nbits);    }    deallocate_memory_pop (parent_pop, popsize);    deallocate_memory_pop (child_pop, popsize);    deallocate_memory_pop (mixed_pop, 2*popsize);    free (parent_pop);    free (child_pop);    free (mixed_pop);    printf("\n Routine successfully exited \n");    return (0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -