00001 #include "fuzzygen.h"
00002 #include <math.h>
00003
00004
00005 fuzzygen::fuzzygen (void)
00006 {
00007
00008 nfv=0;
00009
00010 nalph=0;
00011
00012 nval=0;
00013
00014
00015 ncomb=0;
00016
00017 tncomb=0;
00018
00019
00020 actalph=0;
00021
00022 actcomb=0;
00023
00024
00025 alpha=NULL;
00026 aux=NULL;
00027 fn = NULL;
00028 }
00029
00030
00031
00032 fuzzygen::~fuzzygen ( void )
00033 {
00034 delete [] alpha;
00035 delete [] aux;
00036 delete [] fn;
00037 }
00038
00039
00040
00041
00042
00043
00044
00045
00046 void fuzzygen::read (XFILE *in)
00047 {
00048 long i;
00049
00050
00051 xfscanf (in,"%ld",&nfv);
00052
00053 xfscanf (in,"%ld",&nalph);
00054
00055
00056 nval=nalph*2-1;
00057
00058 if (nfv<1){
00059 fprintf (stderr,"\n\n number of fuzzy variables is less than 1 in function fuzzygen::read (file %s, line %d)\n",
00060 __FILE__,__LINE__);
00061 }
00062 if (nalph<0){
00063 fprintf (stderr,"\n\n number of alpha-cuts is negative in function fuzzygen::read (file %s, line %d)\n",
00064 __FILE__,__LINE__);
00065 }
00066
00067 if (alpha==NULL){
00068 alpha = new double [nalph];
00069 }
00070 if (aux==NULL){
00071 aux = new long [nfv];
00072 }
00073
00074 for (i=0;i<nalph;i++){
00075 xfscanf (in,"%lf",alpha+i);
00076 }
00077
00078
00079 fn = new fuzzynum [nfv];
00080
00081 for (i=0;i<nfv;i++){
00082 fn[i].read (in);
00083 fn[i].onearray ();
00084 }
00085
00086
00087 totcombnumber ();
00088 }
00089
00090
00091
00092
00093
00094
00095
00096 void fuzzygen::totcombnumber ()
00097 {
00098
00099 combnumber ();
00100
00101 tncomb=nalph*ncomb;
00102
00103 fprintf (stdout,"\n total number of combinations %ld",tncomb);
00104 }
00105
00106
00107
00108
00109
00110
00111
00112 void fuzzygen::combnumber ()
00113 {
00114 long i;
00115
00116 ncomb=1;
00117 for (i=0;i<nfv;i++){
00118 ncomb *= 2;
00119 }
00120
00121 }
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136 void fuzzygen::gener_alphacuts (long alphid,double *avi)
00137 {
00138 long i,change;
00139
00140
00141 for (i=0;i<nfv;i++){
00142 if (aux[i]==0){
00143 avi[i]=fn[i].give_min (alpha[alphid]);
00144 }
00145 else{
00146 avi[i]=fn[i].give_max (alpha[alphid]);
00147 }
00148 }
00149
00150
00151 if (actcomb!=ncomb-1){
00152
00153 change=0;
00154 aux[nfv-1]++;
00155
00156 if (aux[nfv-1]>1){
00157 change=1;
00158 aux[nfv-1]=0;
00159 }
00160
00161 for (i=nfv-2;i>-1;i--){
00162 if (change==1){
00163 aux[i]++;
00164 if (aux[i]>1){
00165 aux[i]=0;
00166 change=1;
00167 }
00168 else{
00169 change=0;
00170 }
00171 }
00172 }
00173 }
00174 }
00175
00176
00177
00178
00179
00180
00181
00182
00183 void fuzzygen::gener_allcomb (double *avi)
00184 {
00185 long i,j;
00186
00187 i=nfv-1;
00188 if (aux[i]<nval){
00189 avi[i]=fn[i].give_val (aux[i]);
00190 aux[i]++;
00191 j=0;
00192 }
00193 else{
00194 aux[i]=0;
00195 avi[i]=fn[i].give_val (aux[i]);
00196 aux[i]++;
00197 j=1;
00198 }
00199
00200 for (i=nfv-2;i>-1;i--){
00201 if (j==1)
00202 aux[i]++;
00203 if (aux[i]<nval){
00204 avi[i]=fn[i].give_val (aux[i]);
00205 j=0;
00206 }
00207 else{
00208 aux[i]=0;
00209 avi[i]=fn[i].give_val (aux[i]);
00210 j=1;
00211 }
00212 }
00213
00214 }
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226 void fuzzygen::give_new_values (long sampleid,double *avi,FILE *out)
00227 {
00228 long i;
00229
00230 if (actalph==0 && actcomb==0)
00231 fprintf (stdout,"\n\n alpha-cut number %ld is solved (alpha is %lf)\n",actalph,alpha[actalph]);
00232
00233 if (actcomb==ncomb){
00234
00235 actalph++;
00236 if (actalph>nalph){
00237 fprintf (stderr,"\n\n number of actual alpha-cut is greater than the number of all alpha-cuts");
00238 fprintf (stderr,"\n in function give_new_values (file %s, line %d)\n",__FILE__,__LINE__);
00239 }
00240 actcomb=0;
00241
00242 fprintf (stdout,"\n\n alpha-cut number %ld is solved (alpha is %lf)\n",actalph,alpha[actalph]);
00243 }
00244
00245 if (actcomb==0){
00246 for (i=0;i<nfv;i++){
00247 aux[i]=0;
00248 }
00249 }
00250
00251
00252 gener_alphacuts (actalph,avi);
00253
00254
00255 fprintf (out,"\n sampleid %ld, actalph %ld, actcomb %ld ",sampleid,actalph,actcomb);
00256 for (i=0;i<nfv;i++){
00257 fprintf (out," %le",avi[i]);
00258 }
00259
00260
00261 actcomb++;
00262
00263 }
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274 void fuzzygen::save_values (fuzzynum *fnum,long nprunknowns,double *avo)
00275 {
00276 long i;
00277 double min,max,al;
00278
00279 al=alpha[actalph];
00280
00281 for (i=0;i<nprunknowns;i++){
00282 min=fnum[i].give_min (al);
00283 max=fnum[i].give_max (al);
00284 if (avo[i]<min)
00285 fnum[i].save_alp_min (actalph,al,avo[i]);
00286 if (avo[i]>max)
00287 fnum[i].save_alp_max (actalph,al,avo[i]);
00288 }
00289 }