Archivo

Archivo para la Categoría "Uncategorized"

GLPK+JAVA+Windows (Guía Rápida)

octubre 25, 2010 2 comentarios

Con esta guía rápida pretendo ahorrar algo de tiempo a aquellos que sean nuevos a GLPK y que quieran usarla desde JAVA ya sea para un proyecto académico (como es mi caso) o de cualquier otra índole. Es una de las muchas maneras de echar a andar la librería, si hay otra solución más fácil y/o sofisticada, por favor no duden en comentarla aquí.

¿Qué es GLPK?

  • GLPK = GNU Linear Programming Kit
  • Paquete escrito en lenguaje C.
  • Ideal para resolver problemas a gran escala de programación lineal (LP),  programación entera mixta (MIP) y otros tipos de problemas relacionados.

Pre-Requisitos

Para comenzar a utilizar esta guía se debe de cumplir con los siguientes pre-requisitos:

  • Tener un compilador de JAVA previamente instalado.

Paso 1 – Bajar WINGLPK

WINGLPK es un paquete pre-compilado de la librería de GLPK para Windows 32 y 64 bits. Hay que bajar el paquete de http://sourceforge.net/projects/winglpk/

Una vez que lo bajaste, descomprime la carpeta del paquete y muévela a la ubicación que quieras en tu sistema. Ejemplo: C:\GLPK\glpk-4.44

Paso 2 – Crear Programa java

Ya sea utilizando tu IDE favorito o el block de notas, crea tu primer programa de JAVA utilizando GLPK. Puedes utilizar el siguiente ejemplo (tomado de la documentación del paquete de glpk: C:\…\glpk-4.44\docs\glpk-java.pdf).

import org.gnu.glpk.GLPK;
import org.gnu.glpk.GLPKConstants;
import org.gnu.glpk.GlpkException;
import org.gnu.glpk.SWIGTYPE_p_double;
import org.gnu.glpk.SWIGTYPE_p_int;
import org.gnu.glpk.glp_prob;
import org.gnu.glpk.glp_smcp;
public class Main {
    // Minimize z = (x1-x2) /2 + (1-(x1-x2)) = -.5 * x1 + .5 * x2 + 1
    //
    // subject to
    // 0.0<= x1 - x2 <= 0.2
    // where,
    // 0.0 <= x1 <= 0.5
    // 0.0 <= x2 <= 0.5
    public static void main(String[] args) {
        glp_prob lp;
        glp_smcp parm;
        SWIGTYPE_p_int ind;
        SWIGTYPE_p_double val;
        int ret;
        try {
            // Create problem
            lp = GLPK.glp_create_prob();
            System.out.println("Problem created");
            GLPK.glp_set_prob_name(lp, "myProblem");
            // Define columns
            GLPK.glp_add_cols(lp, 2);
            GLPK.glp_set_col_name(lp, 1, "x1");
            GLPK.glp_set_col_kind(lp, 1, GLPKConstants.GLP_CV);
            GLPK.glp_set_col_bnds(lp, 1, GLPKConstants.GLP_DB, 0, .5);
            GLPK.glp_set_col_name(lp, 2, "x2");
            GLPK.glp_set_col_kind(lp, 2, GLPKConstants.GLP_CV);
            GLPK.glp_set_col_bnds(lp, 2, GLPKConstants.GLP_DB, 0, .5);
            // Create constraints
            GLPK.glp_add_rows(lp, 1);
            GLPK.glp_set_row_name(lp, 1, "c1");
            GLPK.glp_set_row_bnds(lp, 1, GLPKConstants.GLP_DB, 0, 0.2);
            ind = GLPK.new_intArray(3);
            GLPK.intArray_setitem(ind, 1, 1);
            GLPK.intArray_setitem(ind, 2, 2);
            val = GLPK.new_doubleArray(3);
            GLPK.doubleArray_setitem(val, 1, 1.);
            GLPK.doubleArray_setitem(val, 2, -1.);
            GLPK.glp_set_mat_row(lp, 1, 2, ind, val);
            // Define objective
            GLPK.glp_set_obj_name(lp, "z");
            GLPK.glp_set_obj_dir(lp, GLPKConstants.GLP_MIN);
            GLPK.glp_set_obj_coef(lp, 0, 1.);
            GLPK.glp_set_obj_coef(lp, 1, -.5);
            GLPK.glp_set_obj_coef(lp, 2, .5);
            // Solve model
            parm = new glp_smcp();
            GLPK.glp_init_smcp(parm);
            ret = GLPK.glp_simplex(lp, parm);
            // Retrieve solution
            if (ret == 0) {
                write_lp_solution(lp);
            } else {
                System.out.println("The problem could not be solved");
            }
            // Free memory
            GLPK.glp_delete_prob(lp);
        } catch (GlpkException ex) {
            ex.printStackTrace();
        }
    }
    /**
     * write simplex solution
     * @param lp problem
     */
    static void write_lp_solution(glp_prob lp) {
        int i;
        int n;
        String name;
        double val;
        name = GLPK.glp_get_obj_name(lp);
        val = GLPK.glp_get_obj_val(lp);
        System.out.print(name);
        System.out.print(" = ");
        System.out.println(val);
        n = GLPK.glp_get_num_cols(lp);
        for (i = 1; i <= n; i++) {
            name = GLPK.glp_get_col_name(lp, i);
            val = GLPK.glp_get_col_prim(lp, i);
            System.out.print(name);
            System.out.print(" = ");
            System.out.println(val);
        }
    }
}

