#include #include #include #include "arbolesid3.h" #include "tabla2.h" #include "id3.h" /* #include "errors.h" */ int FALSE=0; int TRUE=1; void leeArbolesN (tplarboles * nllarboles, char * dir) { char nf[128]; char nfa[128]; FILE * fd; int nl, l; int na, ia; tplarboles plarbs, plarbsAnt; char nom[128]; int nc; sprintf(nf, "%s/00index", dir); fd = fopen (nf, "r"); /* compruebaFd (fd, nf, "imagio.leeImagen"); */ if (fd == NULL) { printf ("arbolesid3: error at leeArboles opening index %s\n",nf); exit (1); } fscanf (fd, "%d", &nl); for (l=0; lnum = na; plarbs->larb = (tpnodo *) malloc(na * sizeof(tpnodo)); fscanf(fd, "%s", nom); nc = strlen (nom); plarbs->nombre = (char *) malloc((nc+1) * sizeof(char)); strcpy (plarbs->nombre, nom); for (ia=0; ialarb[ia] = leeArbol(nfa); } if (l == 0) * nllarboles = plarbs ; if (l > 0) plarbsAnt->next = plarbs; plarbsAnt = plarbs; } plarbsAnt->next = (tplarboles) 0L; fclose (fd); } void leeArboles (char * dir) { leeArbolesN (&llarboles, dir); } void escribeArboles0 (char * dir, char * nomc, int nar) { int ia; char nomFich[128]; borraMascara (); for (ia=0; ianum; ia++){ r = evalArbolVector (plarbs->larb[ia], v); res [r] ++ ; } } tplarboles buscaNomEnArbolesN (tplarboles nllarboles, char * nomCar) { tplarboles plarbs; for(plarbs = nllarboles; plarbs != 0L; plarbs = plarbs->next){ if (strcmp(nomCar,plarbs->nombre) == 0) break ; } if (plarbs == 0L) { printf ("arbolesid3: error en evaluaConArbolesN buscando nomCar=%s\n", nomCar); exit (1); } return plarbs; } tplarboles buscaNomEnArboles (char * nomCar) { tplarboles plarbs; for(plarbs = llarboles; plarbs != 0L; plarbs = plarbs->next){ if (strcmp(nomCar,plarbs->nombre) == 0) break ; } if (plarbs == 0L) { printf ("arbolesid3: error en evaluaConArboles buscando nomCar=%s\n", nomCar); exit (1); } return plarbs; } void evaluaConArbolesN (tplarboles nllarboles, char * nomCar, int v[], int res[]) // res[] int .. [3] { tplarboles plarbs; plarbs = buscaNomEnArbolesN (nllarboles, nomCar); evaluaConArbolesInd (plarbs, v, res); /* printf ("evaluaConArbolesN %s %2d %2d %2d\n",plarbs, res[0], res[1], res[2]); */ } void evaluaConArboles (char * nomCar, int v[], int res[]) /* res[] int .. [3] */ { tplarboles plarbs; plarbs = buscaNomEnArboles (nomCar); evaluaConArbolesInd (plarbs, v, res); /* printf ("evaluaConArboles %s %2d %2d %2d\n",plarbs, res[0], res[1], res[2]); */ } float valProp (int * res) { int narb; narb = res[0]+res[1]+res[2] ; return (0.5 + res[1]) / (narb+1.0) ; } /**/ float umbrValPropDef = 0.45; void reordenaPropuestas (tppropues lprop, char * nom, int * res, int npp, int * pnprp) { int i, j; int encontrado; /* busca posicion */ encontrado = FALSE; i = 0; while (!encontrado && (i < *pnprp)) { if (valProp(res) > valProp(lprop[i].res)) encontrado = TRUE; else i++; } /* la posicion a insertar es i */ if (i == npp) return ; /* no cabe, no es de las npp mejores */ if (i < *pnprp) { /* deplazar lo que haya tras i */ for (j=*pnprp; j==i; j--) { lprop[j+1].nombre = lprop[j].nombre ; lprop[j+1].narb = lprop[j].narb ; lprop[j+1].res[0] = lprop[j].res[0] ; lprop[j+1].res[1] = lprop[j].res[1] ; lprop[j+1].res[2] = lprop[j].res[2] ; } } /* introducir la propuesta en i */ lprop[i].nombre = nom ; lprop[i].narb = res[0]+res[1]+res[2] ; lprop[i].res[0] = res[0] ; lprop[i].res[1] = res[1] ; lprop[i].res[2] = res[2] ; /**/ (*pnprp)++ ; } void clasificaConArbolesN (tplarboles llarboles, int v[], tppropues lprop, int npp, int * pnprp, float umbrValProp) { int res[3]; tplarboles plarbs; * pnprp = 0; for(plarbs = llarboles; plarbs != 0L; plarbs = plarbs->next){ evaluaConArbolesInd (plarbs, v, res); // para ver traza de dcsw // if (res[0]!=5) // printf("%1d %1d %1d %10s\n", res[0], res[1], res[2], plarbs->nombre); // if (valProp (res) > umbrValProp) reordenaPropuestas (lprop, plarbs->nombre, res, npp, pnprp); } // para ver traza de dcsw // printf ("\n"); // } void clasificaConArboles (int v[], tppropues lprop, int npp, int * pnprp) { clasificaConArbolesN (llarboles, v, lprop, npp, pnprp, umbrValPropDef); }