home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 8 Other / 08-Other.zip / epo-05.zip / trans.c < prev   
C/C++ Source or Header  |  1994-04-20  |  7KB  |  258 lines

  1. /****************************************************************************
  2. *                                                                           *
  3. *   Coupling program for the evolutionary optimizer:                        *
  4. *   Calling a completely external simulator module                          *
  5. *   Version 0.5                                                             *
  6. *   19.4.94            (C) Petra Roosen                                     *
  7. *                                                                           *
  8. ****************************************************************************/
  9.  
  10. #define UNIX      /* put as comment if preparing for OS/2! */
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <math.h>
  15.  
  16. #ifndef UNIX
  17.   #include <process.h>
  18. #endif
  19.  
  20. #include "epo.h"
  21.  
  22.  
  23. /**** global variables: ****/
  24.  
  25. Paraset Indi;
  26. int     Parazahl, Runde;
  27. Iniset  Limits[5];
  28. FILE    *infile, *outfile, *flagfile;
  29. char    Transdir[250];
  30. int     sleeptime=1;
  31.  
  32.  
  33. /**** function prototypes: ****/
  34.  
  35. void    main(void);
  36. void    init(void);
  37. bool    empfange(void);
  38. void    rufe(void);
  39. bool    verschicke(void);
  40.  
  41.  
  42. /**************************************************************************/
  43. /**************************************************************************/
  44. /******************* Begin of target function determination ***************/
  45.  
  46. void rufe()  /* Aufruf eines externen Simulators */
  47. {
  48.   double  Ergebnis;
  49.   char    Aufruf[250];
  50.   FILE    *rausfile;
  51.  
  52.   /*************************************************************************
  53.   Hier wird beispielhaft ein externer Simulator mit 5 Uebergabeparametern
  54.   aufgerufen, z.B. das beigelegte Gaussfit-Program, das als Parameter
  55.  
  56.     1: Messdatenfile-Name (bestehend aus {x,y}-Paaren gemaess dem File "rein"
  57.     2: Amplitude der theoretischen Gaussverteilung (1. Fitparameter)
  58.     3: Mittenwert der theor. Gaussvert. (2. Fitparameter)
  59.     4: Standardabweichung der theor. Gaussvert. (3. Fitparameter)
  60.     5: Ergebnisdatenfile-Name
  61.  
  62.   erwartet. Auch hier ist es wieder sinnvoll, Uebergabefiles auf einer
  63.   RAM-Disk zu verwalten.
  64.  
  65.   Beim Auswerten des vom externen Simulators geschriebenen Ergebnisfiles
  66.   muss auf dessen Formatierungen Ruecksicht genommen werden!
  67.   *************************************************************************/
  68.  
  69.   sprintf(Aufruf, "gaussfit rein %f %f %f raus\n",
  70.           Indi.koeff[0], Indi.koeff[1], Indi.koeff[2]);
  71.  
  72.   system(Aufruf);
  73.  
  74.   rausfile = fopen("raus", "r");
  75.   fscanf(rausfile, "%*s %*s %*s %lG", &Ergebnis);
  76.   fclose(rausfile);
  77.  
  78.   Indi.Ergebnis = Ergebnis;
  79. }
  80.  
  81. /******************** End of target function determination *****************/
  82. /***************************************************************************/
  83. /***************************************************************************/
  84.  
  85. void main()
  86. {
  87.   bool klappt;     
  88.  
  89.   init();          /* for transfer directory determination only */
  90.  
  91.   forever
  92.   {
  93.     Runde++;
  94.     klappt = empfange();
  95.     rufe();
  96.     printf("%d. simulator result: %G           sleep time %d\n",
  97.            Runde, Indi.Ergebnis, sleeptime);
  98.     klappt = verschicke();
  99.   }
  100. }
  101.  
  102.  
  103. void init()
  104. {
  105.   FILE    *fp;
  106.   char    dummy[250];
  107.  
  108.   printf("\n\n");
  109.   printf("  **************************************************\n");
  110.   printf("  * Addressing for external simulator for the      *\n");
  111.   printf("  * evolutionary parameter optimizer               *\n");
  112.   printf("  * for general optimization problems              *\n");
  113.   printf("  *                                                *\n");
  114.   printf("  * Shareware version 0.5    (C)3/94  Petra Roosen *\n");
  115.   printf("  **************************************************\n\n");
  116.  
  117.  
  118.   /******* Einlesen des Transfer-Directories ******/
  119.   if ( (fp=fopen("strateg.dat","r")) )
  120.     {
  121.       fscanf(fp, "%s", dummy);
  122.       if ( strcmp(dummy, "EPO-0.5") )
  123.       {
  124.         printf("\007Wrong initialization file at the identification header!\n");
  125.         sleep(5);
  126.         exit(0);
  127.       }
  128.       fscanf(fp, "%*s");
  129.       fscanf(fp, "%*s %*s");
  130.       fscanf(fp, "%*s %*d");
  131.       fscanf(fp, "%*s %*d");
  132.       fscanf(fp, "%*s %*d");
  133.       fscanf(fp, "%*s %*d");
  134.       fscanf(fp, "%*s %*d");
  135.       fscanf(fp, "%*s %*s");
  136.       fscanf(fp, "%*s %*s");
  137.       fscanf(fp, "%s %s", dummy, Transdir);
  138.       if ( strcmp(dummy, "transfer_dir") )
  139.       {
  140.         printf("\007Faulty initialization file at \"transfer_dir\"!\n");
  141.         sleep(5);
  142.         exit(0);
  143.       }
  144.       fclose(fp);
  145.     }
  146. }
  147.  
  148.  
  149. bool empfange()
  150. {
  151.   int i, gelesen;
  152.   char aktFile[250];
  153.  
  154.  
  155.   sprintf(aktFile, "%so2s.msg", Transdir);
  156.  
  157.   do    /** auf die Existenz des Message-Files warten **/
  158.   {
  159. #ifdef UNIX
  160.     sleep(1);
  161. #else
  162.     _sleep2(400);
  163. #endif
  164.     flagfile = fopen(aktFile, "r");
  165.   }
  166.     while (flagfile == NULL);
  167.   fclose(flagfile);
  168.   remove(aktFile);
  169.  
  170.   sprintf(aktFile, "%so2s.dat", Transdir);
  171.  
  172. lies_Daten:
  173. #ifdef UNIX
  174.     sleep(sleeptime);
  175. #else
  176.     _sleep2(sleeptime);
  177. #endif
  178.   infile = fopen(aktFile, "r");
  179.  
  180.   if (infile == NULL)
  181.     {
  182.       printf("\007\007");
  183.       printf("There is no data file, although the message file was found.\n");
  184.       printf("Is there another program interfering with the file transfer\n");
  185.       printf("between optimizer and simulator??\n");
  186.       printf("Program dies because of error state!\n");
  187.       sleep(5);
  188.       exit(0);
  189.     }
  190.  
  191.   fscanf(infile, "%*s %*s %d %*s", &Parazahl);
  192.   if (Parazahl == 0)
  193.     {
  194.       printf("Stop message received from optimizer: simulator dies.\n");
  195.       fclose(infile);
  196.       sleep(5);
  197.       remove(aktFile);
  198.       exit(0);
  199.     }
  200.  
  201.   for (i=0; i<Parazahl; i++)
  202.   {
  203.     gelesen = fscanf(infile, "%s %lf %lf",
  204.                      Limits[i].Name, &(Indi.koeff[i]), &(Indi.dkoeff[i]) );
  205.     if (gelesen != 3)
  206.       {
  207.         fclose(infile);
  208.         sleeptime += 2;
  209.         goto lies_Daten;
  210.       }
  211.     sleeptime--;
  212.     sleeptime = max(sleeptime, 0);
  213.   }
  214.   fscanf(infile, "%*s %d %*s %d %*s %d %*s %d",
  215.          &(Indi.Kennzahl), &(Indi.Mama), &(Indi.Papa), &(Indi.Alter) );
  216.   fclose(infile);
  217.  
  218.   remove("o2s.dat");
  219.   remove("o2s.msg");
  220.  
  221.   return TRUE;
  222. }
  223.  
  224.  
  225. bool verschicke()
  226. {
  227.   int  i;
  228.   char aktFile[250];
  229.  
  230.  
  231.   sprintf(aktFile, "%ss2o.dat", Transdir);
  232.   outfile = fopen(aktFile, "w");
  233.  
  234.   if (outfile != NULL)
  235.     {
  236.       fprintf(outfile, "Ergebnis zu Kennzahl %d mit %d Parametern\n\n",
  237.               Indi.Kennzahl, Parazahl);
  238.       for (i=0; i<Parazahl; i++)
  239.       {
  240.         fprintf(outfile, "%s %G %G\n",
  241.                 Limits[i].Name, Indi.koeff[i], Indi.dkoeff[i]);
  242.       }
  243.       fprintf(outfile, "Mama     %d\n", Indi.Mama);
  244.       fprintf(outfile, "Papa     %d\n", Indi.Papa);
  245.       fprintf(outfile, "Alter    %d\n", Indi.Alter);
  246.       fprintf(outfile, "Ergebnis %G\n", Indi.Ergebnis);
  247.       fclose(outfile);
  248.       sprintf(aktFile, "%ss2o.msg", Transdir);
  249.       flagfile = fopen(aktFile, "w");
  250.       fclose(flagfile);
  251.  
  252.       return TRUE;
  253.         }
  254.         else
  255.             return FALSE;
  256. }
  257.  
  258.