begin process at 2012 05 23 23:34:51
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Math & Algorithmes

 > ALGORITHMIME GENETIQUE : PROBLEME DU VOYAGEUR DE COMMERCE

ALGORITHMIME GENETIQUE : PROBLEME DU VOYAGEUR DE COMMERCE


 Information sur la source

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Math & Algorithmes Classé sous :genetique algorithme, probleme voyageur, voyageur commerce Niveau :Initié Date de création :25/12/2009 Vu / téléchargé :4 536 / 292

Auteur : mehdicherti

Ecrire un message privé
Site perso
Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

 Description

Probleme du voyageur de commerce avec 10 villes  : consiste à trouver la distance minimale pour passer par toutes les villes sachant les distances entre chaque ville
la resolution est faite en utilisant l'algorithme genetique

Source

  • #!/usr/bin/env python
  • # *-* coding: utf8 *-*
  • import random,sys,os,time
  • class individu:
  • def __init__ (self,nombre_genes,random=-1):
  • self.genes = []
  • self.nombre_genes = nombre_genes
  • if random == -1 : self.random ()
  • """
  • random : initialise aleatoirement les genes
  • """
  • def random (self):
  • self.genes = []
  • f = range(0,self.nombre_genes)
  • for v in range(self.nombre_genes):
  • val = random.choice (f)
  • f.remove (val)
  • self.genes.append (val)
  • """
  • evaluation : compare l'individu avec un tableau d'autres individus
  • retourne le nombre d'individus auquel l'individu self est superieur et de meilleure
  • qualité
  • """
  • def evalutation (self,autres_individus,distances):
  • valeur_individu = 0
  • for v in autres_individus:
  • if self.compare(v,distances) > 0 : valeur_individu = valeur_individu + 1
  • self.valeur_individu = valeur_individu
  • return valeur_individu
  • """
  • compare : compare l'individu self avec un autre individu
  • retourne un nombre positif s'il est superieur
  • un nombre negatif s'il est inferieur
  • le nombre 0 s'il est égal
  • """
  • def calcul_distance (self,distance):
  • a = self.genes[0]
  • dist = 0
  • for b in self.genes[1:]:
  • min=0
  • max=0
  • if a > b :
  • min = b
  • max = a
  • else :
  • min = a
  • max = b
  • dist = dist + (distance[min])[max-min-1]
  • a = b
  • self.distance = dist
  • return dist
  • def compare (self,individu,distance):
  • individu.calcul_distance (distance)
  • self.calcul_distance (distance)
  • return self.distance - individu.distance
  • class population:
  • def __init__ (self,nombre_genes,nombre_initial_population=50):
  • self.nombre_genes = nombre_genes
  • self.distances = [[]] * nombre_genes
  • self.individus = []
  • self.nombre_initial_population = nombre_initial_population
  • for v in range(self.nombre_initial_population):
  • self.individus.append (individu(nombre_genes))
  • """
  • selection : methode de selection des meilleurs N individus
  • """
  • def selection (self , N=-1):
  • if N == -1 : N = len(self.individus)
  • for v in self.individus:
  • v.evalutation (self.individus,self.distances)
  • self.individus.sort (lambda a,b : a.valeur_individu - b.valeur_individu)
  • if N <= len(self.individus) : self.individus = self.individus[0:N]
  • """
  • croisement : selectionne deux individus et croise leur gênes pour en creer de nouveaux
  • """
  • def croisement_deux (self , i1 , i2):
  • i = individu (self.nombre_genes)
  • l = len(i1.genes)
  • a = l / 2
  • p2 = i2.genes[a:l]
  • p1 = i1.genes[0:a]
  • choices = range(0,l)
  • for v in p1:
  • try:choices.remove (v)
  • except : pass
  • for v in p2:
  • try : choices.remove (v)
  • except : pass
  • idc = 0
  • for id in range(len(p2)):
  • if p2[id] in p1:
  • p2[id] = choices[idc]
  • idc = idc + 1
  • i.genes = p1 + p2
  • return i
  • """ croise tous les individus entre eux"""
  • def croisement_all (self):
  • new = []
  • for v1 in range(len(self.individus)):
  • for v2 in range(v1,len(self.individus)):
  • new.append ( self.croisement_deux (self.individus[v1] , self.individus[v2]))
  • self.individus = self.individus + new
  • """ croise nombre_croisement individus aleatoires entre eux """
  • def croisement_nombre (self , nombre_croisement):
  • new = []
  • for r in range(nombre_croisement):
  • v1 = random.randint (0 , len(self.individus)-1)
  • v2 = random.randint (0 , len(self.individus)-1)
  • new.append (self.croisement_deux (self.individus[v1] , self.individus[v2]) )
  • self.individus = self.individus + new
  • if __name__ == "__main__" :
  • """ population de 50 individus"""
  • p = population (10,50)
  • """ initialise les distances """
  • p.distances[0] = [2,3,4,5,6,7,8,9,10 ] # distance de la premiere ville avec la 2eme , 3eme , ... , 10eme
  • p.distances[1] = [11,12,13,14,15,16,17,18 ] # distance de la deuxieme ville avec la 3eme , 4eme , ... ,10eme
  • p.distances[2] = [19,20,21,22,23,24,25] #etc...
  • p.distances[3] = [26,27,28,29,30,31]
  • p.distances[4] = [32,33,34,35,36]
  • p.distances[5] = [37,38,39 ,40]
  • p.distances[6] = [41,42,43]
  • p.distances[7] = [44,45]
  • p.distances[8] = [46] # distance de la 9eme ville avec la 10eme ville
  • """
  • 10 generations
  • a chaque fois fait 100 croisements
  • et selectionne les 10 premiers
  • """
  • for i in range(10):
  • p.croisement_nombre (100)
  • p.selection (10)
  • for v in p.individus:
  • print v.genes,v.calcul_distance (p.distances)
