/**
* Metodo que ajusta pesos de vecinos
*/
public void Ajusta_pesos(int noutput, int ninput, int mradio, int nradio, int ciclos, int tipo_beta, float[] red, int t, int coordx, int coordy, float[] in_patt)
{
int i,j,k, IJ;
float tiempo;
int distx, disty, distxneg, distxpos, distyneg, distypos, dist;
float I, S, e, beta;
int startx, starty, endx, endy, radio;
radio = (int)(mradio * ((float)(ciclos -t)/ciclos) + 0.9999999);
if (radio < 1)
radio = 1 ;
startx = ( coordx - radio + noutput) % noutput;
starty = ( coordy - radio + noutput) % noutput;
endx = ( coordx + radio + 1 + noutput) % noutput;
endy = ( coordy + radio + 1 + noutput) % noutput;
dist=0;
beta=0;
// Tipo de funcion beta aplicada para ponderacion
switch(tipo_beta)
{
case 1: beta = 1/((float)t);
break;
case 2: beta = (float)0.2 * (1 -(float)t/10000);
break;
case 3: tiempo = (float)t /((float) ciclos);
I = ((float)0.08 + (float)0.5* tiempo);
S = ((float)0.32 - (float)nradio*(float)7.06)*tiempo + (float)nradio*(float)7.06;
e = (float) java.lang.Math.exp((-1*dist*dist)/ (2*S*S));
beta = I*e;
break;
case 4:
beta = (float)0.9*((float)1-(float)((float)t/(float)ciclos));
if (beta < (float)0.01)
beta = (float)0.01;
break;
} /* End del Switch */
for ( i = startx ; i != endx; i = (i + 1 + noutput) % noutput)
{
distxpos = java.lang.Math.abs(noutput + coordx - i) % noutput;
distxneg = java.lang.Math.abs(-noutput + coordx - i) % noutput;
if (distxpos > distxneg)
distx = distxneg;
else
distx = distxpos;
distx = coordx -i;
for ( j = starty ; j != endy ; j = (j + 1 + noutput) % noutput)
{
distypos = java.lang.Math.abs(noutput + coordy-j) % noutput;
distyneg = java.lang.Math.abs(-noutput+ coordy-j) % noutput;
if (distypos > distyneg)
disty = distyneg;
else
disty = distypos;
disty = coordy -j;
if ((distx <= radio ) && ( disty <= radio))
{
if (distx >= disty)
dist = distx;
else
dist = disty;
IJ = i*noutput*ninput + j*ninput + 1;
for ( k = 0 ; k < ninput; k ++)
red[IJ + k] += (beta *(in_patt[k]-red[IJ + k])*(1 - 0.5*(float)(dist/(1+radio))));
}
}
}
}/* End Ajusta_Pesos */
/**
* Calcula distancias entre puntos
*/
public int[] Calcula_Distancia(int ninput,int noutput,float[] R,float[] a, float[] red,int coordx, int coordy)
{
int i, j, h, k, IJ;
float dist, dismin, dismin2;
float[] dif=new float[ninput];
float mult;
int[] returner=new int[2];
dismin2 = 200;
dismin = (float)java.lang.Math.sqrt(dismin2);
for(i = 0; i < noutput ; i++)
for(j = 0; j < noutput ; j++)
{
IJ = i*noutput*ninput + j*ninput + 1;
dist = (float)0.0;
for(k = 0; k < ninput ;k++)
dif[k] = a[k] - red[IJ + k];
dist = (float)0.0;
for(k = 0; k < ninput; k++)
{
mult = (float)0.0;
for(h = 0; h < ninput; h++)
mult += dif[h] * R[ninput+h-k];
dist += dif[k] * mult;
if(dist > dismin)
break;
}
dist=(float)java.lang.Math.sqrt(dist);
if(dist < dismin)
{
dismin = dist;
dismin2 = dist*dist;
coordx = i;
coordy = j;
}
}
returner[0]=coordx;
returner[1]=coordy;
return returner;
}
/**
* Metodo utilizado para entrenar red de kohonen
*/
public void entrenaKohonen(String nombre, int ciclos, int mradio, int nradio, int tipo_beta, float[] red,int ninput,int noutput)
{
float[] a =new float[ninput];
float[] R =new float[2*ninput];
float salta;
int coordx=0;
int coordy=0;
Integer datos;
boolean eof=false;
try {
FileReader reader=new FileReader(nombre);
StreamTokenizer st=new StreamTokenizer(reader);
st.nextToken();
for (int t = 0 ; t < ciclos ; t++)
{
if ((t % 5) == 0) ;
//PrintWeight(red, ninput, noutput,t);
matrixnum=0;
while (st.ttype!=st.TT_EOF)
{
for(int i = 0 ; i < ninput ; i++)
{
a[i]=(float)st.nval;
st.nextToken();
String s=new String();
}
for(int i = 0 ; i < ninput ; i++)
{
R[ninput+i]=(float)st.nval;
st.nextToken();
R[ninput-i] = R[ninput+i];
}
salta=(float)st.nval;
String s2=new String();
int[] tempint=new int[2];
tempint=Calcula_Distancia(ninput,noutput,R,a, red,coordx, coordy);
coordx=tempint[0];
coordy=tempint[1];
Ajusta_pesos(noutput, ninput, mradio, nradio, ciclos, tipo_beta, red, t, coordx, coordy,a);
}
}
/* del for para t */
/* Seleccion final de los centroides */
FileReader reader2=new FileReader(nombre);
StreamTokenizer st2=new StreamTokenizer(reader2);
st2.nextToken();
File outputFile = new File("model.obj");
FileWriter out = new FileWriter(outputFile);
matrix1=new int[noutput+1][noutput+1];
for (int p=0;p<=noutput;p++)
for (int k=0;k<=noutput;k++)
matrix1[p][k]=0;
matrix1=new int[noutput+1][noutput+1];
while (st2.ttype!=st2.TT_EOF)
{
/* Leemos los patrones a y R */
for(int i = 0 ; i < ninput ; i++)
{
a[i]=(float)st2.nval;
st2.nextToken();
String s=new String();
}
for(int i = 0 ; i < ninput ; i++)
{
R[ninput+i]=(float)st2.nval;
st2.nextToken();
R[ninput-i] = R[ninput+i];
}
salta=(float)st2.nval;
int[] tempint=new int[2];
tempint=Calcula_Distancia(ninput,noutput,R,a, red,coordx, coordy);
matrixnum=matrixnum+1;
coordx=tempint[0];
coordy=tempint[1];
matrix1[coordx][coordy]+=1;
int IJ = coordx*noutput*ninput + coordy*ninput + 1;
for(int i = 0 ; i < ninput; i++)
red[IJ + i] = a[i] ;
}
String s=new String();
String s1=new String();
String s2=new String();
int i=0;
/* Se encarga de escribir archivo que utilizara parte grafica */
for (int k=0;k<noutput;k++)
for (int p=0;p<noutput;p++)
{
out.write("v "+s.valueOf(k)+" "+s.valueOf(p)+" "+s.valueOf(matrix1[k][p])+"\n");
}
for (int k=1;k<noutput*noutput-1;k++)
{
if (k%noutput!=0)
out.write("l "+s.valueOf(k)+" "+s.valueOf(k+1)+"\n");
}
for (int k=1;k<noutput*noutput-noutput;k++)
{
out.write("l "+s.valueOf(k)+" "+s.valueOf(k+noutput)+"\n");
}
out.close();
}
catch (Exception e) /* Manejo de Excepciones de Manera General */
{
ivjTextArea1.append("Error : "+ e.getMessage() +"\n");
}
}
Copyright Nelson Flores 2001.
Departamento de Ciencias de la Computacion, Universidad de Chile.