sábado, 20 de abril de 2013

Árbol Binario 

En ciencias de la computación, un árbol binario es una estructura de datos en la cual cada nodo siempre tiene un hijo izquierdo y un hijo derecho. No pueden tener más de dos hijos (de ahí el nombre "binario"). Si algún hijo tiene como referencia a null, es decir que no almacena ningún dato, entonces este es llamado un nodo externo. En el caso contrario el hijo es llamado un nodo interno. Usos comunes de los árboles binarios son los árboles binarios de búsqueda, los montículos binarios y Codificación de Huffman.




Tipos de árboles binarios

Un árbol binario es un árbol con raíz en el que cada nodo tiene como máximo dos hijos.




  1. Un árbol binario lleno es un árbol en el que cada nodo tiene cero o dos hijos.
  1. Un árbol binario perfecto es un árbol binario lleno en el que todas las hojas (vértices con cero hijos) están a la misma profundidad (distancia desde la raíz, también llamada altura).
  1. A veces un árbol binario perfecto es denominado árbol binario completo. Otros definen un árbol binario completo como un árbol binario lleno en el que todas las hojas están a profundidad n o n-1, para alguna n.

Programa de Árbol binario JavaSe implementara un programa que solicite una cantidad de datos a ingresar y posteriormente los ordenra como un árbol binario.
  1. Solicitara la cantidad de datos a ingresar
  1. solicitar ingresar datos numéricos hasta completar la cantidad indicada en el punto uno
  1. desplegara los datos ordenados en orden
  1. Indicara cuanto son la cantidad de nodos 
  1. Indicara cuantos nodos son del tipo hoja
  1. Desplegara los datos indicando su nivel
  1. Desplegara la altura del árbol
  1. Desplegara el mayor valor del árbol
  1. eliminara el menor valor



Actividades implementadas



Salida del programa


run:
Ingrese el numero de Datos a capturar: 7
Ingrese Dato Solo Numerico 1:  
11
Ingrese Dato Solo Numerico 2:  
33
Ingrese Dato Solo Numerico 3:  
55
Ingrese Dato Solo Numerico 4:  
6
Ingrese Dato Solo Numerico 5:  

8
Ingrese Dato Solo Numerico 6:  
00
Ingrese Dato Solo Numerico 7:  
1
Impresion entreorden: 
0 1 6 8 11 33 55 
Cantidad de nodos del árbol:7
Cantidad de nodos hoja:3
Impresion en entre orden junto al nivel del nodo.
0 (3) - 1 (4) - 6 (2) - 8 (3) - 11 (1) - 33 (2) - 55 (3) - 
Artura del arbol:4
Mayor valor del árbol:55
Luego de borrar el menor:
1 6 8 11 33 55 


clases 


main 

package cl.arbol;

public class main {

    public static void main (String [] ar)
    {
        ArbolBinarioOrdenado abo = new ArbolBinarioOrdenado ();
        
        java.util.Scanner leer=new java.util.Scanner(System.in);
                int z;
        System.out.print("Ingrese el numero de Datos a capturar: ");
        z=leer.nextInt();
        for(int i=1; i<=z;i++){
        int m;
        System.out.println("Ingrese Dato Solo Numerico "+i+":  ");m=leer.nextInt();
        abo.insertar(m);
        }
    
        
        System.out.println ("Impresion entreorden: ");
        abo.imprimirEntre ();
        System.out.println ("Cantidad de nodos del árbol:"+abo.cantidad());
        System.out.println ("Cantidad de nodos hoja:"+abo.cantidadnodosHoja());          
        System.out.println ("Impresion en entre orden junto al nivel del nodo.");
        abo.imprimirEntreConNivel();
        System.out.print ("Artura del arbol:");
        System.out.println(abo.retornarAltura());        
        abo.mayorValorl();
        abo.borrarMenor();
        System.out.println("Luego de borrar el menor:");
        abo.imprimirEntre ();
    }

}



ArbolBinarioOrdenado 


package cl.arbol;

class ArbolBinarioOrdenado {
  
     nodo raiz;
private int cant;
private int altura;
//constructor
     public ArbolBinarioOrdenado()
     {
         raiz=null;
     }
     