#!/usr/bin/env python
# *-* coding: utf8 *-*
import random,sys,os,time
		
class individu:
	def __init__ (self,nombre_genes,random=-1):
		self.genes = []
		self.nombre_genes = nombre_genes
		if random == -1 : self.random ()
	"""
	random : initialise aleatoirement les genes
	"""
	def random (self):
		self.genes = []
		f = range(0,self.nombre_genes)
		for v in range(self.nombre_genes):
			val = random.choice (f)
			f.remove (val)
			self.genes.append (val)
	""" 
	evaluation : compare l'individu avec un tableau d'autres individus
	retourne le nombre d'individus auquel l'individu self est superieur et de meilleure
	qualité
	"""
	def evalutation (self,autres_individus,distances):
		valeur_individu = 0
		for v in autres_individus:
			if self.compare(v,distances) > 0 : valeur_individu = valeur_individu  + 1
		self.valeur_individu = valeur_individu
		return valeur_individu
	"""
	compare : compare l'individu self avec un autre individu
			  retourne un nombre positif s'il est superieur
			  un nombre negatif s'il est inferieur
			  le nombre 0 s'il est égal
	""" 
	def calcul_distance (self,distance):
		a = self.genes[0]
		dist = 0
		for b in self.genes[1:]:
				min=0
				max=0
				if a > b :
					min = b
					max = a
				else :
					min = a
					max = b
				dist = dist + (distance[min])[max-min-1]
				a = b
		self.distance = dist
		return dist
	def compare (self,individu,distance):
		individu.calcul_distance (distance)
		self.calcul_distance (distance)
		return self.distance - individu.distance
			
			

