sábado, 10 de agosto de 2013

Recorrido en anchura y en profundidad de un grafo representado por una matriz


RECORRIDO EN ANCHURA

 

"En Ciencias de la ComputaciónBúsqueda en anchura (en inglés BFS - Breadth First Search) es un algoritmo para recorrer o buscar elementos en un grafo (usado frecuentemente sobre árboles). Intuitivamente, se comienza en la raíz (eligiendo algún nodo como elemento raíz en el caso de un grafo) y se exploran todos los vecinos de este nodo. A continuación para cada uno de los vecinos se exploran sus respectivos vecinos adyacentes, y así hasta que se recorra todo el árbol."
Un recorrido en anchura se refiere a recorrer un grafo por niveles, es decir, partiendo de un nodo inicial recorro todos sus vecinos, posteriormente los vecinos de los vecinos hasta que todos los nodos hayan sido visitados.

RECORRIDO EN PROFUNDIDAD

"Una Búsqueda en profundidad (en inglés DFS o Depth First Search) es un algoritmo que permite recorrer todos los nodos de un grafo o árbol (teoría de grafos) de manera ordenada, pero no uniforme. Su funcionamiento consiste en ir expandiendo todos y cada uno de los nodos que va localizando, de forma recurrente, en un camino concreto. Cuando ya no quedan más nodos que visitar en dicho camino, regresa (Backtracking), de modo que repite el mismo proceso con cada uno de los hermanos del nodo ya procesado."


Un recorrido en profundidad es que partiendo de un nodo inicial, visite toda una rama, luego otra hasta que todos los nodos hayan sido visitados.

A continuación un ejemplo sencillo de ambos recorridos realizado en Java:

import java.util.ArrayList;

/**
 * Clase Grafo
 * @author Juan Sebastian
 */
public class Grafo {

    public int[][] g = {{2, 1, 0, 1, 0},

                        {1, 2, 1, 0, 0},
                        {0, 1, 2, 1, 0},
                        {1, 0, 1, 2, 1},
                        {0, 0, 0, 1, 2}};
    private boolean[] visitiadoAnchura = new boolean[5];
    private boolean[] visitiadoProfunidad = new boolean[5];

    public Grafo() {

    }

    public int[][] getG() {

        return g;
    }

public ArrayList<Integer> recorridoAnchura(int nodoI)
{
//Lista donde guardo los nodos recorridos
        ArrayList<Integer> recorridos = new ArrayList<Integer>();
//El nodo inicial ya está visitado
        visitiadoAnchura[nodoI] = true;
//Cola de visitas de los nodos adyacentes
        ArrayList<Integer> cola = new ArrayList<Integer>();
//Se lista el nodo como ya recorrido
        recorridos.add(nodoI);
//Se agrega el nodo a la cola de visitas
        cola.add(nodoI);
//Hasta que visite todos los nodos
        while (!cola.isEmpty()) {
            int j = cola.remove(0); //Se saca el primero nodo de la cola
//Se busca en la matriz que representa el grafo los nodos adyacentes
            for (int i = 0; i < g.length; i++) {
//Si es un nodo adyacente y no está visitado entonces
                if (g[j][i] == 1 && !visitiadoAnchura[i]) {
                    cola.add(i);//Se agrega a la cola de visitas
                    recorridos.add(i);//Se marca como recorrido
                    visitiadoAnchura[i] = true;//Se marca como visitado
                }
            }
        }
        return recorridos;//Devuelvo el recorrido del grafo en anchura
    }

    public ArrayList<Integer> recorridoProfunidad(int nodoI) {
//Lista donde guardo los nodos recorridos
        ArrayList<Integer> recorridos = new ArrayList<Integer>();
        visitiadoProfunidad[nodoI] = true;//El nodo inicial ya está visitado
//Cola de visitas de los nodos adyacentes
        ArrayList<Integer> cola = new ArrayList<Integer>();
        recorridos.add(nodoI);//Listo el nodo como ya recorrido
        cola.add(nodoI);//Se agrega el nodo a la cola de visitas
        while (!cola.isEmpty()) {//Hasta que visite todos los nodos
            int j = cola.remove(0);//Se saca el primer nodo de la cola
    //Se busca en la matriz que representa el grafo los nodos adyacentes
            for (int i = 0; i < g.length; i++) {
//Si es un nodo adyacente y no está visitado entonces
                if (g[j][i] == 1 && !visitiadoProfunidad[i]) {
                    cola.add(i);//Se agrega a la cola de visita
//Se recorren los hijos del nodo actual de visita y se agrega el recorrido al la lista
                    recorridos.addAll(recorridoProfunidad(i));
                    visitiadoProfunidad[i] = true;//Se marca como visitado
                }
            }
        }
        return recorridos;//Se devuelve el recorrido del grafo en profundidad
    }
}

Para porbar los métodos se ejecuta el siguiente código:

