Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit b37eebf

Browse files
Edición española
1 parent 45ca74b commit b37eebf

36 files changed

+6074
-0
lines changed

‎README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ Source code from the book Genetic Algorithms with Python by Clinton Sheppard
44
Description
55
===
66

7+
[Edición española](https://github.com/handcraftsman/GeneticAlgorithmsWithPython/tree/master/es)
8+
79
<img align="right" src="http://www.cs.unm.edu/~sheppard/img/Genetic_Algorithms_with_Python_cover.jpg" alt="Genetic Algorithms with Python cover">
810
Get a hands-on introduction to machine learning with genetic algorithms using Python. Step-by-step tutorials build your skills from Hello World! to optimizing one genetic algorithm with another, and finally genetic programming; thus preparing you to apply genetic algorithms to problems in your own field of expertise.
911

‎es/README.md

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# Algoritmos Genéticos con Python
2+
El código del libro Algoritmos Genéticos con Python por Clinton Sheppard
3+
4+
Descripción
5+
===
6+
7+
[English edition](https://github.com/handcraftsman/GeneticAlgorithmsWithPython)
8+
9+
<img align="right" src="http://www.cs.unm.edu/~sheppard/img/Algoritmos_Geneticos_Cover_for_Kindle.jpg" alt="tapa del libro Algoritmos Genéticos con Python">
10+
Obtenga una introducción práctica al aprendizaje de la máquina con algoritmos genéticos usando Python. Tutoriales paso a paso construye sus habilidades de ¡Hola Mundo! a optimizar un algoritmo genético con otro, y finalmente a la programación genética; así, preparándose para aplicar algoritmos genéticos a problemas en su propio campo de experiencia.
11+
12+
Algoritmos genéticos son una de las herramientas que puede utilizar para aplicar el aprendizaje de la máquina a la búsqueda de soluciones buenas, a veces incluso óptimas, a los problemas que tienen miles de millones de soluciones potenciales. Este libro le da la experiencia de hacer que los algoritmos genéticos funcionen para usted, usando los problemas fáciles de seguir del ejemplo que usted puede recurrir al aprender a usar otras herramientas y técnicas de aprendizaje de la máquina. Cada capítulo es un tutorial paso a paso que ayuda a desarrollar sus habilidades en el uso de algoritmos genéticos para resolver problemas utilizando Python.
13+
14+
- https://www.amazon.com/dp/B072NDMJ4L (Versión Kindle)
15+
16+
Tabla de contenido
17+
===
18+
19+
Una breve introducción a los algoritmos genéticos
20+
21+
Capítulo 1: ¡Hola Mundo!
22+
- Adivine una contraseña dando el número de letras correctas en el grupo. Construir un motor de mutación.
23+
24+
Capítulo 2: El Problema One-max
25+
- Produce una matriz de bits donde todos son 1s. Expande el motor para funcionar con cualquier tipo de gene.
26+
27+
Capítulo 3: Números ordenados
28+
- Produsca una matriz de números enteros ordenados. Demuestre el manejo de múltiples metas y restricciones entre los genes.
29+
30+
Capítulo 4: El rompecabezas de 8 reinas
31+
- Encuentre las posiciones seguras de la reina en un tablero de ajedrez de 8x8 y luego amplíe a NxN. Demuestre la diferencia entre el fenotipo y el genotipo.
32+
33+
Capítulo 5: Coloración gráfica
34+
- Coloree un mapa de los países donde Español es el idioma nacional usando solamente 4 colores. Introdusca grupos de datos comunes y trabaje con archivos. También introdusca el uso de reglas para funcionar con restricciones genéticas.
35+
36+
Capítulo 6: Problema de la carta
37+
- Más restricciones genéticas. Introdusca la mutación personalizada, los algoritmos meméticos, y la técnica de suma-de-diferencia. También demuestre un cromosoma donde la forma en que se utiliza un gene depende de su posición en la matriz génica.
38+
39+
Capítulo 7: Problema de los caballos de ajedrez
40+
- Encuentre el número mínimo de caballos necesarios para atacar todas las posiciones en un tablero de ajedrez. Presente genes personalizados y creación de matrices de genes. También demuestra mínimos y máximos locales.
41+
42+
Capítulo 8: Cuadrados mágicos
43+
- Encuentre cuadrados donde todas las filas, columnas y ambas diagonales de una matriz de NxN tienen la misma suma. Introduce el recocido simulado.
44+
45+
Capítulo 9: Problema de la mochila
46+
- Optimizar el contenido de un contenedor para una o más variables. Presenta rama y límite y los cromosomas de la longitud variable.
47+
48+
Capítulo 10: Resolución de ecuaciones lineales
49+
- Encuentre las soluciones de ecuaciones lineales con 2, 3 y 4 desconocidos. Variación de ramas y límite. Refuerza la flexibilidad del genotipo.
50+
51+
Capítulo 11: Generando Sudoku
52+
- Un ejercicio guiado en la generación de rompecabezas de Sudoku.
53+
54+
Capítulo 12: Problema del vendedor viajero
55+
- Encuentre la ruta óptima para visitar las ciudades. Introduce intercambio de genes y una piscina de padres.
56+
57+
Capítulo 13: Aproximación de Pi
58+
- Encuentre los dos números de 10 bits cuyo dividendo es el más cercano a Pi. Introdusca utilizando un algoritmo genético para afinar otro.
59+
60+
Capítulo 14: Generación de ecuaciones
61+
- Encuentre la ecuación más corta que produzca un resultado específico usando suma, resta, multiplicación, etc. Introduce la programación genética simbólica.
62+
63+
Capítulo 15: Problema de la cortadora de pasto
64+
- Genere una serie de instrucciones que hacen que una cortadora de pasto corte un campo de pasto. Programación genética con estructuras de control, objetos, y funciones definidas automáticamentes.
65+
66+
Capítulo 16: Circuitos lógicos
67+
- Construya circuitos que se comporten como puertas lógicas básicas, combinaciones de compuertas, y finalmente un sumador de 2 bits que utilice nodos de árbol y ascenso de la colina.
68+
69+
Capítulo 17: Expresiones regulares
70+
- Busque expresiones regulares que coincidan con las cadenas deseadas. Presente la reparación cromosómica y el control del crecimiento.
71+
72+
Capítulo 18: Tic-tac-toe
73+
- Crear reglas para jugar el juego sin perder. Presenta la selección de torneos.
74+

‎es/ch01/contraseña.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
# File: contraseña.py
2+
# Del capítulo 1 de _Algoritmos Genéticos con Python_
3+
#
4+
# Author: Clinton Sheppard <fluentcoder@gmail.com>
5+
# Copyright (c) 2017 Clinton Sheppard
6+
#
7+
# Licensed under the Apache License, Version 2.0 (the "License").
8+
# You may not use this file except in compliance with the License.
9+
# You may obtain a copy of the License at
10+
# http://www.apache.org/licenses/LICENSE-2.0
11+
#
12+
# Unless required by applicable law or agreed to in writing, software
13+
# distributed under the License is distributed on an "AS IS" BASIS,
14+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15+
# implied. See the License for the specific language governing
16+
# permissions and limitations under the License.
17+
18+
import datetime
19+
import random
20+
import unittest
21+
22+
import genetic
23+
24+
25+
def obtener_aptitud(conjetura, objetivo):
26+
return sum(1 for esperado, real in zip(objetivo, conjetura)
27+
if esperado == real)
28+
29+
30+
def mostrar(candidato, horaInicio):
31+
diferencia = (datetime.datetime.now() - horaInicio).total_seconds()
32+
print("{}\t{}\t{}".format(
33+
candidato.Genes, candidato.Aptitud, diferencia))
34+
35+
36+
# `nosetests` no admite caracteres como ñ en el nombre de la clase
37+
class PruebasDeContrasena(unittest.TestCase):
38+
geneSet = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!¡.,"
39+
40+
def test_Hola_Mundo(self):
41+
objetivo = "¡Hola Mundo!"
42+
self.adivine_contraseña(objetivo)
43+
44+
def test_Porque_me_formaste_de_una_manera_formidable_y_maravillosa(
45+
self):
46+
objetivo = "Porque me formaste de una manera formidable y " \
47+
"maravillosa."
48+
self.adivine_contraseña(objetivo)
49+
50+
def adivine_contraseña(self, objetivo):
51+
horaInicio = datetime.datetime.now()
52+
53+
def fnObtenerAptitud(genes):
54+
return obtener_aptitud(genes, objetivo)
55+
56+
def fnMostrar(candidato):
57+
mostrar(candidato, horaInicio)
58+
59+
aptitudÓptima = len(objetivo)
60+
mejor = genetic.obtener_mejor(fnObtenerAptitud, len(objetivo),
61+
aptitudÓptima, self.geneSet,
62+
fnMostrar)
63+
self.assertEqual(mejor.Genes, objetivo)
64+
65+
def test_aleatorio(self):
66+
longitud = 150
67+
objetivo = ''.join(random.choice(self.geneSet)
68+
for _ in range(longitud))
69+
70+
self.adivine_contraseña(objetivo)
71+
72+
def test_comparativa(self):
73+
genetic.Comparar.ejecutar(self.test_aleatorio)
74+
75+
76+
if __name__ == '__main__':
77+
unittest.main()

‎es/ch01/genetic.py

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# File: genetic.py
2+
# Del capítulo 1 de _Algoritmos Genéticos con Python_
3+
#
4+
# Author: Clinton Sheppard <fluentcoder@gmail.com>
5+
# Copyright (c) 2017 Clinton Sheppard
6+
#
7+
# Licensed under the Apache License, Version 2.0 (the "License").
8+
# You may not use this file except in compliance with the License.
9+
# You may obtain a copy of the License at
10+
# http://www.apache.org/licenses/LICENSE-2.0
11+
#
12+
# Unless required by applicable law or agreed to in writing, software
13+
# distributed under the License is distributed on an "AS IS" BASIS,
14+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15+
# implied. See the License for the specific language governing
16+
# permissions and limitations under the License.
17+
18+
import random
19+
import statistics
20+
import sys
21+
import time
22+
23+
24+
def _generar_padre(longitud, geneSet, obtener_aptitud):
25+
genes = []
26+
while len(genes) < longitud:
27+
tamañoMuestral = min(longitud - len(genes), len(geneSet))
28+
genes.extend(random.sample(geneSet, tamañoMuestral))
29+
genes = ''.join(genes)
30+
aptitud = obtener_aptitud(genes)
31+
return Cromosoma(genes, aptitud)
32+
33+
34+
def _mudar(padre, geneSet, obtener_aptitud):
35+
índice = random.randrange(0, len(padre.Genes))
36+
genesDelNiño = list(padre.Genes)
37+
nuevoGen, alterno = random.sample(geneSet, 2)
38+
genesDelNiño[índice] = alterno if nuevoGen == genesDelNiño[
39+
índice] else nuevoGen
40+
genes = ''.join(genesDelNiño)
41+
aptitud = obtener_aptitud(genes)
42+
return Cromosoma(genes, aptitud)
43+
44+
45+
def obtener_mejor(obtener_aptitud, longitudObjetivo, aptitudÓptima, geneSet,
46+
mostrar):
47+
random.seed()
48+
mejorPadre = _generar_padre(longitudObjetivo, geneSet, obtener_aptitud)
49+
mostrar(mejorPadre)
50+
if mejorPadre.Aptitud >= aptitudÓptima:
51+
return mejorPadre
52+
while True:
53+
niño = _mudar(mejorPadre, geneSet, obtener_aptitud)
54+
if mejorPadre.Aptitud >= niño.Aptitud:
55+
continue
56+
mostrar(niño)
57+
if niño.Aptitud >= aptitudÓptima:
58+
return niño
59+
mejorPadre = niño
60+
61+
62+
class Cromosoma:
63+
def __init__(self, genes, aptitud):
64+
self.Genes = genes
65+
self.Aptitud = aptitud
66+
67+
68+
class Comparar:
69+
@staticmethod
70+
def ejecutar(función):
71+
print(función)
72+
cronometrajes = []
73+
stdout = sys.stdout
74+
for i in range(100):
75+
sys.stdout = None
76+
horaInicio = time.time()
77+
función()
78+
segundos = time.time() - horaInicio
79+
sys.stdout = stdout
80+
cronometrajes.append(segundos)
81+
promedio = statistics.mean(cronometrajes)
82+
if i < 10 or i % 10 == 9:
83+
print("{} {:3.2f} {:3.2f}".format(
84+
1 + i, promedio,
85+
statistics.stdev(cronometrajes,
86+
promedio) if i > 1 else 0))

‎es/ch02/contraseña.py

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# File: contraseña.py
2+
# Del capítulo 2 de _Algoritmos Genéticos con Python_
3+
#
4+
# Author: Clinton Sheppard <fluentcoder@gmail.com>
5+
# Copyright (c) 2017 Clinton Sheppard
6+
#
7+
# Licensed under the Apache License, Version 2.0 (the "License").
8+
# You may not use this file except in compliance with the License.
9+
# You may obtain a copy of the License at
10+
# http://www.apache.org/licenses/LICENSE-2.0
11+
#
12+
# Unless required by applicable law or agreed to in writing, software
13+
# distributed under the License is distributed on an "AS IS" BASIS,
14+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15+
# implied. See the License for the specific language governing
16+
# permissions and limitations under the License.
17+
18+
import datetime
19+
import random
20+
import unittest
21+
22+
import genetic
23+
24+
25+
def obtener_aptitud(conjetura, objetivo):
26+
return sum(1 for esperado, real in zip(objetivo, conjetura)
27+
if esperado == real)
28+
29+
30+
def mostrar(candidato, horaInicio):
31+
diferencia = (datetime.datetime.now() - horaInicio).total_seconds()
32+
print("{}\t{}\t{}".format(
33+
''.join(candidato.Genes),
34+
candidato.Aptitud,
35+
diferencia))
36+
37+
38+
# `nosetests` no admite caracteres como ñ en el nombre de la clase
39+
class PruebasDeContrasena(unittest.TestCase):
40+
geneSet = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!¡.,"
41+
42+
def test_Hola_Mundo(self):
43+
objetivo = "¡Hola Mundo!"
44+
self.adivine_contraseña(objetivo)
45+
46+
def test_Porque_me_formaste_de_una_manera_formidable_y_maravillosa(self):
47+
objetivo = "Porque me formaste de una manera formidable y maravillosa."
48+
self.adivine_contraseña(objetivo)
49+
50+
def adivine_contraseña(self, objetivo):
51+
horaInicio = datetime.datetime.now()
52+
53+
def fnObtenerAptitud(genes):
54+
return obtener_aptitud(genes, objetivo)
55+
56+
def fnMostrar(candidato):
57+
mostrar(candidato, horaInicio)
58+
59+
aptitudÓptima = len(objetivo)
60+
mejor = genetic.obtener_mejor(fnObtenerAptitud, len(objetivo),
61+
aptitudÓptima, self.geneSet, fnMostrar)
62+
self.assertEqual(''.join(mejor.Genes), objetivo)
63+
64+
def test_aleatorio(self):
65+
longitud = 150
66+
objetivo = ''.join(random.choice(self.geneSet)
67+
for _ in range(longitud))
68+
69+
self.adivine_contraseña(objetivo)
70+
71+
def test_comparativa(self):
72+
genetic.Comparar.ejecutar(self.test_aleatorio)
73+
74+
75+
if __name__ == '__main__':
76+
unittest.main()

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /