Beruflich Dokumente
Kultur Dokumente
RAPPORT
DE PROJET
LA RÉSOLUTION DU PROBLÈME DE
VOYAGEUR DE COMMERCE PAR UN
ALGORITHME DE COLONIES DE FOURMIS
CALIBRÉ ET OPTIMISÉ PAR UN
ALGORITHME GÉNÉTIQUE
DATE
30 MARS 2018
ELABORÉ PAR :
SLIMANE RABII
BELLAHIRECH FAROUK
SUPERVISÉ PAR :
HACHAICHI YASSINE
TABLE DES MATIERES
1. INTRODUCTION :………………………………………………………………………………………………………..2
9. CONCLUSION :…………………………………………………………………………………………………….…….15
1
1. INTRODUCTION :
2
Au départ le déplacement des fourmis est assez aléatoire mais les premières
fourmis qui reviennent au nid avec de la nourriture (en rouge sur la figure 1) sont celles qui
ont emprunté un chemin plus court et donc leur chemin sera plus marqué par les
phéromones (plus attirant). Et grâce à l’aspect aléatoire dans le déplacement des fourmis le
choix du chemin plus court s’améliora au fur du temps et attirera au final toutes les
fourmis.
Il faut noter que la phéromone est une substance volatile ce qui joue un rôle très
important, en effet cela favorise la découverte de nouveaux chemins, qui malgré leur
concentration faible en phéromone ont quand même une chance d’être choisi.
3-Répéter :
3-5-Vider les mémoires des fourmis pour recommencer à partir du nœud initial.
3
5. MODELISATION DU COMPORTEMENT DES FOURMIS :
Pour chaque décision la fourmi choisit une arrête non encore visité tout en
préférant les arrêtes courtes et les arrêtes qui contiennent plus de phéromones. La
probabilité du passage de la fourmi k placée sur le nœud i vers un nœud j se calcule par la
formule suivante.
𝟏
𝒕𝒊𝒋𝜶 . ( )𝜷
𝒅𝒊𝒋
𝒌
𝒑𝒊𝒋 = , 𝒔𝒊 𝒋𝝐𝑵𝒌𝒊 (𝟏)
𝜶 𝟏 𝜷
∑𝒍𝝐𝑵𝒌 𝒕𝒊𝒍 . ( )
𝒊 𝒅𝒊𝒍
{ 𝟎, 𝒔𝒊𝒏𝒐𝒏
Avec :
-𝒕𝒊𝒋 : Variable qui indique la quantité des phéromones entre le nœud i et le nœud j.
𝟏
- : Variable qui caractérise la visibilité du nœud j à partir du nœud i (𝒅𝒊𝒋 est la distance qui
𝒅𝒊𝒋
4
-𝜶 : Paramètre qui caractérise l’importance de la quantité de phéromones.
-𝑵𝒌𝒊 : L’ensemble des nœuds que la fourmi k, placée sur la ville i, n’a pas encore visité dans
le cycle courant.
Lors de son passage entre le nœud i et le nœud j la fourmi k va déposer une quantité
𝑸⁄ de phéromone sur l’arrête ij. Par conséquence, pour calculer la quantité de
𝑳𝒌
phéromone déposée sur cette arrête par toute les fourmis ∆𝒕𝒊𝒋 , on utilise la formule
suivante :
𝑸
∆𝒕𝒊𝒋 = ∑ (𝟐)
𝑳𝒌
𝒌𝝐𝑬
Avec :
Une fois les ∆𝒕𝒊𝒋 sont calculés, on passe au calcul des 𝒕𝒊𝒋 au biais de la formule suivante :
Avec :
𝝆 : Coefficient qui définie la vitesse d’évaporation des phéromones sur les arrêtes.
5
6. IMPLEMENTATION DE L’ALGORITHME ET TEST AVEC PYTHON 3 :
(Voir annexe 1)
6.1. IMPLEMENTATION :
6.2. Test:
from numpy.core.multiarray import array
from main import voy_comm_colo_fourmi
from random import *
from matplotlib import pyplot as PLT
Résultat de l’exécution :
C:\Users\firas\AppData\Local\Programs\Python\Python36-32\python.exe "D:/Rabii/2
année/PRO/test3.py"
nbr cycle: 42
nbr stagnation: 2
meilleur circuit trouvé: [1, 5, 6, 4, 2, 3, 0, 1]
distance: 25
*******************************************
6
Remarques :
2-En ce qui concerne le temps de calcul, les calculs ont été effectués avec un Pc
Portable Asus K555LD i5-4210U 4é Génération Up To 2.7 GHz, Mémoire 8 Go DDR3 1600
MHz.
Figure 3 : étude de l’influence du nombre de fourmis sur le temps de calcul et la convergence de l’algorithme
7
La figure 3 représente l’influence du nombre de fourmis sur le temps de calcul et la
convergence de l’algorithme et ceci pour 5 graphe de différent nombre de nœud. En effet
chaque figure englobe 1000 point et Chaque point de cette figure indique le temps de calcul
en (ms) et la longueur du meilleur resultat trouvé en exécutant l’algorithme pour un
nombre de nœud entre 6 et 10 et pour un nombre aléatoire de fourmis entre 1 et 20.
Remarque :
𝑛𝑜𝑚𝑏𝑟𝑒 𝑑𝑒 𝑝𝑜𝑖𝑛𝑡 𝑝𝑎𝑟 𝑡𝑦𝑝𝑒 𝑑𝑒 𝑔𝑟𝑎𝑝ℎ𝑒 = 1000
D’après la figure ci dessus les deux variables q et temps de calcul sont du moins
linéairement indépendantes, d’ailleurs le coefficient de corrélation est assez faible.
8
7.3. INFLUENCE DE C SUR LE TEMPS DE CALCUL :
Remarque :
9
7.4. Influence d’alpha sur le temps de calcul :
Figure 6 : étude de l’influence du facteur rou sur le temps de calcul et la convergence de l’algorithme
Remarque :
10
7.5. INFLUENCE DE BETA SUR LE TEMPS DE CALCUL :
Figure 7 : étude de l’influence du facteur beta sur le temps de calcul et la convergence de l’algorithme
Remarque :
D’après la figure ci dessus les deux variables beta et temps de calcul sont du moins
linéairement indépendantes, d’ailleurs le coefficient de corrélation est assez faible.
11
Remarque :
Figure 9 : étude de l’influence du facteur cycle_max sur le temps de calcul et la convergence de l’algorithme
Remarque :
12
7.8. INFLUENCE DE ROU SUR LE TEMPS DE CALCUL :
Figure 10 : étude de l’influence du facteur rou sur le temps de calcul et la convergence de l’algorithme
Remarque :
D’après la figure précédente les deux variables rou et temps de calcul sont du
moins linéairement indépendantes, d’ailleurs le coefficient de corrélation est assez faible.
8.1. INTRODUCTION :
13
Le déroulement d'un algorithme génétique peut être découpé en cinq parties :
(Voir annexe 2)
14
Figure 12 : représentation des meilleurs résultats trouvés par l’algorithme génétique.
9. CONCLUSION :
15
ANNEXE 1
from random import *
from numpy import *
import copy
#Def la class fourmi
class Fourmi():
id=0
trajet=[]
def __init__(self,id,nbr_noeud):
self.id=id
self.trajet=[randint(0, nbr_noeud-1)]
def deplacer (self,x):
self.trajet.append(x)
def __repr__(self):
return (str(self.id)+str(self.trajet))
1
#ajout: calcule les quantités de phéromone deposées par tout
# les fourmis en utilisant la formule (2)
def ajout(tab_distance,nbr_noeud,tab_fourmi,q):
a = zeros((nbr_noeud, nbr_noeud))
for f in tab_fourmi:
for i in range(0,nbr_noeud):
a[f.trajet[i],f.trajet[i+1]]+=q/distance(f.trajet,tab_distance)
return a
pos = t2.index(t1[0])
for i in range(0, count):
if (t1[i]!=t2[pos-i]):
permut_indirecte=False
return permut_indirecte or permut_directe
2
tab_pheromone=zeros((nbr_noeud,nbr_noeud))
for i in range(0,nbr_noeud):
for j in range(0,nbr_noeud):
if tab_distance[i,j]!=0:
tab_pheromone[i,j] = c
####Boucle principale####
while True:
#Chaque fourmi effectue un cycle
for i in range(0,nbr_noeud-1):
for f in tab_fourmi:
f.deplacer(passage(f,tab_distance,nbr_noeud,tab_pheromone,alpha,beta))
#verifier la stagnation et mise à jour du nbr de stagnation et nbr de
cycle
if test_stagnation(tab_fourmi,nbr_noeud):
stag+=1
cycle += 1
#Fermer le cycle par le noeud initial
for f in tab_fourmi:
f.deplacer(f.trajet[0])
tab_ajout=ajout(tab_distance,nbr_noeud,tab_fourmi,q)
3
ANNEXE 2
from main import voy_comm_colo_fourmi
from random import *
import operator
from numpy.core.multiarray import array
from math import inf
def fitness (indiv):
tab_distance = array([[0, 5, 7, 4, 11, 2, 5, 6, 3, 2],
[5, 0, 9, 8, 13, 1, 6, 2, 7, 6],
[7, 9, 0, 4, 7, 12, 7, 4, 2, 1],
[4, 8, 4, 0, 7, 17, 7, 8, 4, 1],
[11, 14, 7, 7, 0, 4, 1, 5, 10, 8],
[2, 1, 12, 17, 4, 0, 3, 5, 3, 5],
[5, 6, 7, 7, 1, 3, 0, 3, 4, 6],
[6, 2, 4, 8, 5, 5, 3, 0, 8, 1],
[3, 7, 2, 4, 10, 3, 4, 8, 0, 2],
[2, 6, 1, 1, 8, 5, 6, 1, 2, 0]])
meilleur_sol=23
nbr_fourmi=indiv[0]
c=indiv[1]
alpha=indiv[2]
beta=indiv[3]
q=indiv[4]
rou=indiv[5]
cycle_max=indiv[6]
stag_max=indiv[7]
nbr_noeud = len(tab_distance)
res=voy_comm_colo_fourmi(tab_distance=tab_distance,
nbr_fourmi=nbr_fourmi, c=c, alpha=alpha, beta=beta, q=q,rou=rou,
cycle_max=cycle_max, stagnation_max=stag_max, nbr_noeud=nbr_noeud)
if res[1]>meilleur_sol:
return 0.0000001
else:
return (1/(res[0]+0.0000001))
def generate_indiv ():
# ( nbr_fourmi, c, alpha, beta,
q, rou, cycle_max, stagnation_max )
indiv=[randint(10,20),uniform(0.1,2.0),uniform(0.1,2.0),uniform(0.1,2.0),rand
int(0,100),uniform(0.1,2.0),randint(1,50),randint(1,10)]
return indiv
def generateFirstPopulation(sizePopulation):
population = []
for i in range(0,sizePopulation):
population.append(generate_indiv())
return population
def computePerfPopulation(population):
populationPerf = {}
for i in range(0,len(population)):
populationPerf[i] = fitness(population[i])
# for j in range(0,len(populationPerf)):
# print(str(populationPerf[j])+":"+str(population[j]))
# print(populationPerf)
return sorted(populationPerf.items(), key = operator.itemgetter(1),
reverse=True)
4
def selectFromPopulation(populationSorted,population, best_sample,
lucky_few):
nextGeneration = []
for i in range(best_sample):
nextGeneration.append(population[populationSorted[i][0]])
for i in range(lucky_few):
nextGeneration.append(population[choice(populationSorted)[0]])
shuffle(nextGeneration)
return nextGeneration
def createChild(individual1, individual2):
child = []
for i in range(len(individual1)):
if (randint(0,100) < 50):
child.append(individual1[i])
else:
child.append(individual2[i])
return child
def createChildren(breeders, number_of_child):
nextPopulation = []
for i in range(int(len(breeders)/2)+1):
for j in range(number_of_child):
nextPopulation.append(createChild(breeders[i],
breeders[len(breeders) -1 -i]))
return nextPopulation
def mutation (population,mutationRate):
for indiv in population:
for j in range(0,len(indiv)):
if uniform(0,1)<mutationRate:
zombie=generate_indiv()
indiv[j]=zombie[j]
return population
def
newGeneration(populationSorted,childrenSorted,population,children,nbrNew):
newPopulation=[]
nbrAncient=len(population)-nbrNew
for i in range(0,nbrNew):
newPopulation.append(children[childrenSorted[i][0]])
for i in range(0,nbrAncient):
newPopulation.append(population[populationSorted[i][0]])
return newPopulation
nbGeneration=5
best=[[],10]
population=generateFirstPopulation(10)
for generation in range(0,nbGeneration):
save=population
try:
print('********* ',generation,' *********')
populationSorted=(computePerfPopulation(population))
if 1 / populationSorted[0][1]<best[1]:
best[1]=1 / populationSorted[0][1]
best[0]=population[populationSorted[0][0]]
print(best[1])
breeders=selectFromPopulation(populationSorted,population,best_sample=8,lucky
_few=2)
5
children=createChildren(breeders,number_of_child=100)
childrenSorted=(computePerfPopulation(children))
population=newGeneration(populationSorted,childrenSorted,population,children,
nbrNew=3)
print(population)
population=mutation(population,mutationRate=0.3)
except:
print('erreur')
population=save
pass
print('La solution est:',best[0])
6
ANNEXE 3
Meilleur resultat=[nbr_fourmi,c,alpha,beta,q,rou,cycle_max, stagnation_max]
Pourcentage d’erreur
Temps de calcul en (s)
*********
[17, 0.2443693125538206, 0.9924280903400223, 1.998168770394875, 36,
1.341642086767427, 50, 1]
0.0
0.9417201538085938
*********
[12, 1.1229766494519244, 1.5937505441923254, 1.5444586329661063, 28,
1.84214820666453, 30, 8]
0.1
0.5153367328643799
*********
[10, 1.2712693718169472, 1.649378548222074, 1.6235544654747267, 19,
0.867351501697566, 12, 4]
8.5
0.17183248615264893
*********
[20, 0.17201724975299973, 1.0869197870394898, 0.6501627465068914, 74,
1.0740380350510816, 48, 1]
0.1
1.2985054161548615
*********
[20, 1.8558252892697331, 1.9002271594054663, 1.5820395932931186, 50,
1.0758798939036422, 13, 3]
1.5
0.38942874884605405
*********
[19, 1.552379413021, 1.1369338652601726, 1.733155591652135, 93,
0.5982142712928494, 22, 7]
0.3
0.6039646081924438
*********
[10, 1.3175235708073774, 0.7317492636488722, 1.5777291588683222, 44,
0.8070346206190222, 12, 3]
3.9
0.18110764050483705
*********
[19, 0.3465562657451963, 0.2802974635042992, 1.348760633823064, 42,
0.46572856513500416, 23, 1]
1.7
0.6794796109199523
**********
[11, 1.6722615596908075, 0.9414898214736025, 1.163036727299893, 64,
0.8503810626762516, 37, 4]
0.2
0.751004506111145
**********
[18, 1.5623135394402237, 1.1044801495917558, 1.9600565382327897, 98,
1.27442547730125, 13, 2]
0.2
0.4102074246406555
**********
7
[18, 0.6325102093858508, 1.477081279851728, 1.9320769083640734, 73,
1.1005709921640958, 12, 2]
0.5
0.38414630222320556
*********
[11, 0.6930787442620084, 1.2000277622743736, 0.9212855869243388, 23,
1.6392940282236723, 28, 5]
9.9
0.5777804048061371
*********
[17, 1.979528533996157, 1.802629111199852, 1.7203582091841385, 72,
0.6778766069615064, 7, 2]
6.9
0.23427860522270202
*********
[14, 1.2191170164060352, 1.954642511172922, 1.41958629906768, 42,
1.152432395273703, 13, 4]
5.9
0.4036863133907318
*********
[13, 0.3721557860612301, 0.26804721711952106, 1.5478274833122032, 80,
1.2673094580574225, 12, 6]
15.5
0.30396376132965086
*********
[18, 1.54186584632649, 1.6753526367124894, 1.2783283106592112, 92,
1.9410385537398898, 10, 1]
3.3
0.34682101202011106
*********
[17, 1.3806716265584642, 0.6664998825763278, 1.6692109533220685, 90,
0.9197111038175976, 34, 2]
0.0
1.0153991210460662
*********
[16, 0.8705077664551016, 1.4729350539192925, 1.9894238803433675, 61,
0.15170618250547355, 10, 3]
10.4
0.294479368686676
*********
[12, 1.8509721510060066, 0.5995204712964222, 1.969356806446231, 91,
1.0210491352969269, 20, 8]
0.0
0.47343212366104126
*********
[18, 0.6843066216717102, 0.5400462743815595, 1.713428271017493, 30,
0.2857350828217829, 20, 10]
0.0
0.6844536347389221
*********
[13, 1.5213579014486291, 0.30605000150059025, 1.3971746378205754, 75,
1.0244012038947743, 16, 3]
14.1
0.379948650598526
*********
[10, 0.8226511089320764, 1.018252016630586, 1.6894156379535963, 6,
1.7618931012983965, 12, 9]
8
19.3
0.23950820755958557
*********
[10, 1.4838749895188754, 0.4295203698108515, 1.2058147921359368, 16,
1.535255530044854, 39, 5]
17.0
0.8306101479530335
*********
[18, 0.7509363268853435, 1.5485207685262032, 1.8750629835347192, 4,
1.2760669461282421, 6, 2]
6.4
0.19340564799308776
*********
[13, 1.0307984738661018, 1.081296169375582, 1.2069444433148082, 98,
0.40736279736477454, 15, 8]
8.0
0.34341290140151975
*********
[20, 0.39205998373594664, 1.1113510784407297, 1.8625411526449152, 73,
1.369354089491065, 13, 8]
0.1
0.5255045499801636
*********
[11, 1.7405480664645254, 0.6340366945264527, 1.5932105060878214, 18,
0.34183078453773585, 37, 2]
0.1
0.7799423980712891
*********
[11, 0.9662254048019777, 0.8337755387110909, 1.3658061530277732, 37,
1.2018417585945111, 15, 3]
4.1
0.2867293493747711
*********
[10, 1.605932699502046, 0.5392479389310566, 1.6172297940137204, 5,
1.8161700274037862, 28, 6]
10.2
0.5543758010864258
*********
[11, 0.53540478184028, 0.45325141243730394, 1.9183438344472852, 10,
0.1481150254284247, 17, 9]
1.0
0.4296486091613769
*********
[14, 0.7341563608432642, 1.3208050203555346, 1.4707314059398717, 23,
0.511604400363516, 16, 7]
5.6
0.39553445458412173
*********
[14, 0.20522515893029242, 0.24720174369641063, 1.839820614795412, 81,
0.29015347346438214, 10, 8]
6.8
0.24479062294960022
*********
[13, 1.0680918414221765, 0.8493733594811014, 1.4970479925070768, 87,
0.5225269182237003, 17, 2]
0.8
0.31479517436027527
9
*********
[17, 1.7549487702201194, 0.7108481076586947, 1.8681629564537765, 83,
0.5342151215585703, 7, 1]
2.7
0.16425596046447755
*********
[19, 0.194847415843598, 0.9545910098737831, 0.7437348287738343, 83,
1.8511063085503738, 14, 2]
22.4
0.3797992353439331
*********
[14, 1.1415669423002754, 0.7681374415271441, 1.694844469298878, 51,
1.0713380551821392, 11, 3]
1.6
0.21824168848991393
*********
[20, 0.5685223893709509, 1.4524460190276487, 1.7235523942711253, 65,
0.30031432164258876, 43, 6]
3.6
1.192927778482437
*********
[19, 0.13983426738917198, 1.6830936399499736, 1.442663531629513, 24,
0.9416497328756358, 6, 7]
8.5
0.16472658109664917
*********
[19, 1.6928440806473648, 0.7193357087577548, 1.7934356322560174, 9,
0.6978261239239884, 7, 10]
3.8
0.2064707443714142
*********
[18, 1.7119570890238436, 1.7680593915340561, 1.8975851762806735, 47,
0.718153988769933, 14, 9]
4.9
0.4344768481254578
*********
[16, 0.35819223523688193, 1.5259845646914272, 1.8152382891921277, 44,
0.1287622095389266, 6, 10]
13.1
0.16368883800506592
*********
[20, 1.0422091936501605, 0.5235325102387436, 1.745678803953794, 34,
1.8474481023904599, 17, 2]
0.0
0.4642293403148651
*********
[14, 1.1955303424040116, 0.9730735105811512, 0.8975112857084352, 84,
1.6494828937782269, 17, 4]
18.5
0.3463819789886475
*********
[14, 0.5517299016553531, 1.1897278277890184, 1.5147456439979365, 83,
1.1282015779374903, 19, 1]
0.5
0.3788981487751007
*********
10
[13, 1.8016002664461261, 1.795399704690363, 1.3408500375475945, 41,
0.9285307803777088, 8, 9]
13.3
0.14626645016670228
*********
[14, 1.7497474324042417, 1.6172747558372338, 1.1617385859298717, 70,
1.8927280796489243, 9, 5]
15.0
0.18056275486946105
*********
[14, 0.12487098349137499, 0.8813066982932798, 1.8270670879269353, 75,
1.7705280342509062, 14, 7]
0.4
0.27772400236129763
*********
[16, 1.606496051294973, 1.9225299979927495, 1.4388885446874462, 8,
0.9392257458219606, 16, 1]
0.8
0.39164734196662904
*********
[11, 1.771382057763233, 1.7736522039227747, 1.4940096132677618, 5,
0.9518916937166947, 12, 10]
3.5
0.20900227808952332
*********
[16, 1.128012870071321, 0.5872612236280811, 1.8000894650280976, 5,
0.8756131879420824, 19, 4]
0.1
0.46301876854896545
***** 1 ****
[19, 1.3839031672639919, 0.7985428295245918, 1.3644015199252741, 78,
1.4757515061276447, 13, 10]
1.1
0.2858739595413208
11