Algoritmo genetico binario

26
INSTITUTO TECNOLÓGICO DE CHIHUAHUA II Inteligencia artificial 2 Nombre: David Humberto Orquiz Ruelas Número de Control: 07550466 Carrera: ISC

Transcript of Algoritmo genetico binario

Page 1: Algoritmo genetico binario

INSTITUTO TECNOLÓGICO DE CHIHUAHUA II

Inteligencia artificial 2

Nombre: David Humberto Orquiz Ruelas

Número de Control: 07550466

Carrera: ISC

Tema: Algoritmo Genético Binario

Page 2: Algoritmo genetico binario

Se implementara un algoritmo genético para obtener el valor mínimo de la siguiente función:

f(x,y)=4x2 +7(y −4)2 −4x +3y Las restricciones serán las siguientes:

0≤x≤150≤y≤15Nipop = 32Reproducción= RankWeightingCruce LibreConvergencia LibreSin mutación

El algoritmo será realizado en Microsoft office Excel 2007.

En la hoja numero 1 se generaran los números aleatorios para generar los cromosomas utilizados en el algoritmo. Con la formula “=ALEATORIO.ENTRE (0,1)” se llenaran las columnas necesarias para generar un numero binario con las restricciones antes mencionadas, y así será para generar los 32 que serán los valores de x en el cromosoma, así mismo se realizara el procedimiento para generar los números binarios para y.

Se insertaran dos botones los cuales copiaran los números binarios de 4 digitos generados y los pegara en la hoja siguiente, ( este procedimiento se realiza dado

Page 3: Algoritmo genetico binario

a que los números aleatorios se recalculan cada vez que se realiza una acción y hay que hacer un pegado especial para que esto no ocurra)

El código de los botones será el siguiente:

Sub Botón1_Haga_clic_en ()

'copiar números aleatorios para formar los cromosomas de la primer variable.

Range ("g2", "g33" & fila).Copy

Sheets ("hoja3").Select

Range ("c4").PasteSpecial Paste:=xlValues

Application.CutCopyMode = True

Sheets ("hoja1").Select

End Sub

Sub Botón6_Haga_clic_en ()

'copiar números aleatorios para formar los cromosomas de la segunda variable.

Range ("g36", "g67" & fila).Copy

Sheets ("hoja3").Select

Range ("d4").PasteSpecial Paste:=xlValues

Application.CutCopyMode = True

End Sub

Page 4: Algoritmo genetico binario

Se creara una tabla en la siguiente hoja para calcular los valores en decimal y sacar el costo con la función dada en las restricciones para el algoritmo.

Para sacar el valor decimal de x y de y se usara la siguiente fórmula:

“ =BIN.A.DEC (C4)” y ” =(4*E4^2)+(7*((F4-4)^2))-4*E4+3*F4” para calcular el costo.

El código para los botones mostrados en la imagen es el siguiente:

Sub Hoja3_Botón2_Haga_clic_en()

'copiar tabla.

Range("b4", "g35").Copy

'ActiveSheet.Next.Select

Sheets("hoja4").Select

Range("b17").PasteSpecial

End Sub

Page 5: Algoritmo genetico binario

Sub Botón3_Haga_clic_en()

‘Npop.

Range("r1").Copy

Range("t1").PasteSpecial Paste:=xlValues

Application.CutCopyMode = True

Range("c4").Select

Dim a As String

Dim b As String

a = Range("g17").Value

b = Range("u1").Value

Sheets("hoja4").Select

Range("g17", b & fila).Copy

Range("h17").PasteSpecial Paste:=xlValues

Application.CutCopyMode = True

'Range("c1").Select

End Sub

Sub Botón4_Haga_clic_en()

'Ngood.

Range("v1").Copy

Range("x1").PasteSpecial Paste:=xlValues

Application.CutCopyMode = True

Range("c4").Select

Dim a As String

Dim b As String

Page 6: Algoritmo genetico binario

a = Range("h17").Value

b = Range("y1").Value

Sheets("hoja4").Select

Range("h17", b & fila).Copy

Range("i17").PasteSpecial Paste:=xlValues

Application.CutCopyMode = True

'Range("c1").Select

End Sub

En el botón ejecutar se encuentra el siguiente código en el cual se encuentran los procedimientos anteriores para que se ejecuten con solo presionarlo y no tener que hacerlo botón por botón.

En la hoja siguiente se tendrán botones con el siguiente código que al igual que los anteriores van a ejecutarse también en el botón ejecutar.

Sub Hoja4_Botón4_Haga_clic_en()

Dim iRow As Integer

Dim i As Integer

Dim j As Integer

Dim k As Integer

b = 1

a = 1

k = 1

iRow = Range("l6").Value

For b = 1 To iRow

If Cells(a + 16, 14).Value >= Cells(b + 16, 15).Value Then