     private void imprimirPre (nodo reco)
     {
         if (reco != null)
         {
             System.out.print(reco.info + " ");
             imprimirPre (reco.izq);
             imprimirPre (reco.der);
         }
     }

     public void imprimirPre ()
     {
         imprimirPre (raiz);
         System.out.println();
     }

     private void imprimirEntre (nodo reco)
     {
         if (reco != null)
         {    
             imprimirEntre (reco.izq);
             System.out.print(reco.info + " ");
             imprimirEntre (reco.der);
         }
     }

  
     private void imprimirPost (nodo reco)
     {
         if (reco != null)
         {
             imprimirPost (reco.izq);
             imprimirPost (reco.der);
             System.out.print(reco.info + " ");
         }
     }


     public void imprimirPost ()
     {
         imprimirPost (raiz);
         System.out.println();
     }

     
     
     public void insertar (int info) {
         if (!existe(info)) {
             nodo nuevo;
             nuevo = new nodo ();
             nuevo.info = info;
             nuevo.izq = null;
               nuevo.der = null;
             if (raiz == null)
                 raiz = nuevo;
             else {
                 nodo anterior = null, reco;
                 reco = raiz;
                 while (reco != null)  {
                     anterior = reco;
                     if (info < reco.info)
                         reco = reco.izq;
                     else
                         reco = reco.der;
                 }
                 if (info < anterior.info)
                     anterior.izq = nuevo;
                 else
                     anterior.der = nuevo;
             }
         }    
     }

     public boolean existe(int info) {
         nodo reco=raiz;
         while (reco!=null) {
             if (info==reco.info)
                 return true;
             else
                 if (info>reco.info)
                     reco=reco.der;
                 else
                     reco=reco.izq;
         }
         return false;
     }

     public void imprimirEntre () {
         imprimirEntre (raiz);
         System.out.println();
     }

     
     private void cantidad(nodo reco) {
         if (reco!=null) {
             cant++;
             cantidad(reco.izq);
             cantidad(reco.der);
         }
     }
     
     public int cantidad() {
         cant = 0;
         cantidad(raiz);
         return cant;
     }

     private void cantidadnodosHoja(nodo reco) {
         if (reco!=null) {
             if (reco.izq==null && reco.der==null)
                 cant++;
             cantidadnodosHoja(reco.izq);
             cantidadnodosHoja(reco.der);
         }
     }
     
     public int cantidadnodosHoja() {
         cant=0;
         cantidadnodosHoja(raiz);
         return cant;
     }

     private void imprimirEntreConNivel (nodo reco,int nivel)  {
         if (reco != null) {    
             imprimirEntreConNivel (reco.izq,nivel+1);
             System.out.print(reco.info + " ("+nivel+") - ");
             imprimirEntreConNivel (reco.der,nivel+1);
         }
     }

     public void imprimirEntreConNivel () {
         imprimirEntreConNivel (raiz,1);
         System.out.println();
     }
     
     private void retornarAltura (nodo reco,int nivel)    {
         if (reco != null) {    
             retornarAltura (reco.izq,nivel+1);
             if (nivel>altura)
                 altura=nivel;
             retornarAltura (reco.der,nivel+1);
         }
     }

     public  int retornarAltura () {
         altura=0;
         retornarAltura (raiz,1);
         return altura;
     }
     
     public void mayorValorl() {
         if (raiz!=null) {
             nodo reco=raiz;
             while (reco.der!=null)
                 reco=reco.der;
             System.out.println("Mayor valor del árbol:"+reco.info);
         }
     }
     
     public void borrarMenor() {
         if (raiz!=null) {
             if (raiz.izq==null)
                 raiz=raiz.der;
             else {
                 nodo atras=raiz;
                 nodo reco=raiz.izq;
                 while (reco.izq!=null) {
                     atras=reco;
                     reco=reco.izq;
                 }
                 atras.izq=reco.der;
             }                  
         }
     }      
}

nodo


package cl.arbol;


public  class nodo
{
    int info;
    nodo izq, der;
  }






Refrencias 

