Vous êtes sur la page 1sur 25

EL MANUSCRITO VOYNICH INTRODUCCION En la Librera Beinecke, perteneciente a la Universidad de Yale, podemos encontrar uno de los ms misteriosos e interesantes desafos

que la Historia nos ha dejado. Se trata de un manuscrito, donado en 1969 por H.P Kraus, que en 1912 haba sido adquirido por Wilfrid M. Voynich, librero anticuario norteamericano, en un seminario jesuita en Frascati, en Villa Mondragone, cerca de Roma. Sus orgenes y autor son inciertos, aunque junto al texto se hall una carta fechada el 19 de agosto de 1666, de Johannes Marcus Marci, rector de la Universidad de Praga, dirigida a Athanasius Kircher, un erudito jesuita. Segn dicha carta el manuscrito era obra del cientfico Roger Bacon, uno de los personajes del S.XIII con un pensamiento cientfico ms avanzado. El manuscrito es un libro de 15 por 23 centmetros en octavo, consta de 204 pginas, aunque se perdieron 28. Cada una de ellas tiene coloridos dibujos y anotaciones manuscritas en una clave secreta. A pesar de los esfuerzos que han llevado a cabo eruditos en la materia a lo largo de los siglos (incluso en nuestros das), no se sabe en qu idioma est escrito o cifrado, ni cul fue la intencin original del autor, constituye en s mismo todo un enigma y hasta la fecha nadie ha logrado descifrarlo.

EL MISTERIO La primera noticia fiable que se tiene de l data de principios del siglo XVII. Sabemos que el emperador Rodolfo II de Bohemia (1552-1612) lo compr por una cifra desorbitada para la poca (600 ducados), y que luego pas por varias manos hasta llegar en 1666 a las de Atanasio Kircher, un sacerdote jesuta. Desde ese momento hasta 1912, nadie sabe a ciencia cierta qu le ocurri al libro. Para cualquier criptgrafo y estudioso de los lenguajes este libro constituye un estimulante reto, ya que ni siquiera sabemos a ciencia cierta cul es el tema que trata Sus numerosas ilustraciones parecen indicar que es un tratado de alquimia cuyo autntico contenido se quiso mantener en secreto, pero esto no son ms que especulaciones. Posee diferentes secciones, que parecen tratar los siguientes temas: Botnica (la mayora de los dibujos representa plantas no identificadas), Astronoma (aparecen casi todos los smbolos zodiacales), Biologa (con algunos dibujos sobre anatoma), Cosmologa y Farmacia. Al final se incluye lo que parece un recetario. Adems, el libro posee numeracin de pginas, algunas anotaciones en alemn, otras en algn alfabeto desconocido, y una anotacin en la ltima pgina en caracteres tradicionales que parece representar una clave para descifrar el texto. No obstante, ni siquiera sabemos a ciencia cierta si el texto est cifrado o no. Como puede verse, tenemos todos los ingredientes para poner a prueba nuestras habilidades. A partir de las vestimentas de los personajes dibujados, podra decirse que el manuscrito fue escrito en Europa durante el siglo XIII, aunque una de las ilustraciones se parece a un girasol, lo cual sugiere que en parte fue escrito despus del descubrimiento de Amrica. De todas formas, tampoco est descartado que el libro sea un simple engao hecho para estafar a alguno de sus poseedores, ya que sabemos que en ocasiones se han pagado incribles sumas de dinero por l.

ESTUDIOS REALIZADOS Hasta la fecha se han llevado a cabo multitud de estudios sobre el Manuscrito Voynich, e incluso en ms de una ocasin ha habido personas que aseguran haberlo traducido, pero todava ninguna de las traducciones ha sido reconocida por la comunidad. El problema principal es que no sabemos apenas nada sobre el posible significado real del libro (aunque a estas alturas casi nadie niega que cuando se descifre, slo contenga un compendio de los conocimientos de la poca). De hecho, ni siquiera sabemos si est cifrado!, por lo que decidir cmo dar por vlida una posible solucin constituye un problema en s mismo. Parece evidente que la traduccin debera cumplir una serie de condiciones mnimas: ser criptolgicamente coherente, no permitir soluciones alternativas, cubrir todo el manuscrito, ser factible con los medios de la poca, dar un significado coherente al libro, etc. A pesar de este complicado entramado de dificultades, hay una serie de hechos cuando menos estimulantes: Existen dos grandes bloques con tipos de escritura claramente diferenciados en el libro. Esto se ha logrado analizando estadsticamente el contenido. La causa de esto puede ser mltiple: diferentes autores, mismo autor pero diferente estilo, o simplemente temas diferentes. El texto del manuscrito cumple con las propiedades estadsticas principales de los lenguajes naturales, aunque presenta alguna peculiaridad, que puede deberse a la presencia de abreviaturas. Apenas hay correcciones en el texto.