Paso 3 – Compilar programa

Para compilar hay que hacer referencia al archivo glpk-java.jar que ya está incluido en nuestro paquete de winglpk, se puede agregar como una librería desde el IDE que estén usando o se puede especificar en el comando del compilador. En mi caso para compilar el programa corro el siguiente comando:

javac -classpath C:\GLPK\glpk-4.44\w64\glpk-java.jar Main.java

Paso 4 – Correr el programa

Para correr el programa se necesita hacer referencia nuevamente a la carpeta en donde se encuentran los archivos pre-compilados de la librería GLPK, en mi caso esta carpeta es C:\GLPK\glpk-4.44\w64. Se pueden modificar las propiedades del proyecto en la IDE en la que se esté trabajando o se puede especificar la ubicación en el comando de java. En mi caso para correr el programa hago lo siguiente:

java -Djava.library.path=C:\GLPK\glpk-4.44\w64 -classpath C:\GLPK\glpk-4.44\w64\glpk-java.jar;. Main

Con –Djava.library.path= le especifico a la VM dónde buscar las librerías que va a cargar dinámicamente (glpk_4_44.dll y glpk_4_44_java.dll).

Problema de ejemplo glpk-java

Más Información

Consulta la documentación que viene en tu distribución de glpk. (Ejemplo C:\…\glpk-4.44\docs\glpk-java.pdf)

Para más información,  recomiendo visitar los siguientes sitios:

http://www.gnu.org/software/glpk/

http://winglpk.sourceforge.net/

http://www.ibm.com/developerworks/linux/library/l-glpk1/

http://codingtech.wordpress.com/2010/03/12/glpk-y-visual-studio-en-10-pasos/

Imaginando el 2020

¿Cómo puede la tecnología transformar nuestras vidas en el año 2020?

El pasado 2 de Marzo de 2010 se abrió la convocatoria del premio Imaginando el 2020 como parte de Microsoft Imagine Cup. El concurso consiste en imaginar el mundo en diez años y expresar esas ideas en forma de un video. El video con los conceptos más ingeniosos, con más potencial de impacto y visión de largo plazo será premiado.

¿Para cuándo?

La fecha límite para participar es el 5 de Mayo de 2010 a las 12:59 PM GMT.

Premios

Si tu equipo está entre los semifinalistas se ganarán un viaje a Varsovia. También se ofrecen los siguientes premios para los tres primeros lugares:

  • Primer lugar: $8,000 USD
  • Segundo lugar: $4,000 USD
  • Tercer lugar: $3,000 USD

Más información

Si te interesó la convocatoria visita el Sitio Oficial de Imagine Cup y revisa las bases para inscribirte con tu equipo.

 

ACM ICPC – México en competencias internacionales de tecnología

ACM ICPC - International Collegiate Programming Contest

La ACM (Association for Computing Machinery) es la sociedad de ciencias computacionales de carácter educacional y científico más grande del mundo.  Uno de los eventos con los que promueven el interés de los estudiantes por las matemáticas, la algoritmia y la programación es la competencia de programación ACM ICPC que se realiza cada año reuniendo a decenas de miles de los mejores estudiantes de diferentes disciplinas de computación de más de 2,000 universidades alrededor del globo.

¿Por qué participar en una competencia de programación? 

