Algoritmo de colonia de abejas artificial

Contenido

  • Comportamiento del modelo biológico
  • Comparación entre el modelo biológico y el algoritmo de los elementos que componen el proceso.
  • Puntos clave
    • Selección de fuentes de alimento
    • Calculo una nueva fuente de alimento
  • El Algoritmo
    • Inicialización
    • Etapa de abejas empleadas
    • Etapa de abejas observadoras
    • Etapa de abejas exploradoras

Este algoritmo se inspira en la inteligencia colectiva de las abejas e implementa el proceso de recolección de polen por parte de las abejas

Abejitas tiene muchos aleatorios, pero a demostrado tener un mejor comportamiento en funciones mas complicadas. Este algoritmo tiene su forma de salir cuando se estanca en mínimos locales.

Comportamiento del modelo biológico

Las abejas empleadas de determinada fuente de alimento llevan la información a las abejas observadoras, quienes se encargan de evaluar la calidad del polen y decidir si es rentable o no la solución; una vez que la fuente de alimento se ha agotado las abejas exploradoras buscan nuevas fuentes de alimento, a ser explotadas por las abejas empleadas.

Comparación entre el modelo biológico y el algoritmo de los elementos que componen el proceso:

 Elementos Modelo biológico Algoritmo
Fuentes de alimento néctar o polen Representa las posiciones,tienen las coordenadas (x,y) que nosotros estamos moviendo.

Representa una solución candidata.

Y la calidad del néctar seria como el fitness.

Abejas empleadas es la que la explota la fuente de alimento. Estas abejitas son las que van y regresan entre las fuentes de alimento y las abejas observadoras.Una abejita empleada cuando se acaba su alimento, se convertía en exploradora. Por cada fuente de alimento, osea las posiciones ‘x‘ y ‘y‘, hay una abejita.
Abejas observadoras Las abejitas que están allí volando siempre en el panal para elegir una fuente de alimento en proceso de explotación por las abejas empleadas. Esas están allí, esperando que lleguen las abejitas empleadas con néctar, evalúan el néctar, y deciden si es rentable o no. Evalúan la posible solución y deciden si es rentable se explote esa solución, de entre las mejores soluciones.
Abejas exploradoras Van a buscar una nueva fuente de alimento. Re-calculo de posiciones cuando el numero de intentos ya se agoto y no mejoro la solución, para esa posición.

Puntos Clave

Por cada abeja empleada existe una fuente de alimento xi, donde i ∈ 1,2,3,…. Pf y Pf es el número total de empleadas.

Cada vez que una abeja empleada visita una fuente de alimento xi calcula una nueva solución vi mediante la siguiente ecuación

vi = xi,d + φ(xi,d - xk,d)
donde:

    • φ ∈ [-1,1] es un número aleatorio
    • d ∈ [1,n] es un número aleatorio donde n es la dimensión del problema
    • xes otra fuente de alimento aleatoria con i≠ k

Selección de fuentes de alimento

Las abejas observadoras seleccionan las fuentes de alimento de acuerdo a una probabilidad Pi asociada a su calidad de fitness. Esta probabilidad se calcula de la siguiente manera:

metodo-de-ruleta
Cálculo de probabilidades

donde:

ecuacionpi2

Para calcular la calidad del fitnessi de cada fuente de alimento xi relacionada con la abeja empleada, se puede utilizar las siguientes operaciones:

de-maximizacion-a-minimizacion
Calculo del fitness

 

Calculo de una nueva fuente de alimento

Cada abeja empleada explota una fuente de comida, pero cuando esta se agota, la abeja empleada se convierte en una abeja exploradora.

Normalmente, se define  un límite de intentos L para que una fuente de alimento sea explotada. Cuando este límite se cumple, entonces se calcula una nueva fuente de alimento de la siguiente manera:

xi = xl + (xu - xl)r

donde:

  • xl y xu son los límites inferior y superior del espacio de búsqueda del problema de optimización

El Algoritmo!!!

1. Inicialización
Mientras no se cumpla el criterio de terminación
     2. Etapa de abejas empleadas
     3. Etapa de abejas observadoras
     4. Etapa de abejas exploradoras
Siguiente iteracion

1. Inicialización

  • Asignar el número total de población N
  • Asignar el número máximo de intentos L
  • Asignar el número de abejas empleadas Pf < N
  • Asignar el número de abejas observadoras Po = N – Pf
  • Inicializar aleatoriamente las fuentes de comida asociadas a las abejas empleadas {xi} por cada i ∈ [1,Pf]
  • Inicializar la cuenta de los intentos Ti = 0 por cada i ∈ [1,Pf]

 

 