PERSPECTIVAS Todava quedan muchas cuestiones abiertas, pero sin duda el Manuscrito Voynich ha de constituir un perfecto banco de pruebas para nuestras teoras sobre el lenguaje y los cdigos criptogrficos. Cuando muchos algoritmos de cifrado son abandonados por presentar fisuras en su estructura matemtica, seguimos teniendo un texto codificado a mano que se resiste a nuestras poderosas tcnicas de criptoanlisis. Quin sabe? tal vez slo sea una cuestin de (des)inters econmico...

PRESENTACIN DEL TRABAJO Como se ha podido comprobar en las lneas anteriores, todava hoy en da se esta trabajando en intentar descifrar este documento y mi trabajo va a basarse en eso. Voy a disear una red neuronal capaz de reconocer varios caracteres de dicho manuscrito, teniendo en cuenta que estn escritos a mano y pueden albergar errores; voy a traducirlos a un alfabeto conocido mediante el cual se pueda descifrar... o como mnimo leer tan enigmtico manuscrito. La red ideal para el reconocimiento de todos estos caracteres sera una red del tipo Back-Propagation pero la red elegida por mi para disear este sistema ser simplemente una unica neurona, exactamente perceptrn, el cual aprender a distinguir entre 2 caracteres. Necesitare, como es lgico, un alfabeto de transcripcin, para que, una vez identificado el carcter, este pueda ser asignado a una letra concreta del alfabeto conocido. Para ello he optado por el alfabeto de transcripcin diseado por la FSG (First Voynich Manuscript Study Group), los cuales obtuvieron dicho alfabeto siguiendo las siguientes pautas: La obtencin de dicho alfabeto implicaba dos elecciones: Tenan que saber cuales eran exactamente los caracteres que formaban el texto individualmente y despus establecer una letra o nmero equivalentes en nuestro alfabeto para cada uno de esos caracteres. La parte ms crtica a la hora de determinar el alfabeto de transcripcin era la primera, para ello deban determinar el nivel de detalle y el tipo de detalle con el cual el manuscrito pudiese ser transcrito, ya que eligiendo solamente mal un caracter poda variar el texto por completo. Por ejemplo, si errneamente se asume que m y n son la misma letra (porque se supone que el numero de montaitas no es importante) o h y n son la misma letra porque solo difieren en la longitud de un trazo, o que n y u son la misma letra pero invertidas, el anlisis sera realmente difcil. Por otro lado, si se cree que m y m son diferentes letras, o que A es totalmente diferente de a, entonces el anlisis tambin sera un desastre. Para la segunda eleccin, se tomaron interesantes marcas a mano encima y al lado de algunos caracteres, que se podan ver en el manuscrito, como tambin de una especie de alfabeto de equivalencias incompleto, encontrado en las ltimas pginas del libro y con todo tipo de anotaciones. A pesar de todo ello, la eleccin de las equivalencias no fue tarea fcil, ya que muchas de las anotaciones estaban medio borradas o renombradas varias veces. Tras decodificar todo esto como buenamente se pudo, se comparo con otra decodificacin realizada por Mark Rhoads, un importante criptgrafo del ejercito, pudindose observar gran similitud entre ambos alfabetos de transcripcin, razn por la cual yo he optado por tomar este alfabeto como base para la realizacin de mi trabajo.

El alfabeto elegido es el siguiente:

