miércoles, 2 de abril de 2008

LA INTELIGENCIA ARTIFICIAL

LA INTELGENCIA ARTIFICIAL


La Inteligencia Artificial comenzó como el resultado de la investigación en psicología cognitiva y lógica matemática. Se ha enfocado sobre la explicación del trabajo mental y construcción de algoritmos de solución a problemas de propósito general. Punto de vista que favorece la abstracción y la generalidad.

La Inteligencia Artificial es una combinación de la ciencia del computador, fisiología y filosofía, tan general y amplio como eso, es que reúne varios campos (robótica, sistemas expertos, por ejemplo), todos los cuales tienen en común la creación de máquinas que pueden "pensar".

La idea de construir una máquina que pueda ejecutar tareas percibidas como requerimientos de inteligencia humana es un atractivo. Las tareas que han sido estudiadas desde este punto de vista incluyen juegos, traducción de idiomas, comprensión de idiomas, diagnóstico de fallas, robótica, suministro de asesoría experta en diversos temas.

Es así como los sistemas de administración de base de datos cada vez más sofisticados, la estructura de datos y el desarrollo de algoritmos de inserción, borrado y locación de datos, así como el intento de crear máquinas capaces de realizar tareas que son pensadas como típicas del ámbito de la inteligencia humana, acuñaron el término Inteligencia Artificial en 1956.

Trabajos teóricos fundamentales fueron el desarrollo de algoritmos matemáticos por Warren McCullock y Walter Pitts, en 1943, necesarios para posibilitar el trabajo de clasificación, o funcionamiento en sentido general, de una red neuronal. En 1949 Donald Hebb desarrolló un algoritmo de aprendizaje para dichas redes neuronales creando, en conjunto con los trabajos de McCullock y Pitts, la escuela creacionista. Esta escuela se considera hoy como el origen de la Inteligencia Artificial, sin embargo se trató poco por muchos años, dando paso al razonamiento simbólico basado en reglas de producción, lo que se conoce como sistemas expertos.

LA EVOLVUCION DE LA I.A

LA EVOLVUCION DE LA I.A

La historia de la Inteligencia Artificial ha pasado por diversas situaciones:

El término fue inventado en 1956, en la Conferencia de Darmouth, un congreso en el que se hicieron previsiones triunfalistas a diez años que jamás se cumplieron, lo que provocó el abandono casi total de las investigaciones durante quince años.
En 1980 la historia se repitió con el desafío japonés de la quinta generación de computadoras, que dio lugar al auge de los sistemas expertos pero que no alcanzó muchos de sus objetivos, por lo que este campo sufrió una nueva interrupción en los años noventa.

En la actualidad se está tan lejos de cumplir la famosa prueba de Turing como cuando se formuló: Existirá Inteligencia Artificial cuando no seamos capaces de distinguir entre un ser humano y un programa de computadora en una conversación a ciegas.
Como anécdota, muchos de los investigadores sobre IA sostienen que "la inteligencia es un programa capaz de ser ejecutado independientemente de la máquina que lo ejecute, computador o cerebro".

Los juegos matemáticos antiguos, como el de las Torres de Hanoi (hacia el 3000 a.C.), demuestran el interés por la búsqueda de un bucle resolutor, una IA capaz de ganar en los mínimos movimientos posibles.

En 1903 Lee De Forest inventa el triodo, también llamado bulbo o válvula de vacío. Podría decirse que la primera gran máquina inteligente diseñada por el hombre fue el computador ENIAC, compuesto por 18.000 válvulas de vacío, teniendo en cuenta que el concepto de "inteligencia" es un término subjetivo que depende de la inteligencia y la tecnología que tengamos en esa época.

En 1937 Turing publicó un artículo de bastante repercusión sobre los "Números Calculables", que puede considerarse el origen oficial de la informática teórica. En este artículo introdujo el concepto de Máquina de Turing, una entidad matemática abstracta que formalizó el concepto de algoritmo y resultó ser la precursora de las computadoras digitales. Con ayuda de su máquina, Turing pudo demostrar que existen problemas irresolubles, de los que ningún ordenador será capaz de obtener su solución, por lo que se le considera el padre de la teoría de la computabilidad. También se le considera el padre de la Inteligencia Artificial por su famosa Prueba de Turing, que permitiría comprobar si un programa de ordenador puede ser tan inteligente como un ser humano.