Cells(b + 16, 16).Value = Cells(a + 16, 18).Value

a = 1

Page 7: Algoritmo genetico binario

Else

a = a + 1

b = b - 1

End If

Next

End Sub

Sub Hoja4_Botón5_Haga_clic_en()

Range("l17", "l48" & fila).Copy

Range("o17").PasteSpecial Paste:=xlValues

'aleatorio para cruce

Range("ab1").Copy

Range("ac1").PasteSpecial Paste:=xlValues

End Sub

Sub Botón53_Haga_clic_en()

'copiar tabla hijos.

Range("az17", "bd80").Copy

Sheets("hoja4").Select

Range("be17").PasteSpecial Paste:=xlValues

End Sub

Sub Botón52_Haga_clic_en()

'ordenar.

Sheets("hoja4").Select

Range("be17:bj80").Select

Page 8: Algoritmo genetico binario

Selection.Sort Key1:=Range("bi17"), Order1:=xlAscending, Header:=xlGuess, _

OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _

DataOption1:=xlSortNormal

End Sub

El siguiente botón contiene el código encargado de generar cada iteración en el algoritmo hasta encontrar el valor mínimo de la función.

Sub Botón55_Haga_clic_en()

Dim iter As Integer

For iter = 1 To 1000

Cells(iter + 16, 69).Value = Cells(17, 5).Value

Cells(iter + 16, 70).Value = Cells(17, 6).Value

Cells(iter + 16, 71).Value = Cells(17, 7).Value

'copiar tabla.

'

Sheets.Add

ActiveSheet.Next.Select

Range("a1", "bs81").Copy

ActiveSheet.Previous.Select

'ActiveSheet.Previous.Select

'Sheets("hoja4").Select

Range("a1").PasteSpecial

Page 9: Algoritmo genetico binario

ActiveSheet.Next.Select

'Range("be17", "bj81").Copy

ActiveSheet.Previous.Select

'Range("c17").PasteSpecial

''''''''''

''''''''''''''''''''''

''''''''''''''''''''''

'''copiar tabla hijos.

a = Range("g17").Value

b = Range("u2").Value

'Sheets("hoja4").Select

Range("be17", "bj48").Copy

Range(b).PasteSpecial Paste:=xlValues

Application.CutCopyMode = True

Range("b48", "b100").Clear

'''''

''''

Range("v17", "v48").Copy

Range("w17", "w48").PasteSpecial Paste:=xlValues

Application.CutCopyMode = True

''''''''''''''''''''''

Page 10: Algoritmo genetico binario

''''''''''''''''''''''

''''''''''''''''''''''

'ordenar nueva tabla

Range("b16:g48").Select

Selection.Sort Key1:=Range("g16"), Order1:=xlAscending, Header:=xlGuess, _

OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _

DataOption1:=xlSortNormal

''''''''''''''''''''''

''''''''''''''''''''''

'copiar aleatorios

Range("r1").Copy

Range("t1").PasteSpecial Paste:=xlValues

Application.CutCopyMode = True

''''''''''

'''''''''

'copiar aleatorios.

Range("v1").Copy

Range("x1").PasteSpecial Paste:=xlValues

Application.CutCopyMode = True

Page 11: Algoritmo genetico binario

''''''''''''''''''''''

'npop

Dim e As String

Dim f As String

Dim ff As String

e = Range("g17").Value

f = Range("u1").Value

ff = Range("u3").Value

'Sheets("hoja4").Select

Range("g17", f & fila).Copy

Range("h17").PasteSpecial Paste:=xlValues

Application.CutCopyMode = True

Range(ff, "h50").ClearContents

'Range("c1").Select

'Ngood.

Dim c As String

Dim d As String

Dim dd As String

c = Range("h17").Value

d = Range("y1").Value

dd = Range("y2").Value

Page 12: Algoritmo genetico binario

'Sheets("hoja4").Select

Range("h17", d & fila).Copy

Range("i17").PasteSpecial Paste:=xlValues

Application.CutCopyMode = True

Range(dd, "i50").ClearContents

'Range("c1").Select

''''''''''''

'''''''''''''''

'''''''''''''''''''

Range("l17", "l48" & fila).Copy

Range("o17").PasteSpecial Paste:=xlValues

'aleatorio para cruce

Range("ab1").Copy

Range("ac1").PasteSpecial Paste:=xlValues

'metodo rank weighting

Dim iRow As Integer

Dim i As Integer

Dim j As Integer

Dim k As Integer

i = 1

j = 1

k = 1

Page 13: Algoritmo genetico binario

iRow = Range("l6").Value

For i = 1 To iRow

If Cells(j + 16, 14).Value >= Cells(i + 16, 15).Value Then

Cells(i + 16, 16).Value = Cells(j + 16, 18).Value

j = 1

Else

j = j + 1

i = i - 1

End If

Next

Dim gg As String

gg = Range("n6").Value

Range(gg, "p50").ClearContents

''''''''''''''

'copiar tabla hijos.

Range("az17", "bd80").Copy

Range("be17").PasteSpecial Paste:=xlValues

Page 14: Algoritmo genetico binario

''''''''''''

''''''''''''''''