Voy a pasar a comentar como ser la red, en que consistir, que har y como funcionar exactamente el sistema de interpretacin de caracteres. Como ya he dicho, se tratar de un nico perceptrn (una neurona) que se encargara de aprender los patrones de cada carcter y asignarle una letra en concreto. Un perceptrn es capaz de diferenciar dos tipos de patrones diferentes... o no saber diferenciarlos. El mio aprender a diferenciar entre la letra (P) y la (R). Los patrones equivalentes a las letras P, R que podemos ver a continuacin se encuentran a tamao real de 25x35 pxeles.

(P)

(R)

El proceso a seguir es el siguiente: Dividimos cada una de las imgenes de cada carcter tomadas por algn dispositivo externo, como podra ser un escner, en cuadraditos, o sea, en forma de matriz, como se vera en la prxima pgina. Cada letra se divide en una matriza de 25x35 puntos. Se ha escogido esta medida porque con ella se asegura una medianamente buena representacin del carcter y de todos sus trazos. Una vez tenemos dichos patrones se le ensean a la red y se la entrena para que aprenda a diferenciarlos. Tras el duro entrenamiento (2 epochs en nuestro caso), se la suelta al mundo real donde tiene que valerse de sus propios medios (lo aprendido) y convivir con miles de errores.... Debemos darle una velocidad de aprendizaje, tras comprobar varias velocidades y analizar los diferentes resultados, he optado por una velocidad de 0.1.

Aqu podemos observar los diferentes patrones y sus matrices bipolares (-1,1) correspondientes.

-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 -1 1 1 1 1 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 1 1 1 -1 1 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 1 1 1 -1 -1 1 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1

-1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1

-1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1

-1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1 1 1 1 1 -1 -1 -1 -1

-1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 -1 -1

-1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 -1

-1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 -1

-1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 1 1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 1 1 1 1 1 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

CONCLUSIONES A pesar de la aparente simplicidad de esta red, como ya he mencionado, los resultados han sido sorprendentes, crea que debido al gigantesco tamao de los patrones (tamao real), la red no sera capaz de funcionar correctamente y se equivocara mucho. Tras pasarle hasta 12 patrones modificados (simulando deterioro) la red los ha acertado todos. (Debido al gran tamao de dichos patrones no se han incluido en estas hojas). Cuando he terminado de construir la red, he decidido empezar con patrones relativamente fciles, por el miedo a que se equivocase... pero poco a poco he ido viendo que no se equivocaba de ninguna manera, llegando a un punto que le entraba unos patrones tan deformados que ni siquiera yo reconoca y, an as no ha fallado. Realmente impresionante. Solo encuentro un posible error a la red y ese es que tal vez sea demasiado lista, pudiendo llegar a reconocer algunas veces cosas que no son. Una de las ventajas de esta red es que todas las matrices, tanto las de entrenamiento como las de prueba se pueden modificar fcilmente a voluntad con lo cual el programa puede ser altamente reutilizable.

MEJORAS Desde que se inici el diseo de esta red neuronal, se pretenda que fuese capaz de diferenciar entre 4 patrones de caracteres diferentes y no solo dos. La siguiente mejora del programa (ANEXO 2) consigue ese objetivo mediante el uso de tres perceptrones en varias capas. Esta nueva red presentada a continuacin es capaz de diferenciar entre 4 patrones distintos. Se basa principalmente en la anterior red pero es ms lista. Simplemente consiste en tres redes (perceptrones) paralelas, la primera distingue si se trata de un patrn PL (P+L) o RY (R+Y). Segn lo que reconozca, pasa a otras redes secundarias que distinguen la P de la L en el caso PL o la R de la Y en el caso RY.

