Introduction à l'intelligence artificielle avec Python 2 «Pratique de l'algorithme génétique»

Préface

Puisque nous allons commencer par la pratique ici, veuillez vous référer d'abord à "Genetic Algorithm-Theory-".

essayons

Maintenant, exécutons GA en utilisant Python. Ici, nous allons procéder en supposant que vous avez déjà des connaissances de base de Python. Utilisez des fonctions, mais n'utilisez pas de classes car les explications sont chaotiques.

Problème ONEMAX

Que faites-vous exactement?

Un exemple courant est le problème ONEMAX. c'est,             {1,0,0,1,0,1,1,1,0,0} À partir d'un tableau composé de «1» ou «0», tel que             {1,1,1,1,1,1,1,1,1,1} J'ai réfléchi à la façon de créer un tableau de tous les 1.

Ceci est résolu avec GA. Le flux consiste à générer au hasard une séquence avec "1" ou "0" comme élément, à l'utiliser comme information génétique et à construire un algorithme en utilisant la valeur totale de la séquence comme standard d'évaluation.

Tout d'abord, le code entier est affiché.

code

GA.py


import random
from decimal import Decimal


GENOM_LENGTH = 20          #Longueur des informations génétiques
MAX_GENOM_LIST = 200        #La taille de la population de gènes
SELECT_GENOM = 10           #Nombre de sélections de gènes élites
INDIVIDUAL_MUTATION = 0.01  #Probabilité de mutation individuelle
GENOM_MUTATION = 0.01       #Probabilité de mutation génique
MAX_GENERATION = 20        #Nombre de générations à répéter


def genom(length):

    """
Générez des gènes au hasard.
La valeur de retour est la séquence génique d'un individu
    """
    genom_list = []
    for i in range(length):
        a = random.randint(0,1)
        genom_list.append(a)
    return genom_list
    

def evaluation(ga):
    """
Fonction d'évaluation d'un individu.
À partir de la séquence de gène obtenue par l'argument, la valeur totale est renvoyée comme valeur d'évaluation.
    """
    genom_total = sum(ga)
    genom_num = len(ga)
    return Decimal(genom_total) / Decimal(genom_num)


def select_elite(ga,elite_length):
    """
Une fonction pour extraire d'excellents individus.
    """
    sort_result = sorted(ga, reverse=True, key=evaluation)
    result = [sort_result.pop(0) for i in range(elite_length)]
    return result


def crossover(ga_one,ga_second):
    """
Fonction croisée.
Deux descendants sont renvoyés des deux parents donnés par l'argument.
Ici, il est hérité par croisement en deux points.
    """
    genom_list = []
    cross_one = random.randint(0,GENOM_LENGTH)
    cross_second = random.randint(cross_one,GENOM_LENGTH)

    one = ga_one
    second = ga_second

    progeny_one = one[:cross_one] + second[cross_one:cross_second] + one[cross_second:]
    progeny_second = second[:cross_one] + one[cross_one:cross_second] + second[cross_second:]

    genom_list.append(progeny_one)
    genom_list.append(progeny_second)

    return genom_list


def create_next_generation(ga,ga_elite,ga_progeny):
    """
Générez la population de la prochaine génération.
Obtenez le groupe de génération précédente avec le premier argument,
Les deuxième et troisième arguments élite et enfants sont ajoutés, et les individus les moins excellents sont supprimés.
    """
    next_generation_geno = sorted(ga, reverse = False, key = evaluation)

    for i in range(0, len(ga_elite) + len(ga_progeny)):
        next_generation_geno.pop(0)

    next_generation_geno.extend(ga_elite)
    next_generation_geno.extend(ga_progeny)
    return next_generation_geno

def mutation(ga, individual_mutation, genom_mutation):
    """
Faites une mutation.
Sélectionnez si l'individu mute avec une certaine probabilité,
L'élément de séquence génique de l'individu capturé est également sélectionné avec probabilité,
Modifiez l'élément piégé sur 1 ou 0.
    """
    ga_list = []
    for i in ga:
        if individual_mutation > (random.randint(0,100) / Decimal(100)):
            genom_list = []
            for i_ in i:
                if genom_mutation > (random.randint(0,100)/Decimal(100)):
                    genom_list.append(random.randint(0,1))
                else:
                    genom_list.append(i_)
            ga_list.append(genom_list)
        else:
            ga_list.append(i)

    return ga_list

    
if __name__ == '__main__':

    current_generation = []    
    for i in range(MAX_GENOM_LIST):
        current_generation.append(genom(GENOM_LENGTH))

    
    for count_ in range(1,MAX_GENERATION + 1):
        current_evaluation = []

        for i in range(MAX_GENOM_LIST):
            evaluation_result = evaluation(current_generation[i])
            current_evaluation.append(evaluation_result)

        elite_genes = select_elite(current_generation,SELECT_GENOM)

        progeny_gene = []

        for i in range(0,SELECT_GENOM):
            progeny_gene.extend(crossover(elite_genes[i-1],elite_genes[i]))

        next_generation = create_next_generation(current_generation,elite_genes,progeny_gene)
        next_generation = mutation(next_generation,INDIVIDUAL_MUTATION,GENOM_MUTATION)

        fits = []
        j = 0
        for i in current_generation:
            fits.append(current_evaluation[j])
            j = j + 1
        min_ = min(fits)
        max_ = max(fits)
        avg_ = sum(fits) / Decimal(len(fits))
        
        print ("-----------Non.{}génération----------".format(count_))
        print ("        Min:{}".format(min_))
        print ("        Max:{}".format(max_))
        print ("        avg:{}".format(avg_))
        print("\n")

        current_generation = next_generation
        

    print ("Le meilleur individu est{}".format(elite_genes[0]))

