tag:blogger.com,1999:blog-7942320359574647252.post-59373701741103761032007-11-02T09:38:00.000-05:002007-11-02T09:49:00.213-05:00Red neuronal para LeJOS MindStorm NXTEste código es traducido de su original para el MindStorm RXC. Es un algoritmo de propagación hacia atras "Backpropagation Network". Nos tomamos el trabajo de <br />traducirlo para el nuevo modelo. Disfrutenlo.<br /><br />El código y su explicación se encuentran en la siguiente dirección:<br />http://www.javaworld.com/javaworld/jw-05-2005/jw-0516-lego.html<br /><br /><br />import lejos.nxt.Button;<br />import lejos.nxt.LCD;<br />import lejos.nxt.Motor;<br />import lejos.nxt.SensorConstants;<br />import lejos.nxt.SensorPort;<br />import lejos.nxt.Sound;<br /><br />public class AlgoritmoAprendizaje {<br /> public static LegoMindstormBP bpn = new LegoMindstormBP();<br /><br /> public static void main(String args[]) throws InterruptedException<br /> {<br /><br /><br /> int i, white;<br /> int inp[] = {0,0,0};<br /> int out[] = {0,0};<br /><br /><br /> Sound.beep();<br /> LCD.drawString( "Train",10,10 );<br /><br /><br /> // Train bpn 500 epochs, sit down and wait about 5 minutes!<br /> for(i=0;i<500;i++) {<br /> bpn.train(1);<br /> LCD.drawInt( bpn.trainedEpochs,0,10);<br /> }<br /><br /><br /> SensorPort.S1.setTypeAndMode(SensorConstants.TYPE_SWITCH,<br /> SensorConstants.MODE_BOOLEAN );<br /> <br /> SensorPort.S2.setTypeAndMode(SensorConstants.TYPE_SWITCH,<br /> SensorConstants.MODE_RAW );<br /> <br /> SensorPort.S3.setTypeAndMode(SensorConstants.TYPE_LIGHT_ACTIVE,<br /> SensorConstants.MODE_BOOLEAN );<br /><br /><br /><br /> Sound.twoBeeps();<br /> SensorPort.S2.activate(); <br /> white = SensorPort.S2.readRawValue();<br /><br /><br /> Motor.A.setPower(1);<br /> Motor.C.setPower(1);<br /><br /><br /> Sound.twoBeeps();<br /><br /><br /> while( !Button.ENTER.isPressed() ) {<br /><br /><br /> LCD.drawInt(SensorPort.S2.readRawValue(),0,20 );<br /><br /><br /> if( SensorPort.S1.readBooleanValue() )<br /> inp[0] = 1; // Sensor 1 on<br /> else<br /> inp[0] = 0; // Sensor 1 off<br /><br /><br /> if( SensorPort.S2.readRawValue() > white + 50 )<br /> inp[1] = 1; // Sensor 2 over black floor<br /> else<br /> inp[1] = 0; // Sensor 2 over white floor<br /><br /><br /> if( SensorPort.S3.readBooleanValue() )<br /> inp[2] = 1; // Sensor 3 on<br /> else<br /> inp[2] = 0; // Sensor 3 off<br /><br /><br /> bpn.test( inp, out );<br /><br /><br /> if( out[0] == 1 )<br /> Motor.A.forward();<br /> else<br /> Motor.A.backward();<br /><br /><br /> if( out[1] == 1 )<br /> Motor.C.forward();<br /> else<br /> Motor.C.backward();<br /><br /><br /> Thread.sleep( 500 );<br /><br /><br /> } // while()<br /><br /><br /> SensorPort.S2.passivate();<br /> Motor.A.stop();<br /> Motor.C.stop();<br /> Sound.beep();<br /><br /><br /> } // main()<br /><br /><br />} // class LMbpn<br /><br /><br /><br /><br /><br />class LegoMindstormBP {<br /><br /><br /> public static int data1[][] = {{0,0,0}, {1,1}};<br /> public static int data2[][] = {{1,0,0}, {1,0}};<br /> public static int data3[][] = {{0,0,1}, {0,1}};<br /> public static int data4[][] = {{0,1,0}, {0,0}};<br /><br /><br /> public static double input[] = {0,0,0,1};<br /> public static double w1[][] = {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}};<br /> public static double hidden[] = {0,0,1};<br /> public static double w2[][] = {{0,0}, {0,0}, {0,0}};<br /> public static double output[] = {0,0};<br /> public static double delta2[] = {0,0};<br /> public static double delta1[] = {0,0,0};<br /><br /><br /> public static int trainedEpochs = 0;<br /><br /><br /> LegoMindstormBP() {<br /> byte i, j;<br /> // Initialize weights randomly between 0.1 and 0.9<br /> for(i=0; i< w1.length; i++)<br /> for(j=0; j< w1[i].length; j++)<br /> w1[i][j] = Math.random()*0.8+0.1;<br /><br /><br /> for(i=0; i< w2.length; i++)<br /> for(j=0; j< w2[i].length; j++)<br /> w2[i][j] = Math.random()*0.8+0.1;<br /> }<br /><br /><br /> public static void train(int e) {<br /> for(int i=0; i< e; i++) {<br /> // Call method learn with training data<br /> learn( data1[0], data1[1] );<br /> learn( data2[0], data2[1] );<br /> learn( data3[0], data3[1] );<br /> learn( data4[0], data4[1] );<br /> trainedEpochs++;<br /> }<br /> }<br /><br /><br /> public static void learn( int inp[], int out[] ) {<br /> int i, j;<br /> double sum, out_j;<br /><br /><br /> // Initialize input units<br /> for(i=0; i< inp.length; i++)<br /> input[i] = inp[i];<br /><br /><br /> // Calculate hidden units<br /> for(j=0; j< hidden.length-1; j++) {<br /> sum = 0;<br /> for(i=0; i< input.length; i++)<br /> sum = sum + w1[i][j]*input[i];<br /><br /><br /> hidden[j] = 1 / ( 1 + Math.exp(-sum));<br /> }<br /><br /><br /> // Calculate output units<br /> for(j=0; j< output.length; j++) {<br /> sum = 0;<br /> for(i=0; i< hidden.length; i++)<br /> sum = sum + w2[i][j]*hidden[i];<br /><br /><br /> output[j] = 1 / (1 + Math.exp(-sum));<br /> }<br /><br /><br /><br /><br /><br /> // Calculate delta2 errors<br /> for(j=0; j< output.length; j++) {<br /> if( out[j] == 0 )<br /> out_j = 0.1;<br /> else if( out[j] == 1 )<br /> out_j = 0.9;<br /> else<br /> out_j = out[j];<br /> delta2[j] = output[j]*(1-output[j])*(out_j-output[j]);<br /> }<br /><br /><br /> // Calculate delta1 errors<br /> for(j=0; j< hidden.length; j++) {<br /> sum = 0;<br /> for(i=0; i< output.length; i++)<br /> sum = sum + delta2[i]*w2[j][i];<br /><br /><br /> delta1[j] = hidden[j]*(1-hidden[j])*sum;<br /> }<br /><br /><br /> // Adjust weights w2<br /> for(i=0; i< hidden.length; i++)<br /> for(j=0; j< output.length; j++)<br /> w2[i][j] = w2[i][j] + 0.35*delta2[j]*hidden[i];<br /><br /><br /> // Adjust weights w1<br /> for(i=0; i< input.length; i++)<br /> for(j=0; j< hidden.length; j++)<br /> w1[i][j] = w1[i][j] + 0.35*delta1[j]*input[i];<br /> }<br /><br /><br /> public static void test(int inp[], int out[]) {<br /> int i, j;<br /> double sum;<br /><br /><br /> // Initialize input units<br /> for(i=0; i< inp.length; i++)<br /> input[i] = inp[i];<br /><br /><br /> // Calculate hidden units<br /> for(j=0; j< hidden.length-1; j++) {<br /> sum = 0;<br /> for(i=0; i< input.length; i++)<br /> sum = sum + w1[i][j]*input[i];<br /><br /><br /> hidden[j] = 1 / ( 1 + Math.exp(-sum));<br /> }<br /><br /><br /> // Calculate output units<br /> for(j=0; j< output.length; j++) {<br /><br /><br /> sum = 0;<br /> for(i=0; i< hidden.length; i++)<br /> sum = sum + w2[i][j]*hidden[i];<br /><br /><br /> output[j] = 1 / (1 + Math.exp(-sum));<br /> }<br /><br /><br /> // Assign output to param out[]<br /> for(i=0; i< output.length; i++)<br /> if( output[i] >= 0.5 )<br /> out[i] = 1;<br /> else<br /> out[i] = 0;<br /> }<br />}Daniel Gómezhttp://www.blogger.com/profile/16651665560267217312noreply@blogger.com