ANEXO ENTRENADOR DE LA RED PROGRAM Trainer; CONST alpha=0.1; tet1=0.3; tet2=-0.3; TYPE tM=ARRAY [1..2,1..876] OF REAL; tW=ARRAY [1..875] OF REAL; VAR M:tM; W:tW; i:integer; epoch:LONGINT; t, b:real; OBJ1, OBJ2:boolean; F1, F2, F3: Text; Ch: STRING [2]; PROCEDURE Resetejar; BEGIN OBJ1:=false; OBJ2:=false; b:=1; t:=0; epoch:=0; FOR i:=1 TO 875 DO W[i]:=0; END; PROCEDURE Patrons; BEGIN Assign(F1,'a:\txt\p.txt'); Reset(F1); FOR i:=1 TO 875 DO BEGIN Read(F1,Ch); IF Ch='-1' THEN M[1,i]:=-1 ELSE M[1,i]:=1; END; Close (F1); M[1,876]:=-1; Assign(F2,'a:\txt\r.txt'); Reset(F2); FOR i:=1 TO 875 DO BEGIN Read(F2,Ch); IF Ch='-1' THEN M[2,i]:=-1 ELSE M[2,i]:=1; END; Close (F2); M[2,876]:=1; END;

BEGIN Resetejar; Writeln; Writeln ('********************************************'); Writeln ('****** PERCEPTRON v.0.2 ******'); Writeln ('****** by ******'); Writeln ('****** Ray San ******'); Writeln ('********************************************'); Writeln; Writeln ('Algoritme daprenentatge de la Xarxa'); Writeln; Patrons; Writeln ('Quant vulguis prem una tecla per comenar.'); Readln; REPEAT BEGIN epoch:=epoch+1; FOR i:=1 TO 875 DO t:=W[i]*M[1,i]+t; t:=t+b; IF t<tet2 THEN t:=-1; IF t>tet1 THEN t:=1; IF t<>M[1,876] THEN BEGIN OBJ1:=false; b:=b+alpha*M[1,876]; FOR i:=1 TO 875 DO W[i]:=W[i]+alpha*M[1,876]*M[1,i]; END ELSE OBJ1:=true; FOR i:=1 TO 875 DO t:=W[i]*M[2,i]+t; t:=t+b; IF t<tet2 THEN t:=-1; IF t>tet1 THEN t:=1; IF t<>M[2,876] THEN BEGIN OBJ2:=false; b:=b+alpha*M[2,876]; FOR i:=1 TO 875 DO W[i]:=W[i]+alpha*M[2,876]*M[2,i]; END ELSE OBJ2:=true; Writeln ('Han pasat: ',epoch,' epochs. Prem una tecla per continuar.'); Readln; END; UNTIL (((OBJ1=true) AND (OBJ2=true)) OR (epoch=100)); Writeln ('La xarxa ha convergit a lepoch:',epoch); Writeln; Writeln ('El valor de b final es:',b:2:2); Writeln; Writeln ('Prem una tecla per veure el vector de pesos obtingut.'); Readln; BEGIN FOR i:=1 TO 100 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=101 TO 200 DO Write ('// W-',i,': ',W[i]:1:1);

Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=201 TO 300 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=301 TO 400 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=401 TO 500 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=501 TO 600 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=601 TO 700 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=701 TO 800 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=801 TO 875 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; END; Writeln; Writeln; Writeln ('La Xarxa ha estat entrenada amb xit.'); Writeln ('Les dades obtingudes es grabaran a disc.'); Writeln ('Prem una tecla.'); Readln; Assign(F3,'a:\txt\valors.txt'); Rewrite(F3); FOR i:=1 TO 875 DO Writeln (F3,W[i]:2:2); Writeln (F3,b:2:2); Close (F3); Writeln ('Gravacio finalitzada amb exit. Prem una tecla per acabar.'); Readln; END.

XNA PROGRAM Neurona; CONST tet1=0.3; tet2=-0.3; TYPE tV=ARRAY [1..875] OF real; VAR V, Wn:tV; Y, NI, b, peso:real; i:INTEGER; Fn, F3: Text; Ch: STRING [2]; PROCEDURE Entrapatern; BEGIN Writeln; Writeln ('Per entrar un nou patro segueix les seguents instruccions:'); Writeln ('(1) - Escriu el patro bipolar complert en format txt'); Writeln ('(2) - Asegurat de escriure [-1] o [ 1], tot seguit.'); Writeln ('(3) - Renombra larchiu a nouP.txt i fical al diskette.'); Writeln ('Prem una tecla.'); Readln; Assign(Fn,'a:\nouP.txt'); Reset(Fn); FOR i:=1 TO 875 DO BEGIN Read(Fn,Ch); IF Ch='-1' THEN V[i]:=-1 ELSE V[i]:=1; END; Close(Fn); END; PROCEDURE valorstrain; BEGIN Assign(F3,'a:\txt\valors.txt'); Reset(F3); FOR i:=1 TO 875 DO BEGIN Readln (F3,peso); Wn[i]:=peso; END; Readln (F3,peso); b:=peso; NI:=0; Close (F3); END;

BEGIN Writeln ('Inicialitzan programa...'); Writeln ('Prem una tecla.'); Readln; Writeln; Writeln ('********************************************'); Writeln ('****** PERCEPTRON v.0.2 ******'); Writeln ('****** by ******'); Writeln ('****** Ray San ******'); Writeln ('********************************************'); Writeln; valorstrain; Entrapatern; FOR i:=1 TO 875 DO NI:=NI+(V[i]*Wn[i]); NI:=NI+b; IF NI < tet2 THEN BEGIN Y:=-1; Writeln ('Es tracta de la lletra P'); END ELSE IF NI > tet1 THEN BEGIN Y:=1; Writeln ('Es tracta de la lletra R'); END ELSE BEGIN Y:=0; Writeln ('No puc reconixer la lletra.'); END; Writeln ('El Net Input es: ',NI:2:2); Writeln; Writeln ('Grcies per utilitzar aquest software.'); Writeln; Writeln ('Premi qualsevol tecla per acabar.'); Readln; END.

ANEXO 2 ENTRENADOR DE LA RED PROGRAM Trainer; CONST alpha=0.1; tet1=0.3; tet2=-0.3; TYPE tM=ARRAY [1..2,1..876] OF REAL; tW=ARRAY [1..875] OF REAL; VAR M:tM; W:tW; i:integer; epoch:LONGINT; t, b:real; OBJ1, OBJ2:boolean; F1, F2, F3: Text; Ch: STRING [2]; PROCEDURE Resetejar; BEGIN OBJ1:=false; OBJ2:=false; b:=1; t:=0; epoch:=0; FOR i:=1 TO 875 DO W[i]:=0; END; PROCEDURE Patrons; BEGIN Assign(F1,'a:\txt\pl.txt'); Reset(F1); FOR i:=1 TO 875 DO BEGIN Read(F1,Ch); IF Ch='-1' THEN M[1,i]:=-1 ELSE M[1,i]:=1; END; Close (F1); M[1,876]:=-1; Assign(F2,'a:\txt\ry.txt'); Reset(F2); FOR i:=1 TO 875 DO BEGIN Read(F2,Ch); IF Ch='-1' THEN M[2,i]:=-1 ELSE M[2,i]:=1; END; Close (F2); M[2,876]:=1; END;

BEGIN Resetejar; Writeln; Writeln ('********************************************'); Writeln ('****** PERCEPTRON v.0.5 ******'); Writeln ('****** by ******'); Writeln ('****** Ray San ******'); Writeln ('********************************************'); Writeln; Writeln ('Algoritme daprenentatge de la Xarxa'); Writeln; Patrons; Writeln ('Quant vulguis prem una tecla per comenar.'); Readln; REPEAT BEGIN epoch:=epoch+1; FOR i:=1 TO 875 DO t:=W[i]*M[1,i]+t; t:=t+b; IF t<tet2 THEN t:=-1; IF t>tet1 THEN t:=1; IF t<>M[1,876] THEN BEGIN OBJ1:=false; b:=b+alpha*M[1,876]; FOR i:=1 TO 875 DO W[i]:=W[i]+alpha*M[1,876]*M[1,i]; END ELSE OBJ1:=true; FOR i:=1 TO 875 DO t:=W[i]*M[2,i]+t; t:=t+b; IF t<tet2 THEN t:=-1; IF t>tet1 THEN t:=1; IF t<>M[2,876] THEN BEGIN OBJ2:=false; b:=b+alpha*M[2,876]; FOR i:=1 TO 875 DO W[i]:=W[i]+alpha*M[2,876]*M[2,i]; END ELSE OBJ2:=true; Writeln ('Han pasat: ',epoch,' epochs. Prem una tecla per continuar.'); Readln; END; UNTIL (((OBJ1=true) AND (OBJ2=true)) OR (epoch=100)); Writeln ('La xarxa ha convergit a lepoch:',epoch); Writeln; Writeln ('El valor de b final es:',b:2:2); Writeln; Writeln ('Prem una tecla per veure el vector de pesos obtingut.'); Readln;