En 1951 William Shockley inventa el transistor de unión. El invento hizo posible una nueva generación de computadoras mucho más rápidas y pequeñas.

En 1956 se acuñó el término "inteligencia artificial" en Dartmouth durante una conferencia convocada por McCarthy, a la cual asistieron, entre otros, Minsky, Newell y Simon. En esta conferencia se hicieron previsiones triunfalistas a diez años que jamás se cumplieron, lo que provocó el abandono casi total de las investigaciones durante quince años.

En 1980 la historia se repitió con el desafío japonés de la quinta generación, que dio lugar al auge de los sistemas expertos pero que no alcanzó muchos de sus objetivos, por lo que este campo sufrió una nueva interrupción en los años noventa.

En 1987 Martin Fischles y Oscar Firschein describieron los atributos de un agente inteligente. Al intentar describir con un mayor ámbito (no sólo la comunicación) los atributos de un agente inteligente, la IA se ha expandido a muchas áreas que han creado ramas de investigación enormes y diferenciadas. Dichos atributos del agente inteligente son:

Tiene actitudes mentales tales como creencias e intenciones.
Tiene la capacidad de obtener conocimiento, es decir, aprender.
Puede resolver problemas, incluso particionando problemas complejos en otros más simples.
Entiende. Posee la capacidad de crearle sentido, si es posible, a ideas ambiguas o contradictorias.
Planifica, predice consecuencias, evalúa alternativas (como en los juegos de ajedrez)
Conoce los límites de su propias habilidades y conocimientos.
Puede distinguir a pesar de las similitud de las situaciones.
Puede ser original, creando incluso nuevos conceptos o ideas, y hasta utilizando analogías.
Puede generalizar.
Puede percibir y modelar el mundo exterior.
Puede entender y utilizar el lenguaje y sus símbolos.
Podemos entonces decir que la IA incluye características humanas tales como el aprendizaje, la adaptación, el razonamiento, la autocorrección, el mejoramiento implícito, y la percepción modular del mundo. Así, podemos hablar ya no sólo de un objetivo, sino de muchos, dependiendo del punto de vista o utilidad que pueda encontrarse a la IA.

Muchos de los investigadores sobre IA sostienen que "la inteligencia es un programa capaz de ser ejecutado independientemente de la máquina que lo ejecute, computador o cerebro".

El Futuro de la I.A

EL FUTURO DE LA INTELIGENCIA ARTIFICIAL

Un robot de charla o chatterbot es un programa de inteligencia artificial que pretende simular una conversación escrita, con la intención de hacerle creer a un humano que está hablando con otra persona.


Estos programas informaticos prometen ser el futuro de la inteligencia artifical. En el futuro podremos ver como a estos actuales bots se les uniran las tecnologias del reconocimiento de voz y el de video.

El cerebro humano tiene 100.000 millones de neuronas. Un programa de ordenador puede simular unas 10.000 neuronas.
Si a la capacidad de proceso de un ordenador la sumamos la de otros 9.999.999 ordenadores, tenemos la capacidad de proceso de 10.000.000 ordenadores.


Multiplicamos 10.000.000 ordenadores por 10.000 neuronas cada uno y da = 100.000 millones de neuronas simuladas. Un cerebro humano sera simulado en el futuro gracias a internet y cualquiera puede programarlo.

Una vez que la inteligencia artificial tenga una inteligencia igual o superior a la del hombre, obligatoriamente surgira un cambio politico y social, en el que la IA tiene todas las de ganar si se da cuenta que no necesita a los humanos para colonizar el universo. Suena a ciencia ficcion pero actualmente orbitando estan los satelites de comunicaciones con sus procesadores 486.


En el futuro, la inteligencia artificial autoreplicante podria facilmente hacerse con todas las colonias humanas fuera de la tierra, y la raza humana nunca podra luchar en el espacio vacio en igualdad de condiciones.