Estudiantes en concursos de programacion

  1. Es un reto. Esta competencia de programación presenta al estudiante retos matemáticos y computacionales despertando en él una poco común curiosidad matemática y en poco tiempo, el resolver retos como los que se presentan, puede convertirse en un vicio.
  2. Currículum. Si bien un problema que muchos estudiantes enfrentan al graduarse es el de la experiencia laboral, o la falta de ésta. El participar en un concurso de programación permite al estudiante seguir con su vida estudiantil, y le da cartas de recomendación para presentar ante un futuro empleador.
  3. Trabajo en equipo. Participar en un concurso con un grupo de estudiantes es divertido, y más si el equipo está formado por buenos amigos.
  4. Nuevas experiencias. Jornadas de trabajo de 16 horas, noches en vela programando, viajes, discusiones y chistes algorítmicos. Sin lugar a duda, experiencias nuevas y enriquecedoras que quizás sólo se puedan vivir siendo estudiante.
  5. Promoción tecnológica. Si cada vez más y más universidades mexicanas comienzan a utilizar estos medios para desarrollar habilidades tecnológicas en sus alumnos, seguro que la comunidad internacional lo notará y atraeremos su atención (y quizás también su dinero y tecnología).

Otros concursos de tecnología

Microsoft Imagine Cup 2010Microsoft Imagine Cup

Abierto Nacional de Programacion ANTS

Abierto Nacional de Programación Ants

Desafío Intel América Latina

Desafío Intel América Latina

Cualquier información que pudiera completar esta lista de concursos tecnológicos para apoyar la educación en México es bienvenida. En conclusión, es buen momento para que las universidades contemplen estos “trampolines tecnológicos” en sus reuniones de planeación.

Soluciones Microsoft para la PYME en México

febrero 5, 2010 2 comentarios

La mayoría de las PYMES actuales carecen de una buena organización de su información y pocas cuentan con presencia en internet.

Actualmente sólo 50% de las Pequeñas y Medianas Empresas (Pymes) mexicanas usan equipos de cómputo, de acuerdo con estimaciones de la consultora de comunicaciones Limbergy. [1]

Más que indagar sobre las causas del rezago tecnológico en este sector quisiera proponer una solución básica con herramientas gratuitas y confiables.

La solución propuesta incluye las siguientes herramientas:

  1. Correo electrónico gratuito.
  2. Sitio web gratuito y fácil de administrar.
  3. CRM básico gratuito.
  4. Pequeñas bases de datos en Excel compartidas en la web.
  5. Almacenamiento de archivos en la web.

Estas herramientas se pueden obtener con 3 productos gratuitos:

Microsoft Office Live Small Business

  • Sitio Web.
  • Administrador de Contactos (CRM básico).
  • Hasta 100 cuentas de correo electrónico.

Abrir la cuenta de tu empresa es muy fácil. Adicionalmente se puede comprar un dominio propio por 15 USD al año y asociarlo con los servicios gratuitos de OLSB. Una parte muy interesante es la aplicación de Administrador de contactos, que cuenta con características que permiten centralizar la información de los clientes y proveedores además de dar un seguimiento básico a los clientes.

Windows Live SkyDrive

  • 25 GB de almacenamiento gratuito en la web.
  • La Pymes pueden utilizar esta herramienta para compartir archivos entre las estaciones de trabajo. Sin importar el giro de la empresa, 25 GB por cuenta es una capacidad que brinda la flexibilidad de crear sistemas de organización de archivos basados en la web.

    Microsoft Office Live Workspaces

    • Almacenamiento de archivos compartidos para trabajo en equipo.

    Esta herramienta es muy útil para llevar a cabo la administración de la empresa. Si se cuenta con catálogos de Excel para llevar un registro de clientes, productos, inventario, etc. Se pueden subir esos catálogos a un área de trabajo y compartirlos con usuarios específicos para su edición.  Esto permite tener una pequeña pero sofisticada base de datos basada en Excel y la función VLOOKUP con referencia a los libros desde su ubicación web.

    Como un adelanto al siguiente post, dejo un ejemplo de la función VLOOKUP para enlazar datos de diferentes libros de excel:

    =BUSCARV(B5,'http://josketres1.workspace.office.live.com/Docs/[lista-clientes.xlsx]Sheet1'!$A$1:$B$3,2,VERDADERO)

    Para utilizar estas referencias a origenes de datos se debe de tener autorización para leer el documento especificado por la fórmula.

    En conclusión, ya es tiempo de ir aprovechando las herramientas gratuitas y ponerlas al servicio de nuestras empresas en México.

    Seguir

    Get every new post delivered to your Inbox.