BEGIN FOR i:=1 TO 100 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=101 TO 200 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=201 TO 300 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=301 TO 400 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=401 TO 500 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=501 TO 600 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=601 TO 700 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=701 TO 800 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=801 TO 875 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; END; Writeln; Writeln; Writeln ('La Xarxa ha estat entrenada amb xit.'); Writeln ('Les dades obtingudes es grabaran a disc.'); Writeln ('Prem una tecla.'); Readln; Assign(F3,'a:\txt\valors.txt'); Rewrite(F3); FOR i:=1 TO 875 DO Writeln (F3,W[i]:2:2); Writeln (F3,b:2:2); Close (F3); Writeln ('Gravacio finalitzada amb exit. Prem una tecla per acabar.'); Readln; END.

PROGRAM TrainerPL; CONST alpha=0.1; tet1=0.3; tet2=-0.3; TYPE tM=ARRAY [1..2,1..876] OF REAL; tW=ARRAY [1..875] OF REAL; VAR M:tM; W:tW; i:integer; epoch:LONGINT; t, b:real; OBJ1, OBJ2:boolean; F1, F2, F3: Text; Ch: STRING [2]; PROCEDURE Resetejar; BEGIN OBJ1:=false; OBJ2:=false; b:=1; t:=0; epoch:=0; FOR i:=1 TO 875 DO W[i]:=0; END; PROCEDURE Patrons; BEGIN Assign(F1,'a:\txt\p.txt'); Reset(F1); FOR i:=1 TO 875 DO BEGIN Read(F1,Ch); IF Ch='-1' THEN M[1,i]:=-1 ELSE M[1,i]:=1; END; Close (F1); M[1,876]:=-1; Assign(F2,'a:\txt\l.txt'); Reset(F2); FOR i:=1 TO 875 DO BEGIN Read(F2,Ch); IF Ch='-1' THEN M[2,i]:=-1 ELSE M[2,i]:=1; END; Close (F2); M[2,876]:=1; END;

BEGIN Resetejar; Writeln; Writeln ('********************************************'); Writeln ('****** PERCEPTRON v.0.5 ******'); Writeln ('****** by ******'); Writeln ('****** Ray San ******'); Writeln ('********************************************'); Writeln; Writeln ('Algoritme daprenentatge de la Xarxa'); Writeln; Patrons; Writeln ('Quant vulguis prem una tecla per comenar.'); Readln; REPEAT BEGIN epoch:=epoch+1; FOR i:=1 TO 875 DO t:=W[i]*M[1,i]+t; t:=t+b; IF t<tet2 THEN t:=-1; IF t>tet1 THEN t:=1; IF t<>M[1,876] THEN BEGIN OBJ1:=false; b:=b+alpha*M[1,876]; FOR i:=1 TO 875 DO W[i]:=W[i]+alpha*M[1,876]*M[1,i]; END ELSE OBJ1:=true; FOR i:=1 TO 875 DO t:=W[i]*M[2,i]+t; t:=t+b; IF t<tet2 THEN t:=-1; IF t>tet1 THEN t:=1; IF t<>M[2,876] THEN BEGIN OBJ2:=false; b:=b+alpha*M[2,876]; FOR i:=1 TO 875 DO W[i]:=W[i]+alpha*M[2,876]*M[2,i]; END ELSE OBJ2:=true; Writeln ('Han pasat: ',epoch,' epochs. Prem una tecla per continuar.'); Readln; END; UNTIL (((OBJ1=true) AND (OBJ2=true)) OR (epoch=100)); Writeln ('La xarxa ha convergit a lepoch:',epoch); Writeln; Writeln ('El valor de b final es:',b:2:2); Writeln; Writeln ('Prem una tecla per veure el vector de pesos obtingut.'); Readln;