http://es.wikipedia.org/wiki/%C3%81rbol_binario

Juan Carlos Delgado

viernes, 19 de abril de 2013

Tarea 3 [Marco Infante] - Algoritmo básico de búsqueda en Java


 Este programa desarrollado en el lenguaje de programación Java cumple con los siguientes requerimientos.

- Permite definir el rango de un vector, ingresar números que cumpla con la condición de N° par y estén dentro de un rango definido.

- Despliega el resultado del vector.

____________________________________________________________

package Tarea_3;


import java.util.Scanner;


public class Tarea_3 {


       public static void main(String[] args) {
               
     int i;
     int r;
     int min;
     int max;  
     int num;
     int cont;
    
     int vector[];
  
     Scanner leer=new Scanner(System.in);
   
     cont=0;
    
     System.out.print(" Ingrese Tamaño del Vector: ");
     r = leer.nextInt();
    
        vector = new int[r];
       
         System.out.print("\n");
   
    while (cont<r)
     {
       min=2;
       max=100;
   
              for(i=cont;i<r;i++)
                    {
    
                       System.out.print(" Ingrese numero: ");
                       vector[i]=leer.nextInt();

                       num=vector[i];

              if (num >= min && num <= max && num % 2==0)
                       {
                                           
                   System.out.print(" Numero bien ingresado!!");
                   System.out.print("\n");
                   cont++;
               
                    System.out.print("\n");
                       }
               else
                       {
                     i--;     
                     System.out.print("Intenta denuevo, con N° pares entre 2 y 100");
                     System.out.print("\n");
                      System.out.print("\n");
                       }
                                                
                    }
           }           
            System.out.print("\n");   
  
              for (i=0;i<vector.length;i++)
                 {
                    System.out.println(" Los numeros son = " +vector[i]);
                 }

       
    }
}

____________________________________________________________

Tarea 3 [Marcelo Contreras ] - Algoritmo Arbol Binario en Java



Estimados he creado unas clases de para representar un Árbol binario. Les dejo el proyecto en



Donde pueden encontrar y revisar las clases:

Árbol Binario, que contiene los métodos de inserción, búsqueda y listado (inorden, preorden, postorden) en el árbol binario.


Estructura de datos, interfaz de Arbol binario y otras posibles estructuras.

Nodo, representación objeto de un nodo del árbol.

Por ultimo encontrar la clase Main que les puede ser util para respectivas pruebas a los metodos de ArbolBinario.


Quedo atento a sus dudas y comentarios :)

Marcelo Contreras

jueves, 4 de abril de 2013

Hitos en el Desarrollo de la Inteligencia Artificial (IA)

cronológica de la Inteligencia artificial

ACI 710 - 181





HISTORIA

Él termino "inteligencia artificial" fue expuesto por primera vez en 1956, por John McCarthy, durante la conferencia de Darthmounth, pero para entonces ya se había estado trabajando en ello durante cinco años en los cuales se había propuesto muchas definiciones distintas que en ningún caso habían logrado ser aceptadas totalmente por la comunidad investigadora.
McCarthy la definió: "Es la ciencia e ingeniería de hacer máquinas inteligentes, especialmente programas de cómputo inteligentes" sin embargo a lo largo del tiempo han salido definiciones como :

"El ofrecimiento por parte de la máquina de un comportamiento parecido al humano que es capaz de acomodarse o ajustarse a una disposición o situación real o ficticia y poder escoger de acuerdo a una serie de particularidades para dar una respuesta rápida y lo más acertada posible." (Costa 1995)

"La Inteligencia Artificial estudia cómo lograr que las máquinas realicen tareas que, por el momento, son realizadas mejor por los humanos" (Rich y Knight 1994)

"La IA es la rama de la ciencia de la computación que se ocupa de la automatización de la conducta inteligente." (Lugar y Stubblefied, 1993).

"Estudio de las computaciones que permiten percibir, razonar y actuar" (Winston, 1992).

"La IA es el estudio de cómo lograr que las computadoras realicen tareas que, por el momento, los humanos hacen mejor." (Rich, Knight, 1991).