public class Prueba {

/**

     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Grafo g=new Grafo();
        ArrayList<Integer> enAnchura=g.recorridoAnchura(0);//Nodo inicial 0
        System.out.println("Recorrido en anchura de un grafo representado como matriz: ");
        for(int i=0;i<enAnchura.size();i++){
            System.out.print(""+enAnchura.get(i)+" ");
        }
        ArrayList<Integer> enProfundidad=g.recorridoProfunidad(0);//Nodo inicial 0
        System.out.println("");
        System.out.println("Recorrido en profundidad de un grafo representado como matriz: ");
        for(int i=0;i<enProfundidad.size();i++){
            System.out.print(""+enProfundidad.get(i)+" ");
        }
    }

}


ÉXITOS

lunes, 3 de junio de 2013

viernes, 31 de mayo de 2013

Hola Mundo para Android en Titanium Studio

Les traigo la primera aplicación para Android que he desarrollado en Titanium Studio.


HOLA MUNDO

/**
 * My first app in Titanium: Hello World
 * Mi primera aplicación en Titanium: Hola Mundo
 */


/**
 * Let’s create a window
 * Vamos a crear una ventana
 *
 * Tittle|Título: Hola Mundo
 * Background Color|Color de fondo: white|blanco
 */
var win1 = Titanium.UI.createWindow({ //Aquí van los parámetro de la ventana
title:‘Hola Mundo’,
backgroundColor: ‘white’
});

/**
 * Let’s create a button
 * Vamos a crear un botón
 *
 * Tittle|Título: ¿Hay alguien ahí?
 * Background Color|Color de fondo: blue|azul
 */
var button = Titanium.UI.createButton({ //Aquí van los parámetro del botón
tittle: ‘¿Hay alguien ahí?’,
width:200,
heigth:90,
opacity:1//Muy opaco
});


/**
 * Let’s add a event listenner that say us Hello
 * Dejemos que nos escuche y nos diga hola
 */
button.addEventListener(‘click’,function(e){
alert(‘!!!Hola Mundo¡¡¡’);
});


/**
 * Finally we add the button to the window
 * Finalmente añadimos el botón a la ventana
 */
win1.add(button);

/**
 * And show the window
 * Y mostramos la ventana
 */
win1.open()




Error Generating R.java from manifest

Generalmente el famoso "Error Generating R.java from manifest" es debido a nombrar mal el ID de la aplicación. La forma válida de nombrarlo es "un dominio cualquiera"."nombre de la empresa"."nombre de la aplicación". Por ejemplo: com.programandoando.holamundo. Sin embargo y por experiencia propia les digo que la solución a este error no siempre se reduce a ponerle un ID válido a nuestra aplicación. 

Es importante que tengas en cuenta que para que Titanium lanze la aplicación necesitas copiar dos archivos y una carpeta que debes encontrar en "ubicación del SDK"/android-sdk-linux/build-tools/17.0.0/ a "ubicación del SDK"/android-sdk-linux/platform-tools/.

Aapt, dx y lib en build-tools
Aapt, dx y lib en build-tools
Para copiar esta carpeta y estos archivos basta con ejecutar los siguientes comandos en una terminal:

Los archivos aapt y dx:

aapt

sudo cp "ubicación del SDK"/android-sdk-linux/build-tools/17.0.0/aapt "ubicación del SDK"/android-sdk-linux/platform-tools/
dx

sudo cp "ubicación del SDK"/android-sdk-linux/build-tools/17.0.0/dx "ubicación del SDK"/android-sdk-linux/platform-tools/

La carpeta lib:

sudo cp -r "ubicación del SDK"/android-sdk-linux/build-tools/17.0.0/lib/ "ubicación del SDK"/android-sdk-linux/platform-tools/

Este proceso también da solución a un error de la construcción de la aplicación: [ERROR] Exception occured while building Android project:

Por último, sólo queda probar y a desarrollar se dijo.

miércoles, 29 de mayo de 2013

Titanium y Rhino

En esta ocasión he tenido un problema al tratar de ejecutar Titanium.

RunTimeAndroidRhino

El intérprete de JavaScript Rhino esta deprecado o en desuso. Por lo tanto no permite lanzar la aplicación en el emulador.
Podemos resolver esto de manera muy sencilla. Antes de ejecutar la aplicación, vamos a configuración de ejecución (Run Configuration) donde nos aparecerá:

Run Configuration

Allí seleccionaremos la versión 2.3[x86] de Android, aplicamos y ejecutamos.

Instalar Titanium Studio en Ubuntu 12.10

Titanium Studio es uno de los producto ofrecidos por Appcelerator.Inc.

Es un IDE basado en Eclipse. A diferencia de Eclipse, Titanium ofrece diferentes herramientas para el desarrollo de las aplicaciones principalmente móviles, permitiéndonos desarrollar para iOS, Android o Blackberry. Entre estas herramientas está la implementación de Objective C para desarrollar para iOS, o JavaScript para SmartPhones o tablets con Android. Además, el Android SDK nos permite probar nuestras aplicaciones en una Máquina Virtual, o en nuestros dispositivos.

Si nada de los que has hecho hasta ahora ha funcionado para que Titanium Studio haga lo que quieres, empieza por desinstalar o eliminar los archivos y carpetas de Titanium y el sdk de android, porque será necesario reinstalar todo.

NOTA: Haz este proceso sólo si ninguna otra solución que hayas encontrado te ha funcionado

NOTA: En algunos foros se dice que se requiere la versión 1.6 (ó 6) del jdk de Sun Microsystems, pero experiencias propias apuntan a que, por lo menos, la última versión estable de Titanium funciona bien con jdk 1.7 (ó 7) bien sea de Sun MicroSystems o el OpenJDK. Yo utilizo OpenJDK 1.7

Android SDK
  1. Descarga nuevamente el Android SDK revisión 22 de aquí.
  2. Descomprímelo donde desees.
  3. Una vez descomprimido abrelo y lee el README.txt, allí encontrarás un comando que sugiero ejecutar para descargar todos los API’s
  4. Los que deseen evitar leerse todo, el comando es: “ruta donde descomprimiste del SDK”/tools/android update sdk –no-ui . Este comando descargará todas las API's y otros archivos necesarios. De esta manera evitaremos problemas con las versiones de android que solicita el Titanium. Sólo debes abrir una terminal, ejecutarlo, aceptar las licencias y esperar a que se complete (Proceso que puede tardar 45 minutos dependiendo de la velocidad de conexión que tengas).
“Las licencias que encontrarás son solo unas condiciones sobre derechos de autor, y uso de las API’s. Pero lo que tu hagas seguirá siendo de tu propiedad, teniendo en cuenta que lo que ya tiene dueño como las API’s propias de Google obviamente seguirán siendo de ellos”
Android SDK
Instalación completa del Android SDK

Titanium Studio
  1. Ahora descargas el Titanium Studio en su última versión estable (3.1.0.201304151600) de aquí.
  2. Descomprimes el archivo donde desees.
  3. Ejecutas Titanium Studio.
  4. Ingresas tu cuenta de Titanium.
  5. Al instalarlo o ejecutarlo, nos solicita ingresar la ruta del Android SDK. Lo hacemos.
  6. Si es la primera vez que instalas Titanium te descargará varios programas y actualizaciones, entre ellos el más destacado es NodeJS. De lo contrario, si es la segunda vez, ya estará cumpliendo con los requisitos y tendrá los programas y actualizaciones necesarias.
  7. Veremos que todas las API’s y versiones de Android han quedado instaladas, y Titanium reconoce el SDK sin ningún problema.
  8. Instalamos todas las actualizaciones. Deben verificar que el NodeJS esté instalado. Para ello van a una terminal y digitan el comando nodejs -v, comando que nos dirá la versión que se ha instalado del NodeJS.
  9. NodeJs está instalado
    NodeJs está instalado