Contour

La procédure est comme indiqué dans l'article précédent, Théorie. Dans ce programme

** Le nombre d'individus par génération est de 200, La longueur de la séquence génique par individu est de 20, Le nombre de générations répétitives est de 20, La probabilité de mutation est de 1% pour les deux espèces, 20 choix élites, **

Il évolue avec la valeur. Bien entendu, cette valeur peut être décidée librement. Fondamentalement, plus le nombre de générations est élevé, meilleur sera l'individu et plus la longueur de la séquence du gène sera longue, plus la vitesse de convergence vers la solution optimale sera lente, de sorte que le nombre de générations et la taille de l'ensemble seront augmentés. Il y a un besoin de. ** **

Et quand tu fais ça,

-----------20e génération----------
        Min:0.9
        Max:1
        avg:0.96875


Le meilleur individu est[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

Il a été produit comme ça et a résolu le problème ONEMAX avec brio! !! (Seules les dernières lignes sont répertoriées.)

C'est la puissance de GA! !!

Tâche

Vous pouvez maintenant comprendre ce qu'est l'AG et sa puissance. Par conséquent, je voudrais confier une tâche à ceux qui apprennent en utilisant cet article.

** ⑴ Créez et exécutez le code ci-dessus en excluant le traitement de la mutation. Considérez également les résultats. ⑵ Solution optimale,                {1,0,1,0,1,0,1,0,..........0,1} En tant que tel, GA est assemblé en tant qu'individu dans lequel "1" et "0" sont disposés en alternance. ** **

C'est tout.

Sommaire

Il semble qu'il existe une image selon laquelle l'IA est extrêmement difficile à démarrer. Mais étonnamment, la fondation est intéressante et facile à imaginer. Dans cet article, vous pouvez voir un aperçu de l'IA. Tout ce que vous avez à faire est de présenter vos idées. À la prochaine. Merci pour la lecture.

Recommended Posts

Introduction à l'intelligence artificielle avec Python 2 «Pratique de l'algorithme génétique»
Introduction au remplissage d'image Python Remplissage d'image à l'aide d'ImageDataGenerator
[Introduction à Python] Utilisons foreach avec Python
La première intelligence artificielle. Testez la sortie Web avec python. ~ Introduction du flacon
Markov Chain Artificial Brainless avec Python + Janome (1) Introduction à Janome
Chaîne de Markov artificielle sans cervelle avec Python + Janome (2) Introduction à la chaîne de Markov
Introduction à Tornado (1): Framework Web Python démarré avec Tornado
Introduction au langage Python
Introduction à OpenCV (python) - (2)
Introduction au vol en formation avec Tello edu (Python)
Introduction à Python avec Atom (en route)
Introduction au modèle linéaire généralisé (GLM) par Python
[Introduction à l'application Udemy Python3 +] 9. Tout d'abord, imprimez avec print
[Introduction à Python] Comment itérer avec la fonction range?
Jouer avec l'API d'intelligence artificielle locale de l'utilisateur en Python
[Chapitre 5] Introduction à Python avec 100 coups de traitement du langage
Introduction au traitement parallèle distribué Python par Ray
Introduction aux mathématiques à partir du mémo d'étude Python Vol.1
Note de lecture: Introduction à l'analyse de données avec Python
J'ai essayé d'implémenter le perceptron artificiel avec python
[Chapitre 3] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 2] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 4] Introduction à Python avec 100 coups de traitement du langage
Connectez-vous à BigQuery avec Python
Introduction à Python Django (2) Win
Prédire les cuisses de bougie avec l'intelligence artificielle
Connectez-vous à Wikipedia avec Python
Publiez sur Slack avec Python 3
Introduction à RDB avec sqlalchemy Ⅰ
Introduction à la communication série [Python]
Basculer python vers 2.7 avec des alternatives
Écrire en csv avec Python
[Introduction à Python] <liste> [modifier le 22/02/2020]
Introduction à Python (version Python APG4b)
Une introduction à la programmation Python
Introduction à Python pour, pendant
Un exemple de python pour apprendre XOR avec un algorithme génétique sur un réseau neuronal
Introduction à elle faite avec Python ~ Projet d'automatisation Tinder ~ Épisode 6
20200329_Introduction à l'analyse de données avec Python 2nd Edition Personal Summary
Introduction à elle faite avec Python ~ Projet d'automatisation Tinder ~ Épisode 5
Introduction à Python pour les utilisateurs de VBA - Appeler Python depuis Excel avec xlwings -
[Raspi4; Introduction au son] Enregistrement stable de l'entrée sonore avec python ♪
[Introduction à Python] Comment obtenir des données avec la fonction listdir
[Introduction à Udemy Python3 + Application] 51. Soyez prudent avec les arguments par défaut
[Présentation de l'application Udemy Python3 +] 58. Lambda
[Présentation de l'application Udemy Python3 +] 31. Commentaire
Python: comment utiliser async avec
Lien pour commencer avec python
Introduction à la bibliothèque de calcul numérique Python NumPy
Entraine toi! !! Introduction au type Python (conseils de type)
[Introduction à Python3 Jour 1] Programmation et Python
[Python] Ecrire dans un fichier csv avec Python
Ravi de vous rencontrer avec python
[Introduction à Python] <numpy ndarray> [modifier le 22/02/2020]
[Présentation de l'application Udemy Python3 +] 57. Décorateur
Essayez d'exploiter Facebook avec Python
Introduction à Python Hands On Partie 1
[Introduction à Python3 Jour 13] Chapitre 7 Chaînes de caractères (7.1-7.1.1.1)
Sortie vers un fichier csv avec Python