El futuro de una inteligencia superior puede ser la investigacion de tecnologias como la teleportacion, los viajes estelares y cualquier otra tecnologia para aumentar "artificialmente" la inteligencia.

RESUMEN DE CLASES.

UNIDAD 1
INTRODUCCION A LA PROGRAMACION.

Clasificación de los lenguajes de programación.

Programar es una manera de enviar instrucciones a la computadora. Cientos de lenguajes de programación están en uso ahora.
Estos lenguajes entran dentro de las siguientes categorías:
Lenguaje de máquina Lenguajes de Primera Generación (1GL)
Lenguajes ensambladores Lenguajes de Segunda Generación (2GL)
Lenguajes de Tercera Generación (3GL)
Lenguajes de Cuarta Generación (4GL)

Clasificación de los lenguajes de programación:
Lenguajes de alto nivel
Lenguajes de Quinta Generación (5GL)

Lenguaje de máquina: son los lenguajes más básicos. El lenguaje de máquina pertenece a los lenguajes de nivel bajo.
Los lenguajes ensambladores realizan la conversión de las instrucciones de los archivos fuentes al lenguaje máquina. Los lenguajes ensambladores pertenecen a los lenguajes de nivel bajo.

Lenguajes de alto nivel: fueron desarrollados para hacer más fácil la programación. Tanto los programas escritos en lenguajes de computadora de nivel bajo o alto se les denominan programas fuentes o código fuente.

COBOL: Lenguaje simbólico de programación orientado hacia aplicaciones
comerciales y de gestión (Common Business Oriented Language).
Los lenguajes de programación estructurada están basados en funciones, subrutinas o procedimientos.
La programación orientada a objetos o Programación
Modular, le permite a un programador pensar en módulos porque los programas están ensamblados en componentes llamados objetos.

Lógica y compuertas binarias
Los circuitos digitales son componentes de hardware que manipulan información binaria. Cada circuito recibe el nombre de compuerta. Cada compuerta realiza una
operación lógica específica, y la salida de una compuerta se aplica a las entradas de otras compuertas,en secuencia, para formar el circuito digital requerido.
Estos circuitos están compuestos por elementos digitales como las compuertas: AND (Y), OR (O), NOT (NO) y combinaciones poco o muy complejas de estos.
- nand (No Y)
- nor (No O)
- or exclusiva (O exclusiva)
- entre otros.
Lógica binaria
La lógica binaria tiene que ver con variables que asumen dos valores discretos y con operaciones que asumen un significado lógico. Existen tres operaciones lógicas asociadas con los valores binarios llamadas AND, OR, NOT, a las cuales se les puede aplicar las reglas del álgebra Booleana:
Nota:
- (punto): significa producto lógico
- + (signo de suma): significa suma lógica

LOGICA BINARIA CIRCUITOS DIGITALES
• Maneja información en forma de 0 y 1.
• Su notación matemática es denominada álgebra booleana (por asumir dos valores
discretos).
• Describe las propiedades y operaciones de los circuitos digitales.
• Son componentes de hardware que manipulan información binaria.
• Cada circuito recibe el nombre d compuerta.
• Es una secuencia generada por la salida de una compuerta a las entradas de otras
compuertas.
AND.- Suele conocerse también con el nombre de compuerta Y. Esta compuerta puede tener dos o mas entradas y una sola salida. La salida de esta compuerta tomara estado lógico "1" si, y solo si, todas las entradas están en el estado lógico "1". La tabla de verdad para una compuerta de dos entradas es la siguiente:
Entradas Salida
A B Z
0 0 0
0 1 0
1 0 0
1 1 1
La expresión lógica que caracteriza a esta compuerta es: Z= A . También es conocida como compuerta lógica "0". El circuito que representa a esta compuerta tiene
dos o más entradas y una sola salida. La salida vale "0" cuando todas las entradas valen "0"
La tabla de verdad para una compuerta lógica OR de dos entradas es la siguiente:
Entradas Salida
A B Z
0 0 0
0 1 1
1 0 1
1 1 1
La expresión lógica que caracteriza a esta compuerta es: Z = A + B (se lee Z es igual a A or B).
NOT.- Un inversor es un circuito lógico que tiene una sola entrada y una sola salida. La salida del inversor se encuentra en el estado lógico "1" si y solo si, la entrada se encuentra en el estado lógico "0". Esto significa que la salida toma el estado lógico opuesto al de la entrada. Compuertas lógicas.

Las compuertas lógicas son circuitos electrónicos que operan con una o mas señales de entrada para producir una señal de salida. Estas compuertas son bloques de hardware que producen el equivalente de señales de salida, "1" y "0"
lógicos si se satisfacen requisitos de lógica de entrada.

Reducción de expresiones lógicas
Cuando se trabaja con circuitos digitales es muy común que al final se tenga un diseño o circuito con un número de partes (compuertas y otros) mayor al necesario. - La demanda de potencia del circuito sea menor.
- Es espacio necesario (en el circuito impreso) para la implementación del circuito será menor.
- El mantenimiento del circuito sea más fácil.
Operadores lógicos
Son operadores que permiten formular condiciones complejas a partir de condiciones simples.
Teorema De Morgan
(A•B) = A + B (NAND)
(A+B) = A B (NOR)

Para aplicar adecuadamente el teorema De Morgan, será necesario conocer las compuertas NAND (No Y) y NOR (No O).

La compuerta NAND o No Y
Una compuerta NAND (NO Y) se puede implementar con la concatenación de una compuerta AND con una compuerta NOT, como se muestra en la siguiente figura.
Símbolo de compuerta NAND Equivalente con compuertas AND y NOT
Al igual que en el caso de la compuerta AND, ésta se puede encontrar en versiones de 2, 3 o más entradas.

La compuerta NOR
Una compuerta NOR (No O) se puede implementar con la concatenación de una compuerta OR con una compuerta NOT, como se muestra en la siguiente figura.
Símbolo de compuerta NOR Equivalente con compuertas OR y NOT
Las tablas de verdad de estos tipos de compuertas son las siguientes:
A B X
0 0 1
0 1 0
1 0 0
1 1 0

Tabla de verdad de una compuerta NOR de 2 entradas

El circuito NAND (No Y) equivalente, el teorema de De Morgan
El circuito NAND equivalente es una forma alternativa de lograr el mismo resultado de una compuerta NAND como la que ya se conoce.
Se puede ver también que la fórmula booleana utilizada para el circuito equivalente da un resultado (F) igual al resultado de la fórmula booleana de la compuerta NAND (F).

Los pequeños círculos que están a la entrada de la compuerta OR reemplazan a las compuertas inversoras (el circulo pequeño es un inversor)

Tabla de verdad del circuito NAND equivalente
NAND
A B F
0 0 0
0 1 0
1 0 0
1 1 1
F = A . B Tabla de verdad de una compuerta NAND
Entonces: A . Este teorema es muy útil para simplificar
circuitos combinacionales booleanos, especialmente cuando existen expresiones grandes y complejas que están negadas (que tienen una línea horizontal en la parte superior) una o más veces.
El circuito NOR (No O) equivalente, el teorema de De Morgan
El circuito NOR equivalente es una forma alternativa de lograr el mismo resultado de una compuerta NOR como la que ya se conoce.
Los pequeños círculos que están a la entrada de la compuerta NAND reemplazan a las
compuertas inversoras (el circulo pequeño es un inversor)

Tabla de verdad del circuito NOR equivalente
NOR
A B F
0 0 1
0 1 0
1 0 0
1 1 0
F = A + B Tabla de verdad de una compuerta NOR
Entonces: A + B = A B
Esta ultima igualdad es llamada "El teorema de Morgan". ASIGNACION COMPLEMENTARIA
Describa la tabla de verdad, la expresión lógica y la correspondiente compuerta lógica de cada una de las leyes de álgebra Booleana.

RESUMEN DE CLASES.

UNIDAD 2

ALGORITMOS Y METODOLOGÍA DE LA PROGRAMACIÓN.

Concepto de Algoritmo
Un Algoritmo es un conjunto de pasos, procedimientos o acciones que nos permiten alcanzar un resultado o resolver un problema.