'ordenar.

Range("be17:bj80").Select

Selection.Sort Key1:=Range("bi17"), Order1:=xlAscending, Header:=xlGuess, _

OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _

DataOption1:=xlSortNormal

If Range("bn17") = Range("g17") Then

Range("bo17", "bs81").Copy

Sheets.Add

Range("a1").PasteSpecial

On Error Resume Next

'Ocultamos el procedimiento

Application.ScreenUpdating = False

'copiamos la hoja activa en un nuevo libro

ActiveSheet.Copy

'copiamos y pegamos los valores

Cells.Select

Selection.Copy

Selection.PasteSpecial Paste:=xlPaste

'Nos quedamos con el nombre del

'fichero y la ruta donde está

Page 15: Algoritmo genetico binario

fichero = ThisWorkbook.Name

ruta = ThisWorkbook.Path

'Quitamos la extenxión de excel

fichero = Replace(fichero, ".xlsx", "")

fichero = Replace(fichero, ".xls", "")

'seleccionamos la hoja activa

ActiveSheet.Select

'omitimos los mensajes de aviso

Application.DisplayAlerts = False

'guardamos el fichero de texto acomodado

'en el mismo directorio donde tenemos el

'fichero de excel normal

ActiveWorkbook.SaveAs Filename:=ruta & "\" & "salida" & ".txt", FileFormat:=xlText

'cerramos el fichero de texto

ActiveWorkbook.Close

'Mostramos el procedimiento

Application.ScreenUpdating = True

End If

If Range("bn17") = Range("g17") Then Exit For

Next

''''''''''

End Sub

Page 16: Algoritmo genetico binario

Algunas de las celdas van a tener formulas para agilizar el trabajo del algoritmo, (hay columnas auxiliares). A continuación se enlistara la columna con la formula insertada en cada una de sus celdas.

Nbada. =SI(H17<>I17,H17)

Nbad =K.ESIMO.MENOR($J$17:$J$48,R17)

Ngood*al =ALEATORIO()

Pn formula =($L$6-R17+1)/SI(R17<=$L$6,((($L$6+1)/2)*$L$6))

PN acumulado =M17

Ngood =I:I

X =BUSCAR(S17,I:I,C:C)

Page 17: Algoritmo genetico binario

Y =BUSCAR(S17,I:I,D:D)

Col v =ALEATORIO.ENTRE(2,7)

Col x =SI(R17*2<=$L$6,2*R17-1,FALSO)

Padre =BUSCAR(X17,R:R,P:P)

x =BUSCAR(Y17,R:R,T:T)

y =BUSCAR(Y17,R:R,U:U)

col AB =SI(R17*2<=$L$6,2*R17,FALSO)

Padre2 =BUSCAR(AB17,R:R,P:P)

X =BUSCAR(AC17,R:R,T:T)

Y =BUSCAR(AC17,R:R,U:U)

Padre1 =Z17&AA17

Padre2 =AD17&AE17

Padre1a =EXTRAE(AF17,1,W17-1)

Padre1b =EXTRAE(AF17,W17,8)

Padre2a =EXTRAE(AG17,1,W17-1)

Padre2b =EXTRAE(AG17,W17,8)

Hijo1 =AH17&AK17

Hijo2 =AJ17&AI17

Xhijo1 =EXTRAE(AM17,1,4)

Page 18: Algoritmo genetico binario

Yhijo1 =EXTRAE(AM17,5,8)

Decimalx1 =BIN.A.DEC(AO17)

Decimaly2 =BIN.A.DEC(AP17)

Xhijo2 =EXTRAE(AN17,1,4)

Yhijo2 =EXTRAE(AN17,5,8)

Decimalx1 =BIN.A.DEC(AS17)

Decimaly2 =BIN.A.DEC(AT17)

Costo1 =(4*AQ17^2)+(7*((AR17-4)^2))-4*AQ17+3*AR17

Costo2 =(4*AU17^2)+(7*((AV17-4)^2))-4*AU17+3*AV17

Xhijo1 =AO17

Yhijo1 =AP17

Decimalx1 =AQ17

Decimaly2 =AR17

Page 19: Algoritmo genetico binario

Costo1 =AW17

Col BJ =SI.ERROR(BI17,FALSO)

Número menor =K.ESIMO.MENOR(BJ17:BJ81,BK17)

Col BM =SI.ERROR(SI(G17=0,"",G17),"")

Promedio =PROMEDIO(BM:BM)

Col BO =SI(BQ17>0,DEC.A.BIN(BQ17,4),SI(BQ17=0,""))

Col BP =SI(BR17>0,DEC.A.BIN(BR17,4),SI(BR17=0,""))

Page 20: Algoritmo genetico binario

Todos los métodos de los botones anteriores sirven para realizar paso por paso el algoritmo.

Para ejecutar el algoritmo desde que abrimos el documento y para que sean creados los archivos .txt se agregan en un botón que se muestra con un mensaje justo al activar los macros de Excel. El código del botón principal es el siguiente:

Sub auto_open()

Dim Mensaje, Estilo, Título, Ayuda, Ctxt, Respuesta, MiCadena

Mensaje = "¿Desea continuar?" ' Define el mensaje.

Estilo = vbYesNo + vbCritical + vbDefaultButton2 ' Define los botones.

Título = "Demostración de MsgBox" ' Define el título.

Ayuda = "DEMO.HLP" ' Define el archivo de ayuda.

Ctxt = 1000 ' Define el tema

' el contexto

' Muestra el mensaje.

Respuesta = MsgBox(Mensaje, Estilo, Título, Ayuda, Ctxt)

If Respuesta = vbYes Then

''''

'copiar numeros aleatorios para formar los cromosomas de la primer variable.

Page 21: Algoritmo genetico binario

Range("g2", "g33" & fila).Copy

Sheets("hoja3").Select

Range("c4").PasteSpecial Paste:=xlValues

Application.CutCopyMode = True

Sheets("hoja1").Select

'''

'copiar numeros aleatorios para formar los cromosomas de la segunda variable.

Range("g36", "g67" & fila).Copy

Sheets("hoja3").Select

Range("d4").PasteSpecial Paste:=xlValues

Application.CutCopyMode = True

'''

On Error Resume Next

'Ocultamos el procedimiento

Application.ScreenUpdating = False

'copiamos la hoja activa en un nuevo libro

ActiveSheet.Copy

'copiamos y pegamos los valores

Cells.Select

Selection.Copy

Selection.PasteSpecial Paste:=xlPaste

'Nos quedamos con el nombre del

'fichero y la ruta donde está

fichero = ThisWorkbook.Name

Page 22: Algoritmo genetico binario

ruta = ThisWorkbook.Path

'Quitamos la extenxión de excel

fichero = Replace(fichero, ".xlsx", "")

fichero = Replace(fichero, ".xls", "")

'seleccionamos la hoja activa

ActiveSheet.Select

'omitimos los mensajes de aviso

Application.DisplayAlerts = False

'guardamos el fichero de texto acomodado

'en el mismo directorio donde tenemos el

'fichero de excel normal

ActiveWorkbook.SaveAs Filename:=ruta & "\" & "poblacioninIcial" & ".txt", FileFormat:=xlText

'cerramos el fichero de texto

ActiveWorkbook.Close

'Mostramos el procedimiento

Application.ScreenUpdating = True

Application.OnTime Now + TimeValue("00:00:001"), "Hoja3_Botón2_Haga_clic_en"

Application.OnTime Now + TimeValue("00:00:002"), "Hoja3_Botón1_Haga_clic_en"

Application.OnTime Now + TimeValue("00:00:003"), "Botón3_Haga_clic_en"

Application.OnTime Now + TimeValue("00:00:004"), "Botón4_Haga_clic_en"

Application.OnTime Now + TimeValue("00:00:005"), "Hoja4_Botón5_Haga_clic_en"

Page 23: Algoritmo genetico binario

Application.OnTime Now + TimeValue("00:00:006"), "Hoja4_Botón4_Haga_clic_en"

Application.OnTime Now + TimeValue("00:00:007"), "Botón53_Haga_clic_en"

Application.OnTime Now + TimeValue("00:00:008"), "Botón52_Haga_clic_en"

Application.OnTime Now + TimeValue("00:00:009"), "Hoja4_Botón3_Haga_clic_en"

Application.OnTime Now + TimeValue("00:00:010"), "Botón55_Haga_clic_en"

''''''''

Else

Range("A1").Select

End If

End Sub

Al terminar las iteraciones se generaran dos archivos de texto, el primero con el nombre” poblacionInicial”, en el se encontrara la tabla con los primeros cromosomas y sus costos que fueron creados con la unión de números aleatorios entre 0 y 1. El segundo archivo de texto se llamara “Salida” y en él se encontraran los cromosomas con el menor costo de cada iteración.

En conclusión se obtiene que al generar nuevos descendientes de una población aleatoria podemos encontrar el resultado que estemos buscando, ya sea el mínimo de una ecuación, el máximo de una ecuación u otros resultados que estemos buscando.