class population:
	def __init__ (self,nombre_genes,nombre_initial_population=50):
		self.nombre_genes = nombre_genes
		self.distances = [[]] * nombre_genes
		self.individus = []
		self.nombre_initial_population = nombre_initial_population
		for v in range(self.nombre_initial_population):
			self.individus.append (individu(nombre_genes))
	"""
	selection : methode de selection des meilleurs N individus
	"""
	def selection (self , N=-1):
		if N == -1 : N = len(self.individus)
		
		for v in self.individus:
			v.evalutation (self.individus,self.distances)
		
		self.individus.sort (lambda a,b : a.valeur_individu - b.valeur_individu)
		if N <= len(self.individus) : self.individus = self.individus[0:N]
	"""
	croisement : selectionne  deux individus et croise leur gênes pour en creer de nouveaux
	"""
	def croisement_deux (self , i1 , i2):
		i = individu (self.nombre_genes)
		l = len(i1.genes)
		a = l / 2
		p2 = i2.genes[a:l]
		p1 = i1.genes[0:a]
		choices = range(0,l)			
		for v in p1:
			try:choices.remove (v)
			except : pass
		for v in p2:
			try : choices.remove (v)
			except : pass
		idc = 0
		for  id in range(len(p2)):
			if p2[id] in p1:
				p2[id] = choices[idc]
				idc = idc + 1
		i.genes = p1 + p2
		return i
	""" croise tous les individus entre eux"""
	def croisement_all (self):
		new = []
		for v1 in range(len(self.individus)):
			for v2 in  range(v1,len(self.individus)):
				new.append ( self.croisement_deux (self.individus[v1] , self.individus[v2]))
		self.individus  = self.individus + new

	""" croise nombre_croisement individus aleatoires entre eux """
	def croisement_nombre (self , nombre_croisement):
		new = []
		for r in range(nombre_croisement):
			v1 = random.randint (0 , len(self.individus)-1)
			v2 = random.randint (0 , len(self.individus)-1)
			new.append (self.croisement_deux (self.individus[v1] , self.individus[v2]) )
		self.individus = self.individus + new


	

if __name__ == "__main__" :
	""" population de 50 individus"""
	p = population (10,50)
	""" initialise les distances """
	p.distances[0] = [2,3,4,5,6,7,8,9,10 ]     # distance de la premiere ville avec la 2eme , 3eme , ... , 10eme
	p.distances[1] = [11,12,13,14,15,16,17,18 ] # distance de la deuxieme ville avec la 3eme , 4eme , ... ,10eme
	p.distances[2] = [19,20,21,22,23,24,25]  #etc...
	p.distances[3] = [26,27,28,29,30,31]
	p.distances[4] = [32,33,34,35,36]
	p.distances[5] = [37,38,39 ,40]
	p.distances[6] = [41,42,43]
	p.distances[7] = [44,45]
	p.distances[8] = [46] # distance de la 9eme ville avec la 10eme ville
	"""
	10 generations
	a chaque fois fait 100 croisements
	et selectionne les 10 premiers
	"""
	for i in range(10):
		p.croisement_nombre (100)
		p.selection (10)
	for v in p.individus:
			print v.genes,v.calcul_distance (p.distances)


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   algo_genetiques

Télécharger le zip


 Sources du même auteur

Source avec Zip GÉNÉRATION D'UN LABYRINTHE AVEC RECHERCHE DU CHEMIN LE PLUS ...
Source avec Zip PROBLEME DES HUIT DAMES

 Sources de la même categorie

Source avec une capture MISE EN EVIDENCE DE L'ALGORITHME A STAR GRAPHIQUEMENT par Mints
Source avec Zip BASE64 ENCRYPT/DECRYPT PYTHON BY MAXOU56800 par Maxou56800
Source avec Zip Source avec une capture TRIANGULATION par mecrosoft
Source avec Zip Source avec une capture COURBE DE BEZIER par mecrosoft
Source avec Zip Source avec une capture CALCUL D'AIRE D'UN TRIANGLE [INTERFACE GRAPHIQUE] par SeventhSon

Commentaires et avis

Commentaire de xeolin le 02/01/2010 23:17:04 9/10

As-tu pris les chiffres au hasard, car il me semble peut probable que tes distances soient techniquement possible...

Le code est-il de toi ?

Commentaire de mehdicherti le 03/01/2010 16:06:03

Bonjour xeolin , j'ai effectivement pris les distances au hasard , pourquoi sont elles techniquement impossibles ?
Le code est de moi.

Commentaire de xeolin le 03/01/2010 16:27:29

Le code est de toi, bien alors bravo, si je demande c'est que c'est très bien fait !

Enfin, pour les distances, je voyais les distances à vol d'oiseau, sans penser au fait que c'est celle des routes... Enfin je pense que tu vois où je me suis égaré! Ça m'avait rappelé un petit code qui à partir de coordonnés de point devait faire un chemin le plus court pour tous les toucher, et les distances, c'étaient les distances entre les points... Mais ici c'est toi qui les définies !

Sinon tu as fait des importations inutiles, avec time par exemple. Je chipote ^^

Enfin, il est sympathique comme code ^^

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,827 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales