9 #define FREEALL free_ivector(l2,1,m); free_ivector(l1,1,n+1); 11 int simplx(
double **a,
int m,
int n,
int *izrov,
int *iposv)
13 int i,ip,ir,is,k,kh,kp,m12,nl1,nl2;
21 for (k=1;k<=n;k++) l1[k]=izrov[k]=k;
24 if (a[i+1][1] < 0.0)
nrerror(
"Bad input tableau in SIMPLX");
30 for (k=1;k<=(n+1);k++) {
32 for (i=1;i<=m;i++) q1 += a[i+1][k];
36 simp1(a,m+1,l1,nl1,0,&kp,&bmax);
37 if (bmax <=
EPS1 && a[m+2][1] < -
EPS1) {
40 }
else if (bmax <=
EPS1 && a[m+2][1] <=
EPS1) {
41 for (ip=1;ip<=m;ip++) {
42 if (iposv[ip] == (ip+n)) {
43 simp1(a,ip,l1,nl1,1,&kp,&bmax);
44 if (bmax > 0.0)
goto one;
50 simp2(a,n,l2,nl2,&ip,kp,&q1);
55 one:
simp3(a,m+1,n,ip,kp);
56 if (iposv[ip] >= (n+1)) {
58 if (l1[k] == kp)
break;
60 for (is=k;is<=nl1;is++) l1[is]=l1[is+1];
62 for (i=1;i<=m+2;i++) a[i][kp+1] = -a[i][kp+1];
70 simp1(a,0,l1,nl1,0,&kp,&bmax);
75 simp2(a,n,l2,nl2,&ip,kp,&q1);
87 void simp1(
double **a,
int mm,
int *ll,
int nll,
int iabf,
int *kp,
double *bmax)
94 for (k=2;k<=nll;k++) {
96 test=a[mm+1][ll[k]+1]-(*bmax);
98 test=fabs(a[mm+1][ll[k]+1])-fabs(*bmax);
100 *bmax=a[mm+1][ll[k]+1];
106 void simp2(
double **a,
int n,
int *l2,
int nl2,
int *ip,
int kp,
double *q1)
112 for (i=1;i<=nl2;i++) {
113 if (a[l2[i]+1][kp+1] < -
EPS2) {
114 *q1 = -a[l2[i]+1][1]/a[l2[i]+1][kp+1];
116 for (i=i+1;i<=nl2;i++) {
118 if (a[ii+1][kp+1] < -
EPS2) {
119 q = -a[ii+1][1]/a[ii+1][kp+1];
123 }
else if (q == *q1) {
125 qp = -a[*ip+1][k+1]/a[*ip+1][kp+1];
126 q0 = -a[ii+1][k+1]/a[ii+1][kp+1];
137 void simp3(
double **a,
int i1,
int k1,
int ip,
int kp)
142 piv=1.0/a[ip+1][kp+1];
143 for (ii=1;ii<=i1+1;ii++)
146 for (kk=1;kk<=k1+1;kk++)
148 a[ii][kk] -= a[ip+1][kk]*a[ii][kp+1];
150 for (kk=1;kk<=k1+1;kk++)
151 if (kk-1 != kp) a[ip+1][kk] *= -piv;
int * ivector(int nl, int nh)
void nrerror(char *error_text)
void simp2(double **a, int n, int *l2, int nl2, int *ip, int kp, double *q1)
int simplx(double **a, int m, int n, int *izrov, int *iposv)
void simp1(double **a, int mm, int *ll, int nll, int iabf, int *kp, double *bmax)
void simp3(double **a, int i1, int k1, int ip, int kp)