BEGIN FOR i:=1 TO 100 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=101 TO 200 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=201 TO 300 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=301 TO 400 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=401 TO 500 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=501 TO 600 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=601 TO 700 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=701 TO 800 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=801 TO 875 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; END; Writeln; Writeln; Writeln ('La Xarxa ha estat entrenada amb xit.'); Writeln ('Les dades obtingudes es grabaran a disc.'); Writeln ('Prem una tecla.'); Readln; Assign(F3,'a:\txt\valorspl.txt'); Rewrite(F3); FOR i:=1 TO 875 DO Writeln (F3,W[i]:2:2); Writeln (F3,b:2:2); Close (F3); Writeln ('Gravacio finalitzada amb exit. Prem una tecla per acabar.'); Readln; END.

PROGRAM TrainerRY; CONST alpha=0.1; tet1=0.3; tet2=-0.3; TYPE tM=ARRAY [1..2,1..876] OF REAL; tW=ARRAY [1..875] OF REAL; VAR M:tM; W:tW; i:integer; epoch:LONGINT; t, b:real; OBJ1, OBJ2:boolean; F1, F2, F3: Text; Ch: STRING [2]; PROCEDURE Resetejar; BEGIN OBJ1:=false; OBJ2:=false; b:=1; t:=0; epoch:=0; FOR i:=1 TO 875 DO W[i]:=0; END; PROCEDURE Patrons; BEGIN Assign(F1,'a:\txt\r.txt'); Reset(F1); FOR i:=1 TO 875 DO BEGIN Read(F1,Ch); IF Ch='-1' THEN M[1,i]:=-1 ELSE M[1,i]:=1; END; Close (F1); M[1,876]:=-1; Assign(F2,'a:\txt\y.txt'); Reset(F2); FOR i:=1 TO 875 DO BEGIN Read(F2,Ch); IF Ch='-1' THEN M[2,i]:=-1 ELSE M[2,i]:=1; END; Close (F2); M[2,876]:=1; END;

BEGIN Resetejar; Writeln; Writeln ('********************************************'); Writeln ('****** PERCEPTRON v.0.5 ******'); Writeln ('****** by ******'); Writeln ('****** Ray San ******'); Writeln ('********************************************'); Writeln; Writeln ('Algoritme daprenentatge de la Xarxa'); Writeln; Patrons; Writeln ('Quant vulguis prem una tecla per comenar.'); Readln; REPEAT BEGIN epoch:=epoch+1; FOR i:=1 TO 875 DO t:=W[i]*M[1,i]+t; t:=t+b; IF t<tet2 THEN t:=-1; IF t>tet1 THEN t:=1; IF t<>M[1,876] THEN BEGIN OBJ1:=false; b:=b+alpha*M[1,876]; FOR i:=1 TO 875 DO W[i]:=W[i]+alpha*M[1,876]*M[1,i]; END ELSE OBJ1:=true; FOR i:=1 TO 875 DO t:=W[i]*M[2,i]+t; t:=t+b; IF t<tet2 THEN t:=-1; IF t>tet1 THEN t:=1; IF t<>M[2,876] THEN BEGIN OBJ2:=false; b:=b+alpha*M[2,876]; FOR i:=1 TO 875 DO W[i]:=W[i]+alpha*M[2,876]*M[2,i]; END ELSE OBJ2:=true; Writeln ('Han pasat: ',epoch,' epochs. Prem una tecla per continuar.'); Readln; END; UNTIL (((OBJ1=true) AND (OBJ2=true)) OR (epoch=100)); Writeln ('La xarxa ha convergit a lepoch:',epoch); Writeln; Writeln ('El valor de b final es:',b:2:2); Writeln; Writeln ('Prem una tecla per veure el vector de pesos obtingut.'); Readln;

