00001
00020
00021
00022 # include <stdio.h>
00023 # include <stdlib.h>
00024 # include <math.h>
00025
00026 # include "global.h"
00027 # include "sub.h"
00028 # include "rand.h"
00029
00030
00031 void allocate_memory ()
00032 {
00033 int i, j, k;
00034 norm_x = (long double *)malloc(nreal*sizeof(long double));
00035 norm_f = (long double *)malloc(nfunc*sizeof(long double));
00036 trans_x = (long double *)malloc(nreal*sizeof(long double));
00037 basic_f = (long double *)malloc(nfunc*sizeof(long double));
00038 temp_x1 = (long double *)malloc(nreal*sizeof(long double));
00039 temp_x2 = (long double *)malloc(nreal*sizeof(long double));
00040 temp_x3 = (long double *)malloc(nreal*sizeof(long double));
00041 temp_x4 = (long double *)malloc(nreal*sizeof(long double));
00042 weight = (long double *)malloc(nfunc*sizeof(long double));
00043 sigma = (long double *)malloc(nfunc*sizeof(long double));
00044 lambda = (long double *)malloc(nfunc*sizeof(long double));
00045 bias = (long double *)malloc(nfunc*sizeof(long double));
00046 o = (long double **)malloc(nfunc*sizeof(long double));
00047 l = (long double ***)malloc(nfunc*sizeof(long double));
00048 g = (long double **)malloc(nreal*sizeof(long double));
00049 for (i=0; i<nfunc; i++)
00050 {
00051 o[i] = (long double *)malloc(nreal*sizeof(long double));
00052 l[i] = (long double **)malloc(nreal*sizeof(long double));
00053 }
00054 for (i=0; i<nreal; i++)
00055 {
00056 g[i] = (long double *)malloc(nreal*sizeof(long double));
00057 }
00058 for (i=0; i<nfunc; i++)
00059 {
00060 for (j=0; j<nreal; j++)
00061 {
00062 l[i][j] = (long double *)malloc(nreal*sizeof(long double));
00063 }
00064 }
00065
00066 C = 2000.0;
00067 for (i=0; i<nreal; i++)
00068 {
00069 norm_x[i] = 5.0;
00070 trans_x[i] = 0.0;
00071 temp_x1[i] = 0.0;
00072 temp_x2[i] = 0.0;
00073 temp_x3[i] = 0.0;
00074 temp_x4[i] = 0.0;
00075 for (j=0; j<nreal; j++)
00076 {
00077 if (i==j)
00078 {
00079 g[i][j]=1.0;
00080 }
00081 else
00082 {
00083 g[i][j]=0.0;
00084 }
00085 }
00086 }
00087 for (i=0; i<nfunc; i++)
00088 {
00089 basic_f[i] = 0.0;
00090 norm_f[i] = 0.0;
00091 weight[i] = 1.0/(long double)nfunc;
00092 sigma[i] = 1.0;
00093 lambda[i] = 1.0;
00094 bias[i] = 100.0*(long double)i;
00095 for (j=0; j<nreal; j++)
00096 {
00097 o[i][j] = 0.0;
00098 for (k=0; k<nreal; k++)
00099 {
00100 if (j==k)
00101 {
00102 l[i][j][k] = 1.0;
00103 }
00104 else
00105 {
00106 l[i][j][k] = 0.0;
00107 }
00108 }
00109 }
00110 }
00111 return;
00112 }
00113
00114
00115 void transform (long double *x, int count)
00116 {
00117 int i, j;
00118 for (i=0; i<nreal; i++)
00119 {
00120 temp_x1[i] = x[i] - o[count][i];
00121 }
00122 for (i=0; i<nreal; i++)
00123 {
00124 temp_x2[i] = temp_x1[i]/lambda[count];
00125 }
00126 for (j=0; j<nreal; j++)
00127 {
00128 temp_x3[j] = 0.0;
00129 for (i=0; i<nreal; i++)
00130 {
00131 temp_x3[j] += g[i][j]*temp_x2[i];
00132 }
00133 }
00134 for (j=0; j<nreal; j++)
00135 {
00136 trans_x[j] = 0.0;
00137 for (i=0; i<nreal; i++)
00138 {
00139 trans_x[j] += l[count][i][j]*temp_x3[i];
00140 }
00141 }
00142 return;
00143 }
00144
00145
00146 void transform_norm (int count)
00147 {
00148 int i, j;
00149 for (i=0; i<nreal; i++)
00150 {
00151 temp_x2[i] = 5.0/lambda[count];
00152 }
00153 for (j=0; j<nreal; j++)
00154 {
00155 temp_x3[j] = 0.0;
00156 for (i=0; i<nreal; i++)
00157 {
00158 temp_x3[j] += g[i][j]*temp_x2[i];
00159 }
00160 }
00161 for (j=0; j<nreal; j++)
00162 {
00163 trans_x[j] = 0.0;
00164 for (i=0; i<nreal; i++)
00165 {
00166 trans_x[j] += l[count][i][j]*temp_x3[i];
00167 }
00168 }
00169 return;
00170 }
00171
00172
00173 void calc_weight (long double *x, int nfunc)
00174 {
00175 int i, j;
00176 long double sum;
00177 long double max;
00178 max = -INF;
00179 for (i=0; i<nfunc; i++)
00180 {
00181 sum = 0.0;
00182 for (j=0; j<nreal; j++)
00183 {
00184 sum += (x[j]-o[i][j])*(x[j]-o[i][j]);
00185 }
00186 weight[i] = exp(-(sum)/(2.0*nreal*sigma[i]*sigma[i]));
00187 max = maximum(max,weight[i]);
00188 }
00189 sum = 0.0;
00190 for (i=0; i<nfunc; i++)
00191 {
00192 if (weight[i]!=max)
00193 {
00194 weight[i] *= (1.0 - pow(max,10.0));
00195 }
00196 sum += weight[i];
00197 }
00198 if (sum==0.0)
00199 {
00200 for (i=0; i<nfunc; i++)
00201 {
00202 weight[i] = 1.0/(long double)nfunc;
00203 }
00204 }
00205 else
00206 {
00207 for (i=0; i<nfunc; i++)
00208 {
00209 weight[i] /= sum;
00210 }
00211 }
00212 return;
00213 }
00214
00215
00216 void free_memory()
00217 {
00218 int i, j;
00219 free (norm_x);
00220 free (norm_f);
00221 free (trans_x);
00222 free (basic_f);
00223 free (temp_x1);
00224 free (temp_x2);
00225 free (temp_x3);
00226 free (temp_x4);
00227 free (weight);
00228 free (sigma);
00229 free (lambda);
00230 free (bias);
00231 for (i=0; i<nfunc; i++)
00232 {
00233 for (j=0; j<nreal; j++)
00234 {
00235 free (l[i][j]);
00236 }
00237 }
00238 for (i=0; i<nfunc; i++)
00239 {
00240 free (o[i]);
00241 free (l[i]);
00242 }
00243 for (i=0; i<nreal; i++)
00244 {
00245 free (g[i]);
00246 }
00247 free (o);
00248 free (l);
00249 free (g);
00250 return;
00251 }