"La IA es el arte de crear maquinas con capacidad de realizar funciones que realizadas por personas requieren de inteligencia." (Kurzweil, 1990)

"La IA es el campo de estudio que se enfoca a la explicación y emulación de la conducta inteligente en función de procesos computacionales." (Schalkoff, 1990).

"La parte de la Informática que trata de Sistemas computarizados inteligentes, es decir, Sistemas que muestran las características que pueden asociarse a la inteligencia en lo que se refiere al comportamiento humano: comprensión del lenguaje, aprendizaje, razonamiento, resolución de problemas, etc." (Amat 1989)

"Arte de construir maquinas capaces de hacer cosas que requerirían inteligencia en caso de que fuesen hechas por los seres humanos" (Minsky, 1986).

"Automatización de actividades que vinculamos con procesos del pensamiento humano, tales como toma de decisiones resolución de problemas, aprendizaje" (Bellman, 1978).


En el libro Inteligencia Artificial: Un Enfoque Moderno, Stuart Russell and Peter Norvig categorizan la inteligencia artificial tomando todas las definiciones existentes encontrando orientaciones hacia el actuar como humano o racionalmente y a su vez el pensar como humano o racionalmente.


Actuar como humano. El modelo a seguir para la evaluar si un programa es inteligente corresponde al comportamiento humano. El llamado Test de Turing (1950) también utiliza este punto de vista.

Pensar como humano. Lo importante es cómo se realiza el razonamiento y no el resultado de este razonamiento. La propuesta aquí es desarrollar sistemas que piensen del mismo modo que las personas.

Pensar racionalmente. En este caso, la definición también se focaliza en el razonamiento, pero aquí se parte de la premisa de que existe una forma racional de pensar. La lógica permite la formalización del pensamiento y se utiliza para este objetivo.

Actuar racionalmente. De nuevo el objetivo son los resultados, pero ahora evaluados de forma objetiva. Por ejemplo, el objetivo de un programa en un juego como el ajedrez será ganar. Para cumplir este objetivo es indiferente la forma de calcular el resultado.


A medida que las personas se han ido interiorizando en la inteligencia artificial, se ha generado dos lineas de opiniones que sobresaltan en todos los debates con respecto al tema y su futuro, estos son la IA fuerte y la IA débil.

Inteligencia artificial débil
Se considera que los ordenadores únicamente pueden simular que razonan, y únicamente pueden actuar de forma inteligente. Las partidarios de la inteligencia artificial débil consideran que no será nunca posible construir ordenadores conscientes, y que un programa es una simulación de un proceso cognitivo pero no un proceso cognitivo en sí mismo.

Inteligencia artificial fuerte
En este caso se considera que un ordenador puede tener una mente y unos estados mentales, y que, por tanto, un día será posible construir uno con todas las capacidades de la mente humana. Este ordenador será capaz de razonar, imaginar, etc.


Estos son algunos de los hitos mas importantes de los últimos 20 años:

CRONOGRAMA


1980
- Los Sistemas Expertos llegan hasta unas mil reglas


1981
- Kazuhiro Fuchi anuncia el proyecto japonés Quinta Generación
- Estados Unidos constituyó la Mícroelectronics and Computer Technology Corporation (MCC).
- IBM introduce el Personal Computer (PC)



1982
- John Hopfield resucita las redes neuronales
- El primer sistema experto comercial que tuvo éxito, R 1.
1983
- DARPA anuncia la Iniciativa de Computación Estratégica
1984
- "Wabot-2" lee partituras y toca órgano

1986
- Jugador de ping-pong robótico de Anderson juega contra humanos
- La máquina HiTech de CMU compite a nivel de maestro senior en ajedrez
1987
- 1,900 sistemas expertos funcionando
- "El invierno de la IA"; mercado de máquinas Lisp saturado
1988
-Chip 386 aumenta la velocidad de los PC y compite con las máquinas LISP


1992
- Apple presenta Dylan, un lenguaje de la familia Lisp, considerándolo el futuro de la programación
- X3J13 crea un proyecto de estándar para Common Lisp

1994
- El ANSI Common Lisp se vuelve el primer estándar ANSI OOPL
- Aparece 'Cog', el robot androide de Rodney Brooks en el MIT