BEGIN FOR i:=1 TO 100 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=101 TO 200 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=201 TO 300 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=301 TO 400 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=401 TO 500 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=501 TO 600 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=601 TO 700 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=701 TO 800 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; FOR i:=801 TO 875 DO Write ('// W-',i,': ',W[i]:1:1); Writeln; Writeln ('Prem una tecla per seguir...'); Readln; END; Writeln; Writeln; Writeln ('La Xarxa ha estat entrenada amb xit.'); Writeln ('Les dades obtingudes es grabaran a disc.'); Writeln ('Prem una tecla.'); Readln; Assign(F3,'a:\txt\valorsry.txt'); Rewrite(F3); FOR i:=1 TO 875 DO Writeln (F3,W[i]:2:2); Writeln (F3,b:2:2); Close (F3); Writeln ('Gravacio finalitzada amb exit. Prem una tecla per acabar.'); Readln; END.

PROGRAM Neurona; CONST tet1=0.3; tet2=-0.3; TYPE tV=ARRAY [1..875] OF real; VAR V, Wn:tV; Y, NI, b, peso:real; i:INTEGER; Fn, F3: Text; Ch: STRING [2]; PROCEDURE Entrapatern; BEGIN Writeln; Writeln ('Per entrar un nou patro segueix les seguents instruccions:'); Writeln ('(1) - Escriu el patro bipolar complert en format txt'); Writeln ('(2) - Asegurat de escriure [-1] o [ 1], tot seguit.'); Writeln ('(3) - Renombra larchiu a nouP.txt i fical al diskette.'); Writeln ('Prem una tecla.'); Readln; Assign(Fn,'a:\nouP.txt'); Reset(Fn); FOR i:=1 TO 875 DO BEGIN Read(Fn,Ch); IF Ch='-1' THEN V[i]:=-1 ELSE V[i]:=1; END; Close(Fn); END; PROCEDURE valorstrain; BEGIN Assign(F3,'a:\txt\valors.txt'); Reset(F3); FOR i:=1 TO 875 DO BEGIN Readln (F3,peso); Wn[i]:=peso; END; Readln (F3,peso); b:=peso; NI:=0; Close (F3); END; BEGIN Writeln ('Inicialitzan programa...'); Writeln ('Prem una tecla.'); Readln; Writeln; Writeln ('********************************************'); Writeln ('****** PERCEPTRON v.0.5 ******'); Writeln ('****** by ******'); Writeln ('****** Ray San ******'); Writeln ('********************************************'); Writeln; valorstrain;

Entrapatern; FOR i:=1 TO 875 DO NI:=NI+(V[i]*Wn[i]); NI:=NI+b; IF NI < tet2 THEN BEGIN Assign(F3,'a:\txt\valorspl.txt'); Reset(F3); FOR i:=1 TO 875 DO BEGIN Readln (F3,peso); Wn[i]:=peso; END; Readln (F3,peso); b:=peso; NI:=0; Close (F3); FOR i:=1 TO 875 DO NI:=NI+(V[i]*Wn[i]); NI:=NI+b; IF NI < tet2 THEN BEGIN Y:=-1; Writeln ('Es tracta de la lletra P'); END ELSE IF NI > tet1 THEN BEGIN Y:=1; Writeln ('Es tracta de la lletra L'); END ELSE BEGIN Y:=0; Writeln ('No puc reconixer la lletra.'); END; END ELSE IF NI > tet1 THEN BEGIN Assign(F3,'a:\txt\valorsry.txt'); Reset(F3); FOR i:=1 TO 875 DO BEGIN Readln (F3,peso); Wn[i]:=peso; END; Readln (F3,peso); b:=peso; NI:=0; Close (F3); FOR i:=1 TO 875 DO NI:=NI+(V[i]*Wn[i]); NI:=NI+b; IF NI < tet2 THEN BEGIN Y:=-1; Writeln ('Es tracta de la lletra R'); END ELSE IF NI > tet1 THEN BEGIN Y:=1; Writeln ('Es tracta de la lletra Y');

END ELSE BEGIN Y:=0; Writeln ('No puc reconixer la lletra.'); END; END ELSE BEGIN Y:=0; Writeln ('No puc reconixer la lletra.'); END; Writeln ('El Net Input es: ',NI:2:2); Writeln; Writeln ('Gr...cies per utilitzar aquest software.'); Writeln; Writeln ('Premi qualsevol tecla per acabar.'); Readln; END.

Vous aimerez peut-être aussi