0

私は遺伝的アルゴリズムを書いていますが、いくつかの構造体変数の出力に問題があります。結果が得られるため、コードがそれらを適切に読み取ることはわかっていますが、画面またはファイルにそれらを印刷しようとするとゼロになります..

これは私が使用しているコードです。助けてください...??

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define POPSIZE 50
#define MAXGENS 1000
#define NVARS 3
#define PXOVER 0.8
#define PMUTATION 0.15
#define B 2
#define TOURNAMENT_SIZE 2
#define TRUE 1
#define FALSE 0

int generation ;
int cur_best;
FILE *galog_tournament;

struct genotype
{
    double gene[NVARS];
    double fitness;
    double upper[NVARS];
    double lower[NVARS];
    double cfitness;
    double rfitness;
};

struct genotype population[POPSIZE+1];
struct genotype newpopulation[POPSIZE+1];


void initialize(void);
double randval(double,double);
void evaluate(void);
void keep_the_best(void);
void elitist(void);
void tournament_selection(void);
void crossover(void);
void random_Xover(int,int);
void swap(double *,double *);
void non_uniform_mutation(void);
void report(void);
double delta2(int,int);


void initialize(void)
{
    FILE *infile;
    FILE *bounds;
    FILE *popu;
    int i,j;
    double lbound,ubound;

    bounds = fopen("bounds.txt","w");
    popu = fopen("population.txt","w");


    if((infile = fopen("gadata.txt","r"))== NULL)
    {
        fprintf(galog_tournament,"\n Cannot open input file\n");
        exit(1);
    }


    for(i = 0; i < NVARS; i++)
    {
        fscanf(infile, "%lf",&lbound);
        fscanf(infile, "%lf",&ubound);

        printf("%lf  %lf\n",lbound,ubound);

        for(j = 0; j < NVARS; j++)
            {
                population[j].fitness = 0;
                population[j].rfitness = 0;
                population[j].cfitness = 0;
                population[j].lower[i] = lbound;
                population[j].upper[i] = ubound;

                fprintf(bounds,"%lf  %lf\n",&population[j].lower[i],&population[j].upper[i]);

                population[j].gene[i] = randval(population[j].lower[i],population[j].upper[i]);

                fprintf(popu,"%lf\n",population[j].gene[i]);
            }

    }
    fclose(infile);
    fclose(bounds);
    fclose(popu);
}

皆さん、実際にコードをデバッグして少し変更してみて、画面に値が出力されるように助けてくれてありがとう..残念ながら、まだゼロになっています..!! これは、下限と上限を含むコードと私の入力ファイルです

void initialize(void)
{
    FILE *infile;
    FILE *test;
    int i,j;
    double lbound,ubound;

    test = fopen("test.txt","w");



    if((infile = fopen("gadata.txt","r"))== NULL)
    {
        fprintf(galog_tournament,"\n Cannot open input file\n");
        exit(1);
    }


    for(i = 0; i < NVARS; i++)
    {
        fscanf(infile, "%lf",&lbound);
        fscanf(infile, "%lf",&ubound);

         printf("%lf  %lf\n",lbound,ubound);


    for (j=0; j < POPSIZE; j++) {
        population[j].fitness = 0;
        population[j].rfitness = 0;
        population[j].cfitness = 0;
        population[j].lower[i] = lbound;
        population[j].upper[i] = ubound;
        population[j].gene[i] = randval(population[j].lower[i],
                                        population[j].upper[i]);






     }


  }

    fclose(infile);
    fclose(test);

}






   0.000000 0.000000
    0.000514    0.010514
    0.011307    0.021307
    0.021876    0.031876
    0.033994    0.043994
    0.043272    0.053272
    0.050229    0.060229
    0.053976    0.063976
    0.053803    0.063803
    0.046640    0.056640
    0.029907    0.039907
    0.017619    0.027619
    0.002316    0.012316
    -0.005428   0.004572
    -0.00683    0.00317
    -0.009743   0.000257
    -0.10582    -0.09582
    -0.026304   -0.016304
    -0.027064   -0.017064
    -0.025243   -0.015243
    -0.022386   -0.012386
    -0.019108   -0.009108
    -0.015788   -0.005788
    -0.012185   -0.002185
    -0.009452   0.000548
    -0.052133   0.002867
    -0.006128   0.003872
    0.000000    0.000000
4

2 に答える 2

4

&から s を削除します。

fprintf(bounds,"%lf  %lf\n",&population[j].lower[i],&population[j].upper[i]);

したがって、次のようになります。

fprintf(bounds,"%lf  %lf\n",population[j].lower[i],population[j].upper[i]);

その変数のアドレスではなく、変数の値を出力したい。

警告を表示するようにコンパイラを設定します。この場合、問題について通知されます。

于 2013-03-01T10:48:17.067 に答える
0

fScanf が何も読み取らずに 0 を返す場合、おそらくコードを実行したくないでしょう。

while( 0 != fscanf(infile, "%lf",&ubound))
{
    if(0 == fscanf(infile, "%lf",&lbound) || i >= NVARS)      
       {
       return 0; 
       }
    else
       {
       printf("%lf  %lf\n",lbound,ubound);
       i++
       }
}

次に、何も印刷されない場合は、fscanf で何もスキャンしていないことがわかっています。scanf が何も読み取っていない場合は、配列に 0 を入力し続けたくないと思います。エラーの方向を示している可能性があります。

于 2013-03-01T13:47:16.127 に答える