  10. Reiniciamos Titanium Studio.
  11. Ha quedado listo Titanium Studio y esperemos que sea suficiente para empezar a desarrollar nuestras aplicaciones
Titanium Full
Titanium instalado con todas sus actualizaciones y el SDK funcionando correctamente

11 reglas para la vida


Once reglas para la vida de los jóvenes, falsamente atribuidas a Bill Gates. 1. La vida no es justa. Acostúmbrate a ello.

2. Al mundo no le importa tu autoestima. El mundo espera que logres algo, independientemente de que te sientas bien o no contigo mismo.

3. No ganarás 5.000 euros mensuales justo después de salir de la universidad, y no serás vicepresidente de nada hasta que, con tu esfuerzo, te hayas ganado ambos logros.

4. Si piensas que tu profesor es duro, espera a que tengas un jefe. Este sí que no tendrá vocación docente ni la paciencia requerida.

5. Dedicarse a servir cervezas o llevar pizzas no te quita dignidad. Tus abuelos lo llamaban de otra forma: Oportunidad.

6. Si metes la pata no es culpa de tus padres ni de tus profesores, así que no lloriquees por tus errores y aprende de ellos.

7. Antes de que nacieras, tus padres no eran tan aburridos como ahora. Empezaron a serlo al pagar tus cuentas, limpiar tu ropa y escuchar tus quejas . Así que, antes de emprender tu lucha por las selvas vírgenes contaminadas por la generación de tus padres, inicia el camino limpiando las cosas de tu propia vida, empezando por tu habitación.

8. En la escuela puede haberse eliminado la diferencia entre ganadores y perdedores, pero en la vida real NO. En la escuela te dan oportunidades para ir aprobando tus exámenes, para que tus tareas te resulten más fáciles y llevaderas. Esto no te ocurrirá en la vida real.

9. La vida real no se divide en semestres, no tendrá largas vacaciones de verano, de pascua, de navidad, del patrón del colegio, puentes, etc. y pocos jefes se interesarán en ayudarte a que te encuentres a ti mismo. Todo eso tendrás que hacerlo en tu tiempo libre.

10. La televisión no es la vida diaria. En la vida cotidiana la gente de verdad tiene que salir del café de la película para irse a trabajar.

11. Sé amable con los nerds. Hay muchas probabilidades de que termines trabajando para uno de ellos.
11 reglas para la vida