1996
 - IBM, Crea la computadora autónoma Deep Blue (RS/6000), la cual el campeón mundial de ajedrez Garry Kasparov derrota estrechamente.

1997
- Campeón mundial de ajedrez, pierde ante la computadora autónoma Deep Blue (RS/6000)

1999
- Cynthia Breazel, diseña el Kismet, uno de los primeros robots en responder en forma natural



LA INTELIGENCIA ARTIFICIAL DESDE EL 2000 EN ADELANTE Y SUS EFECTOS EN NUESTRAS VIDAS.


Durante los años 2000 en adelante encontramos grande usos de la inteligencia artificial en la vida diaria lo ha mejorado nuestra cálida de vida y muchas veces ha salvado vidas.

En el año 2000 se produjo una de muchas  revoluciones gracias a IA nos referimos a la  “VIDEO VIGILANCIA”

El desarrollo de este tipo de aplicaciones se inició con la incorporación de mecanismos digitales a los sistemas de CCTV y la investigación acerca de algoritmos para el procesamiento de video inteligente, a finales de los años noventa, se intensificó con el proyecto de la Oficina de Sistemas de Información de la Agencia de Investigación de Proyectos Avanzados de Defensa  del gobierno de los Estados Unidos (DARPA, DefenceAdvancedResearchProjects Agency) para desarrollar un sistema de Monitoreo y Vigilancia de Video (VSAM, Video Surveillance And Monitoring) con propósitos inicialmente militares que posteriormente se extendieron a la seguridad en general con múltiples aplicaciones no solo en seguridad.

Hoy en día contamos poderoso es software de vigilancia en tiempo real capases de controlar múltiples cámaras instaladas en todo el planeta. 
Un de estas aplicaciones son los aviones no tripulado utilizados en la milicia.





También encontramos usos domestico como el siguiente


Nacimiento de la Tele-medicina



Hoy en dia contamos con la capacidad de estar siempre conectados si ha esto le sumamos las nueva generaciones de robots nace el concepto de la

La telemedicina brindar asistencia médica a quien la requiera en sitios distantes en este concepto se incluyen dentro de este campo:
  • La educación para la salud
  • Salud pública
  • El desarrollo de programas de salud 
  • Estudios epidemiológicos, entre otros. 
El impulso básico para el desarrollo de la Telemedicina radica en su propia naturaleza, por la potencialidad de sus aplicaciones prácticas que la hacen necesaria tanto para médicos como para pacientes.

En el ño 2001 se realizó la primera operación transoceánica de la historia, por medio de la telemedicina y usando dos sistemas de cirugía telerrobótica un equipo médico, Un doctor en New York elimina la vesícula enferma de un paciente de 68 años ingresada en un hospital de Estrasburgo, Francia, esto por medio de un brazo robot.
Hoy en dia contamos con versiones mucho mas avanzadas que permite realizar operaciones de alta complejidad con un gran equipo medico.  Un ejemplo de esto es el robots da Vince




También encontramos este concepto aplica a nuestra realidad en el sur de chile con el proyecto de TELMED-UDEC


     Segunda Parte





La ro-botica al servicio del entretenimiento


En paralelo a todas estas aplicaciones continuo la carrera de las grandes industrias tecnologicas entre Honda y Sony esta centrada en  crear el robots mas avanzado orientados a la industria del entretenimiento es así como en el año 2003 nace  QRIO que no es el primer robots para Sony, pero si fue el más rápido robot bípedo y capaz de correr. Puede hacerlo a 14 metros por minuto. 

El prototipo metálico QRIO, que pesa 7 kilos, mide 58 centímetros y tiene los ojos azules, hizo la demostración, ante un auditorio repleto de periodistas sobre su capacidad de perder el contacto con el suelo. También demostró que podía golpear una bola de béisbol y bailar con banderillas en las manos.



Este es uno de los vídeos promocionarles de para este producto, aun que este nunca se llego a comercializar




El nuevo Robot humanoide Nao