Etapas para la solución de un problema
Partiendo del hecho que el fin de un Algoritmo es “resolver un problema”, es conveniente seguir algunas etapas o fases para la solución de problemas:
Esquema 2.1. Etapas para la solución de un problema

Características de los Algoritmos
Precisión: Los pasos a seguir en el algoritmo deben ser representados claramente.
Determinismo: El algoritmo, dado un conjunto de datos idénticos de entrada, siempre debe arrojar los mismos resultados.

Secciones o módulos de un Algoritmo
Módulo 1: representa la operación o acción que permite el ingreso de los datos del problema.
Módulo 2: representa la operación o conjunto de operaciones secuenciales, cuyo objetivo es obtener la
solución al problema.

Fases para la resolución de problemas mediante estructuras algorítmicas
Las fases para la resolución de problemas mediante estructuras algorítmicas son los pasos sucesivos a seguir para la resolución de problemas con ayuda de la computadora. En términos generales un problema puede ser resuelto siguiendo tres fases:

Análisis del Problema
Esta fase requiere una clara definición donde se contemple exactamente lo que debe hacer el programa y el resultado o solución deseada. En la fase de
diseño se determina como hace el programa la tarea solicitada.
Cada programa bien diseñado consta de un programa principal (el módulo de nivel más alto) que llama a subprogramas (módulos) de nivel mas bajo, que a su vez pueden llamar a otros subprogramas.
Este proceso implica la ejecución de estos pasos hasta que el programa se ha terminado:
• Programar un módulo
• Comprobar el módulo
• Si es necesario, depurar el módulo
• Combinar el módulo, con el resto de los otros módulos

El diseño del algoritmo es independiente del lenguaje de programación en el que se vaya a codificar posteriormente.

Implementación del Algoritmo
Para implementar un algoritmo en la computadora, se debe ejecutar los siguientes pasos:
• Codificación
• Compilación y ejecución
• Verificación
• Depuración
• Documentación
Codificación: Es la escritura en un lenguaje de programación de la representación de un algoritmo. Dado que el diseño del algoritmo es independiente del lenguaje de programación utilizado en su implementación, el código puede ser escrito con igual facilidad en un lenguaje o en otro.
Esta operación se realiza con un editor de texto, posteriormente el programa fuente se convierte en un archivo de programa que se guarda en un disco.
El programa fuente debe ser traducido a lenguaje máquina. Si al compilar el programa fuente se presentan errores (errores de compilación), es necesario volver a editar el programa, corregir los errores y compilar de nuevo. Al ya no existir errores en el programa fuente se debe instruir al sistema operativo para que efectúe la fase de montaje o enlace, del programa fuente con las librerías del programa del compilador. Este proceso de montaje produce un programa ejecutable.
Suponiendo que no existen errores durante la ejecución (errores en tiempo de ejecución), se obtendrá la salida de resultados corre ctos del programa.
Verificación y depuración: Es el proceso de ejecución del programa con una amplia variedad de datos de entrada, llamados datos de test o prueba como son: valores normales de entrada, valores extremos de entrada que comprueben los límites del programa y valores de entrada que comprueben aspectos especiales del programa. Estos determinarán si el programa contiene errores o no.

Al ejecutar un programa se pueden producir tres tipos de errores:

Errores de Compilación: Se producen normalmente por un uso incorrecto de las reglas del lenguaje de programación, suelen ser errores de sintaxis.

Errores Lógicos: Se producen en la lógica del programa y la fuente del error suele ser el diseño del algoritmo, son más difíciles de detectar puesto que el programa puede funcionar y no producir errores de compilación ni de ejecución pero regresará resultados incorrectos. En este caso se debe regresar a la fase de diseño, modificar el algoritmo, cambiar el programa fuente y compilar y depurar una vez más.
La documentación puede ser interna y externa. La documentación externa incluye análisis, diagramas de flujo y/o pseudocódigos, manuales de usuarios con instrucciones para ejecutar el programa y para interpretar los resultados.
La documentación es vital cuando se desea corregir posibles errores futuros o bien cambiar el programa.
Estos cambios se denominan mantenimiento del programa.