2. Etapa de abejas empleadas

Para cada abeja empleada xi , i ∈ [1,Pfk <- número aleatorio ∈ [1,Pf] tal que k ≠ i
     d <- número aleatorio ∈ [1,n]
     φ <- número aleatorio ∈ [-1,1]
     vi,d = xi,d + φ(xi,d - xk,d)  
     Si f(vi) es mejor que f(xi) entonces  
           xi <- vi  
           Ti <- 0 
     de lo contrario  
           Ti <- Ti +1 
     Fin 
Siguiente abeja

3. Etapa de abejas observadoras

Para cada abeja observadora vi , i ∈ [1,Po] 
     Seleccionar una abeja trabajadora xj mediante ruleta en base a Pi
     k <- número aleatorio ∈ [1,Pf] tal que k ≠ j
     d <- número aleatorio ∈ [1,n]
     φ <- número aleatorio ∈ [-1,1]
     vi,d = xj,d + φ(xj,d - xk,d)  
     Si f(vi) es mejor que f(xj) entonces  
          xj <- vi  
          Tj <- 0 
     de lo contrario  
          Tj <- Tj +1 
     Fin 
Siguiente abeja

4. Etapa de abejas exploradoras

Para cada abeja empleada xi , i ∈ [1,Pf Si Ti < L entonces xi <- xl + (xu - xl)r           Ti <- 0 Fin Siguiente abeja

Recomendaciones finales

♣ El límite de intentos puede ser del tamaño que tu quieras: te recomiendo que sea menor que el número de iteraciones, que si es mayor jamas se va a llegar al número de intentos.

♣ Define un número de empleadas y la resta de población – empleadas te proporciona el número de abejas observadoras.

♣ Haz la prueba cambiando la probabilidad de intentos, para que mires que pasa con la exploración.

Mencionamos que este algoritmo podía resolver funciones un poco más complicadas.
Aquí te dejamos un link donde puedes checar un par de funciones:

Test functions and datasets

Te recomendamos para empezar:  Sphere,Rastrigin, Ackley en ese orden.

Suerte

Happy coding!

 

Generación de pdf con iTextsharp e impresión automática en Visual basic

Hola!!! y Bienvenid@s a este, tu espacio de programación

El día te dejamos este pequeño ejemplo de como puedes crear una solución rápida en impresión de un formato ya predefinido,en una plantilla.

Lo único que tiene que hacer el usuario es llenar los campos en y dar clic a un botón para generar la impresión. Si tu lo harías de otra manera, utilizando otro lenguaje, nos gustaría lo mencionaras en los comentarios, para todos los lectores.

Para este ejemplo necesitamos:

  1. Visual studio 2017
  2. itextsharp 5.5.13

Microsoft Visual Studio es un entorno de desarrollo integrado(IDE, por sus siglas en inglés), soporta múltiples lenguajes de programación.

Permite a los desarrolladores crear aplicaciones web ASP.NET, Servicios Web XML, aplicaciones de escritorio y aplicaciones móviles.

Integrado en el mismo entorno de desarrollo, Visual Basic, Visual C# y Visual C++ comparten herramientas y facilitan la creación de soluciones en varios lenguajes.

Si quieres saber más sobre para que sirve Visual Studio visita:

¿Qué es y para que sirve Visual Studio?

Si no sabes como instalarlo en tu máquina, puedes encontrar en varios lugares en la web, sin embargo te recomendamos la documentación de Microsoft:

Visual Studio IDE overview

Pasos para generar la solución

  1. Creamos el proyecto

1.1 Para ellos seleccionamos Nuevo -> Proyecto

1

1.2 Seleccionamos un proyecto para visual basic

1.2.1 Aplicación de Windows Forms (.Net Framework)

2.png

Una vez que hayas creado tu proyecto tendrás la siguiente ventana

3.png

2.Configuramos para itextSharp

Te preguntaras ¿porque itextshap? ¿Qué es eso?Bien acá la explicación.

En acasiones necesitamos exportar archivos de nuestros sistemas. .Net nos provee librerías para generar archivos de texto, sin embargo, para exportar información utilizando formatos como pdf, eso es otro cuento, y es la razón para usar itextSharp.

iTextSharp es una librería, de código abierto (open source) que nos permite crear y modificar documentos PDF.

Para profundizar acerca de iTexsharp

2.1 En nuestro proyecto conectamos con itextsharp por medio de Nuget

Herramientas -> Administrador de paquetes Nuget ->Consola de administrador de paquetes

4.png

*Nota: NuGet es el administrador de paquetes para .NET. Las herramientas del cliente NuGet proporcionan la capacidad de producir y consumir paquetes. Más información.

Inmediatamente después va a salir la siguiente ventana

5.png

Escribir

Install-Package iTextSharp -Version 5.5.13

6.png

Así, vemos como se termina de instalar, y ya esta listo para probarlo

3. Interfaz

Aqui hemos generado una interfaz muy simple, agregamos dos botones, y un textbox, que puedes encontrar en el cuadro de herramientas. Accedimos a las propiedades de cada uno de los botones para cambiar el ‘text’ y el ‘name’.

*El name lo usaremos en la sección de código

8.png

4.Código

Dando doble clic en el Form1

tendremos una ventana parecida a a siguiente

7.png

4.1 Para el botón de generar añadimos:

Dim pdfDoc As New Document()
Dim pdf As PdfWriter = PdfWriter.GetInstance(pdfDoc, New IO.FileStream("Documento.pdf", FileMode.Create))
'Formtos para distintos tamaños de letras
Dim bf As iTextSharp.text.Font = FontFactory.GetFont("C:\Windows\Arial Monospaced for SAP", 9)
Dim bf1 As iTextSharp.text.Font = FontFactory.GetFont("C:\Windows\Arial Monospaced for SAP", 12)
Dim bf2 As iTextSharp.text.Font = FontFactory.GetFont("C:\Windows\Arial Monospaced for SAP", 5)
Dim fFont = New iTextSharp.text.Font(bf)
Dim fFont1 = New iTextSharp.text.Font(bf1)
Dim fFont2 = New iTextSharp.text.Font(bf2)
'abrimos el pdf para comenzar a escribir en el, al terminar cerramos
pdfDoc.Open()
pdfDoc.Add(New Paragraph("                                                                                  ", fFont1))
pdfDoc.Add(New Paragraph("                                                                                  ", fFont2))
pdfDoc.Add(New Paragraph("       " + descripcion.Text, fFont1))
pdfDoc.Close()

De esta forma obtendremos nuestro pdf

lo podemos observar nuestro archivo «Documento.pdf» en la siguiente ruta:

C:\Users\nombre-Computadora\Documents\Visual Studio 2017\Projects\Nombre-Solucion-Visual\Nombre-Solucion-Visual\bin\Debug

4.1 Para el botón de imprimir añadimos:

Dim psi As System.Diagnostics.ProcessStartInfo = New System.Diagnostics.ProcessStartInfo()
psi.UseShellExecute = True
psi.Verb = "print"
psi.FileName = "Documento.pdf"
psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden
psi.ErrorDialog = False
psi.Arguments = "/p"
Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(psi)
p.WaitForInputIdle()

y así mandamos a imprimir…

5. Observaciones

5.1 Es importante mencionar que cuando se usa

pdfDoc.Add(New Paragraph(" ")) 'genera un espacio, pero va a tomar el espacio que este configurado en tu impresora

Para evitar eso, como buena práctica, agrega a tu indicación el tamaño del espacio

pdfDoc.Add(New Paragraph(" ", fFont1)) 'donde en fFont1 defines el tamaño previamente

5.2 Hay que tener predeterminado Adobe reader para .pdf

El código de impresión se apoya en esta aplicación. Al ejecutar la aplicación verás como se queda abierto adobe reader, eso esta bien, dejalo así, y deja que continue con su tarea.  Haz la prueba.

Por ultimo, para generar tu archivo ejecutable:

Elige la opción Release

9.png

Y busca en la siguiente ruta:

C:\Users\Nombre-Maquina\Documents\Visual Studio 2017\Projects\nombre-Solucion-Visual\Nombre-Solucion-Visual\bin

Encontrarás la carpeta ‘Release’, la cual contiene tu ejecutable. Si se quiere llevar a otra maquina la aplicación, basta con que te lleves esta carpeta! 😀

Ahora ya tienes un sistema que al dar un clic genera un pdf y con otro manda a imprimir.

Si lo haz hecho el ejemplo y te ha funcionado. Comenta.

Si lo haz hecho y no supiste como hacer una parte. Comenta.

Y si lo haz hecho antes de forma diferente. Comenta

Happy coding!