Nao es el robot de la empresa Aldelbaran robotics,  El proyecto se inició a principios de 2005 y tiene por objetivo poner a disposición del público a un precio asequible un robot humanoide con mecánica, electrónica, y con características cognitivas.

Inicialmente fabricado para evolucionar en base a los comportamientos, Nao se lanzará al mercado como la iniciación ideal a los robots. Finalmente se convertirá en un compañero familiar autónomo. También se puede encargar de tareas más sofisticadas, (vigilancia, control domótico, etc)
Nao cuenta con una intuitiva interfaz de programación, Choregraphe,con la que toda la familia podrá disfrutar de la experiencia del robot. Sin embargo también satisfará el exigente tecno-adicto.



Algunas aplicaciones mas







El futuro de la industria automotriz: carros autónomos


La forma en que las personas se transportan podría cambiar radicalmente en un par de años, transformando nuevamente la historia del automóvil
Actualmente, las principales compañías en la industria automotriz han presentado grandes avances en cuanto a la Conectividad que se puede tener dentro de un vehículo.
La introducción de  pantallas en cada asiento con aplicaciones, avanzados sistemas de GPS, comandos de voz para encender y apagar un carro, serán solo algunas de las comodidades que tendrá cada carro en los próximos años. Pero más allá de pensar en lo que un carro debe tener, otras compañías se han enfocado en lo que un automóvil puede hacer; es así como nació la idea de un carro que se maneja a si mismo: El carro autónomo.
Durante la última década varias marcas han estado trabajando en el desarrollo de  la tecnología necesaria para que un automóvil se pueda conducir sin necesidad de interacción humana, dándoles libertad a sus pasajeros de hacer otras cosas sin tener que poner toda su atención en la vía. Inicialmente el desarrollo de estos prototipos era solo una prueba para desarrollar tecnología interactiva, pero gracias a la eficiencia que estos vehículos han alcanzado, muy pronto estarán en las vías de varias ciudades. 
Un carro puede finalizar maniobras que un alto porcentaje de personas no podrían llevar a cabo sin entrenamiento especial.
La configuración de los modelos existentes es muy similar, por ejemple el carro autónomo de Google cuenta con un radar rotatorio en la parte superior del carro, el cual reconoce un radio de 60 metros para crear un mapa en 3D de los objetos y personas que se encuentran alrededor del auto. Varias cámaras detectan objetos en movimiento  y luces de transito. Otros 4 radares ubicados en las partes frontales y traseras  determinan la distancia frente a otros objetos  y ayudan a controlar la velocidad del vehículo. Un tercer grupo de radares ubicados cerca de las llantas traseras miden la distancia con los objetos a nivel lateral.
Pero no solo Google ha tomado la iniciativa de desarrollar carros autónomos; otras compañías como Audi y Volkswagen han desarrollado modelos propios, los cuales son completamente funcionales y son capaces de ejecutar maniobras como el prototipo creado por Google.
El objetivo de este proyecto es prevenir los errores humanos además de mejorar las condiciones de tráfico en cualquier vía.
Los automóviles autónomos pueden manejar más cerca entre si mismos y en carriles más estrechos, ya que el sistema de radares es capaz de reaccionar más rápido y con mayor precisión que una persona, pues la integración ente cámaras y radares es le proporciona  al auto información para ejecutar este tipo de acciones. 
Gracias al buen funcionamiento que han demostrado, los carros autónomos fueron oficialmente aceptados desde Marzo en el estado de Nevada, Estados Unidos. Los carros autónomos tendrán que usar una licencia de color rojo, la cual identificará de ahora en adelante a este tipo de automóviles.  
Esta decisión beneficiará a compañías como Google, las cuales han estado probando sus prototipos en California, el estado que podría aprobar el uso de estos vehículos tras su aceptación en nevada. La aprobación para el uso de estos carros llevó a que el departamento de vehículos desarrollara leyes y reglamentos específicos para la operación de dichos carros.
A la fecha el carro de Google ha manejado 258,000 kilómetros autónoma mente con tan solo un accidente menor, el cual fue ocasionado por un error humano.



Demostración del control en pistas con obstáculos 




Link de Referencias


vídeo vigilancia
Telemedicina
Robots de entretenimiendo