home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c129 / 1.ddi / SIMPLEX.C < prev    next >
Encoding:
C/C++ Source or Header  |  1988-02-18  |  2.7 KB  |  101 lines

  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5.  
  6.  
  7. void simplex(float *constary,float *objary,float *rhsary,
  8.              int numrow,int numcol,float *optsol,int *basisid,
  9.              float *objfval)
  10. {
  11.    int strow;
  12.    int stcol;
  13.    int i;
  14.    int j;
  15.    int k;
  16.    int maxcoefc;
  17.    int minratr;
  18.    float coldiv;
  19.    float maxcoef;
  20.    float minrat;
  21.    float pivot;
  22.    char c,simpcrit1;
  23.    float *workary;
  24.  
  25.  
  26.    strow = numrow;
  27.    stcol = numcol + numrow + 2;
  28.  
  29.    workary = (float *) calloc((numrow+1)*(stcol),4);
  30.  
  31. for ( i = 0; i <= strow; ++i ) {
  32.       for ( j = 0; j <= stcol-1; ++j ) {
  33.          workary[i*stcol+j] = 0;
  34.       }
  35.    }
  36.    for ( i = 1; i <= numrow; ++i ) {
  37.       for ( j = 1; j <= numcol; ++j ) {
  38.          workary[i*stcol+j] = constary[(i-1)*(numcol)+(j-1)];
  39.       }
  40.    }
  41.    for ( j = 1; j <= numcol; ++j ) {
  42.       workary[j] = -objary[j-1];
  43.    }
  44.    workary[0] = 1.0;
  45.    for ( i = 1; i <= numrow; ++i ) {
  46.       workary[i*stcol+i + numcol] = 1.0;
  47.       workary[i*stcol+stcol-1] = rhsary[i-1];
  48.    }
  49.    basisid[0] = 0;
  50.    for ( i = 1; i <= numrow; ++i ) {
  51.       basisid[i] = i + numcol;
  52.    }
  53.    simpcrit1 = 0;
  54.    while ( (simpcrit1 == 0) ) {
  55.       maxcoef = workary[0];
  56.       maxcoefc = 0;
  57.       minrat = 99999999.0;
  58.       minratr = 0;
  59.       for ( j = 0; j <= stcol - 2; ++j ) {
  60.          if ( (workary[j] < maxcoef) && (workary[j] < 0) ) {
  61.             maxcoef = workary[j];
  62.             maxcoefc = j;
  63.          }
  64.       }
  65.       for ( i = 1; i <= strow; ++i ) {
  66.          if ( (workary[i*stcol+stcol-1] > 0) &&
  67.                    (workary[i*stcol + maxcoefc] > 0) ) {
  68.             if ( workary[i*stcol+stcol-1] / workary[i*stcol+ maxcoefc] < minrat ) {
  69.                minrat = workary[i*stcol+stcol-1] / workary[i*stcol+maxcoefc];
  70.                minratr = i;
  71.             }
  72.          }
  73.       }
  74.       basisid[minratr] = maxcoefc;
  75.       coldiv = workary[minratr*stcol+maxcoefc];
  76.       for ( j = 0; j <= stcol-1; ++j ) {
  77.          workary[minratr*stcol+j] = workary[minratr*stcol+j] / coldiv;
  78.       }
  79.       for ( i = 0; i <= strow; ++i ) {
  80.          if ( i != minratr ) {
  81.             pivot = (-workary[i*stcol+maxcoefc]);
  82.             for ( j = 0; j <= stcol-1; ++j ) {
  83.                workary[i*stcol+j] = workary[minratr*stcol+j] * pivot +
  84.                                     workary[i*stcol+j];
  85.             }
  86.          }
  87.       }
  88.       simpcrit1 = 1;
  89.       for ( j = 0; j <= stcol - 2; ++j ) {
  90.          simpcrit1 = (workary[j] >= 0.0) && simpcrit1;
  91.       }
  92.    }
  93.    for ( j = 0; j <= numrow; ++j ) {
  94.       optsol[j] = workary[j*stcol+stcol-1];
  95.    }
  96.    for ( j = 0; j <= stcol - 2; ++j ) {
  97.       objfval[j] = workary[j];
  98.    }
  99. }
  100.  
  101.