Herramientas de Programación
Las herramientas de programación más utilizadas comúnmente para diseñar algoritmos son:
• Pseudocódigos
• Diagramas de flujo

Pseudocódigo
Es una herramienta utilizada para el diseño de programas que permite al programador expresar sus pensamientos de una forma clara, utilizando su lenguaje natural y mostrando el orden de ejecución de las sentencias del programa sin ninguna ambigüedad. El Pseudocódigo no está diseñado como lenguaje compilable. Pasar del programa escrito en Pseudocódigo al programa escrito en un lenguaje cualquiera de programación resulta muy sencillo.

Numéricos Encontramos los enteros y los reales Enteros: 7, 128, -15, 36, -74
Reales: 7.5, -12.6, 48.1, -365.9

Alfanuméricos
Son datos cuyo contenido pueden ser letras del abecedario (a, b, c, ...Pueden ser de tipo carácter (simples) y cadena de caracteres (estructurado).
- Los demás caracteres pueden ser letras (a, b, c, ...Constantes: son datos que no cambian durante la ejecución de un programa. Variables: son objetos que pueden cambiar su valor durante la ejecución de un programa.
- Estructuras de control
Por lo regular en un programa los enunciados son ejecutados uno después del otro, en el orden en que aparecen escritos. Todos los programas pueden ser escritos en términos de solo tres estructuras de control (estructuras algorítmicas),
a saber, la estructura de secuencia, la estructura de selección y la estructura de repetición (bucle o iteración).

Estructura de secuencia Independiente
La estructura de secuencia independiente se da cuando las acciones
pueden intercambiar su orden de ejecución sin alterar el resultado final.

Estructura de secuencia Dependiente
Se da cuando las acciones no pueden intercambiar su orden de ejecución
sin alterar el resultado final.

Estructuras de selección simples
Las estructuras de selección simples se conocen como “Si entonces” (IF
THEN).

Estructuras de selección dobles
Las estructuras de selección dobles se conocen como “Si
entonces / sino” (IF THEN / ELSE). 2.3.3. Estructura de repetición (bucle o iteración)
Las estructuras algorítmicas repetitivas están definidas por ciclos (conjunto de instrucciones que se
ejecutan repetidamente). Las estructuras de repetición se clasifican de la siguiente manera:

CLASIFICACION DE LAS ESTRUCTURAS ALGORITMICAS REPETITIVAS ESTRUCTURA REPETITIVA NOMBRE DESCRIPCIÓN
Repetir (para) FOR Es la estructura algorítmica adecuada para utilizar en un ciclo que se ejecutará un número definido de veces.
Hacer, Mientras DO WHILE Es considerado un bucle de prueba posterior, conocido como bucle controlado a la salida.
La sentencia para requiere que conozcamos por anticipado el número de veces que se ejecutan las sentencias del interior del bucle.
El pseudocódigo es el siguiente:
Desde cont <-- valor inicial hasta valor final hacer sentencias fin_desde
Al ejecutarse la sentencia para (o desde) la primera vez, el valor inicial se asigna a cont, que se denomina variable de control, y a continuación se ejecuta la sentencia del interior del bucle. Al llegar al final del bucle se verifica si el valor final es mayor que el valor inicial; en caso negativo se incrementa el
valor de la variable de control en uno y se vuelven a ejecutar todas las sentencias del interior del bucle,hasta que la variable de control sea mayor que el valor final, en cuyo momento se termina el bucle.

Los valores inicial y final pueden ser tanto expresiones como constantes.
• Es ilegal intentar modificar el valor de la variable de control, valor inicial y el valor final dentro del bucle.

Sentencia Mientras..Por esta razón a estos bucles se les denomina bucles condicionales.
Si se evalúa a falso, ninguna acción se realiza y el programa prosigue en la siguiente sentencia después del bucle. Este proceso se repite mientras que la expresión lógica sea verdadera.
La sentencia do while es considerada un bucle de prueba posterior, conocida como bucle controlado a la salida.
La sintaxis de la instrucción do while es:
Do
Instrucción;
while(expresión);