#include #include #include #include "define.h" static int nvar; static double (*objective)(); static double **simp, *fvalue; static int ih, is, il; static double *xcentroid; static double fmean, fvar; static double *xreflect, *xcontract, *xexpand; static double freflect, fcontract, fexpand; static double al = 1, bt = 0.5, gm = 2; void initialize() { int i; simp = alloc(double *, nvar+1); for (i=0; i<=nvar; i++) { simp[i] = alloc(double, nvar); } fvalue = alloc(double, nvar+1); xcentroid = alloc(double, nvar); xreflect = alloc(double, nvar); xcontract = alloc(double, nvar); xexpand = alloc(double, nvar); } void initial_simplex(double *xinit, double length) { int i, j; double a, d1, d2, *v; a = nvar + 1; d1 = (sqrt(a) + nvar - 1)/sqrt(2.00)/nvar; d2 = (sqrt(a) - 1)/sqrt(2.00)/nvar; v = simp[0]; for (j=0; j fvalue[1]) { ih = 0; is = il = 1; } else { ih = 1; is = il = 0; } for (i=2; i<=nvar; i++) { if (fvalue[i] > fvalue[ih]) { is = ih; ih = i; } else if (fvalue[i] > fvalue[is]) { is = i; } else if (fvalue[i] < fvalue[il]) { il = i; } } } void compute_xcentroid() { int i, j; double *x; for (j=0; j= fvalue[il]) { (nvar, simp[ih], xreflect); fvalue[ih] = freflect; } else { expansion(); if (fexpand < fvalue[il]) { vectorcopy(nvar, simp[ih], xexpand); fvalue[ih] = fexpand; } else { vectorcopy(nvar, simp[ih], xreflect); fvalue[ih] = freflect; } } } else { if (freflect < fvalue[ih]) { vectorcopy(nvar, simp[ih], xreflect); fvalue[ih] = freflect; } contraction(); if (fcontract < fvalue[ih]) { vectorcopy(nvar, simp[ih], xcontract); fvalue[ih] = fcontract; } else { for (i=0; i<=nvar; i++) { if (i == il) continue; vectoradd(nvar, simp[i], simp[i], simp[il]); scalarvector(nvar, simp[i], 0.50, simp[i]); fvalue[i] = (*objective)(nvar, simp[i]); } } } } vectorcopy(nvar, xinit, simp[il]); *fopt = fvalue[il]; return stat; } void vectorcopy(int n, double x[], double y[]) { int i; for (i=0; i