L’optimisation évolutive en VBA Excel implique l’utilisation d’algorithmes inspirés de la biologie, tels que les algorithmes génétiques, pour résoudre des problèmes complexes d’optimisation. Ces processus sont basés sur des mécanismes naturels comme la sélection, la mutation, et le croisement pour améliorer une solution à chaque itération.
Je vais vous donner un exemple détaillé d’un algorithme génétique simple en VBA Excel pour optimiser une fonction mathématique. L’objectif est de trouver une valeur minimale pour une fonction donnée, mais vous pouvez l’adapter à d’autres problèmes.
Objectif
Optimiser la fonction simple suivante :
f(x)=x2−4x+4f(x) = x^2 – 4x + 4f(x)=x2−4x+4
L’objectif est de minimiser cette fonction. L’algorithme génétique aura pour but de trouver la valeur de x qui minimise cette fonction.
Plan de l’algorithme génétique
- Initialisation de la population : Créer un ensemble de solutions initiales (valeurs de x).
- Évaluation de la population : Calculer la valeur de la fonction pour chaque solution.
- Sélection : Sélectionner les meilleures solutions pour créer la prochaine génération.
- Croisement (crossover) : Combiner les solutions sélectionnées pour créer de nouvelles solutions.
- Mutation : Introduire une petite variation pour éviter les solutions locales.
- Répéter : Répéter les étapes 2 à 5 pendant plusieurs générations jusqu’à ce que la solution converge.
Code VBA pour l’optimisation génétique
Voici un exemple de code VBA pour appliquer cet algorithme :
- Initialisation des paramètres
- Taille de la population.
- Nombre de générations.
- Probabilité de mutation.
- Définition de la fonction à optimiser
Function ObjectiveFunction(x As Double) As Double ' Fonction à minimiser : f(x) = x^2 - 4x + 4 ObjectiveFunction = x ^ 2 - 4 * x + 4 End Function
- Initialisation de la population
Nous générons une population initiale de valeurs aléatoires pour x.
Sub InitializePopulation(ByRef population() As Double, populationSize As Integer, lowerBound As Double, upperBound As Double) Dim i As Integer Randomize For i = 1 To populationSize population(i) = lowerBound + (upperBound - lowerBound) * Rnd ' Générer des valeurs aléatoires Next i End Sub
- Évaluation de la population
Nous calculons la valeur de la fonction pour chaque individu de la population.
Sub EvaluatePopulation(population() As Double, ByRef fitness() As Double, populationSize As Integer) Dim i As Integer For i = 1 To populationSize fitness(i) = ObjectiveFunction(population(i)) ' Calculer la valeur de la fonction Next i End Sub
- Sélection
Nous sélectionnons les individus en fonction de leur aptitude (fitness). Une méthode simple est de choisir les deux meilleurs.
Sub SelectBestIndividuals(population() As Double, fitness() As Double, ByRef parent1 As Double, ByRef parent2 As Double, populationSize As Integer) Dim i As Integer Dim minFitness As Double, secondMinFitness As Double Dim minIndex As Integer, secondMinIndex As Integer minFitness = Application.WorksheetFunction.Min(fitness) ' Trouver la valeur minimale de fitness secondMinFitness = Application.WorksheetFunction.Small(fitness, 2) ' Trouver la deuxième meilleure valeur For i = 1 To populationSize If fitness(i) = minFitness Then minIndex = i End If If fitness(i) = secondMinFitness Then secondMinIndex = i End If Next i parent1 = population(minIndex) parent2 = population(secondMinIndex) End Sub
- Croisement (Crossover)
Le croisement crée un enfant en combinant les gènes des deux parents.
Function Crossover(parent1 As Double, parent2 As Double) As Double ' Simple croisement : Moyenne des parents Crossover = (parent1 + parent2) / 2 End Function
- Mutation
Nous appliquons une petite mutation sur l’enfant pour introduire de la diversité.
Function Mutate(child As Double, mutationRate As Double, lowerBound As Double, upperBound As Double) As Double If Rnd < mutationRate Then ' Mutation : Ajouter une petite valeur aléatoire à l'enfant child = child + (upperBound - lowerBound) * (Rnd - 0.5) End If ' S'assurer que l'enfant reste dans les bornes If child < lowerBound Then child = lowerBound If child > upperBound Then child = upperBound Mutate = child End Function
- Exécution de l’algorithme génétique
Enfin, nous exécutons l’algorithme sur plusieurs générations pour optimiser la fonction.
Explication du code :
- ObjectiveFunction : La fonction que nous voulons optimiser (minimiser).
- InitializePopulation : Crée une population initiale de valeurs aléatoires pour x.
- EvaluatePopulation : Évalue chaque individu de la population en calculant sa « fitness » (ici, la valeur de la fonction à minimiser).
- SelectBestIndividuals : Sélectionne les deux meilleurs individus selon leur aptitude.
- Crossover : Croise deux parents pour générer un enfant.
- Mutate : Applique une petite mutation à l’enfant.
- RunGeneticAlgorithm : Exécute l’algorithme sur plusieurs générations, en sélectionnant, croisant, et mutant les individus à chaque étape.
Conclusion
Cet algorithme génétique peut être étendu à des problèmes plus complexes, comme l’optimisation de multiples variables ou l’adaptation à des problèmes spécifiques (ex. voyageur de commerce). Le code ci-dessus est un cadre de base pour commencer à utiliser des algorithmes évolutifs dans Excel VBA.