Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
117 changes: 117 additions & 0 deletions DynamicProgramming/DynamicProgramming.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
#!/usr/bin/env python
# coding: utf-8


import numpy as np
import time
#Lire une instance du graph a partir d'un fichier
def from_file(file_path):
with open(file_path) as f:
line = f.readline()
while line[0] != "p":
line = f.readline()
n = int(line.split()[2])
adj_mat = []
for i in range(0,n):
adj_mat.append([False]*n)
for line in f:
if line[0] == "e":
w, v = map(int, line.split()[1:])
adj_mat[w-1][v-1] = adj_mat[v-1][w-1] = True
return np.array(adj_mat)

#Ecrire la solution dans un fichier
def to_file(file_path , Graph):
Temps,Soluce = DynamicProgramming(Graph)
with open(file_path,"w") as f:
f.write( "# Solution pour le Graph du fichier "+file_path+"\n" )
f.write( "Minimum number of colors used : " + str(Soluce[1]) + "\n" )
f.write( "Temps execution :: "+str(Temps) + "\n" )
f.write( "Color Affectation to the nodes : \n")
[f.write( "Node "+ str(i)+ " :: "+str(Soluce[0][i]) +"\n") for i in range(0,len(Soluce[0]))]
return

#Fonction de Transition d'un etat a un autre
#Colorer le noeud node avec toutes les couleurs possibles
#Si aucune couleur possible, ajouter une nouvelle couleur

def ColorerVoisin(Graph, state, node):
#Le premier noeud, on lui affectte la couleur 0
if node == 0:
NewStates = [ ([0] , 1) ]
else :
#Recuperer la colorisation sous-optimale
Soluce = state[0]
#Le nombre de couleur sous-optimal
XG = state[1]
#Initialisation de la liste des sous-solutions optimales
NewStates = []
#Recuperer la liste des adjacents du noeud
Adjacents = np.where(Graph[node][:node] == True)[0]
#Recuperer la liste des couleurs deja utiliser par les adjacents du noeud
AdjColor = np.unique( np.array( [Soluce[V] for V in Adjacents] ) )
#Affecter Toutes les couleurs possibles au noeud
for color in range(0,XG):
if color not in AdjColor:
NewSoluce = Soluce.copy()
NewSoluce.append(color)
NewState = (NewSoluce , XG)
NewStates.append(NewState)
#Si pas de couleurs possibles alors ajouter une nouvelle couleur
if len(NewStates) == 0:
NewSoluce = Soluce.copy()
NewSoluce.append(XG)
NewState = (NewSoluce , XG + 1)
NewStates.append(NewState)
return np.array(NewStates,dtype=object)

#Programmation dynamique
#Input : Un graph a N noeuds
# Supposons qu'on a une solution optimale pour le Graph a (N - 1) Noeuds : X( G (N-1) )
# Quel est la solution optimale pour un graph a (N) Noeuds, X( G(N) ) = ?
# Ensemble des decisitons possible :
# Soit on peut affecter une couleur au noeud N, sans enfreindre les regles de colorisation ==> X( G(N) ) = X( G(N-1) )
# Si aucune couleur possible au noeud N, Ajouter une nouvelle couleur ==> X( G(N) ) = X( G(N-1) ) + 1

def DynamicProgramming(Graph):
#Temps initial
ts = time.time()
#Nombre de Noeuds
V = len(Graph)
#Etat initiale : Aucun noeud , 0 couleur
state = ([],0)
#Ensembles des etats Ek : Ensemble des colorisations possibles optimales du sous-graph a k noeuds
Level = [np.array( [ ( [] , 0) ], dtype=object)]
#Pour chaque Noeud :
for node in range(0,V):
#Obtenir l'ensembles des etats precedent :E(k-1)
States = Level.pop()
#Recuperer le cout de chaque solution (nombre de couleurs)
XG_list = States[:,1]
#Recupere les solutions avec le moindres couts(nombre de couleur)
indStates = np.where(XG_list== XG_list.min())[0]
#Initialiser l'ensemble E(k)
Solutions = []
#Pour chaque Solutions optimales a k-1
for i in indStates :
#Obtenir les nouvelles solutions optimales a l'ordre k
Solutions.extend(ColorerVoisin(Graph,States[i],node) )
#Ajouter les Ek
Level.append(np.array(Solutions))
#Recupere les solutions optimales des derniers etats E(n)
States = Level.pop()
XG_list = States[:,1]
tf = time.time()
return tf-ts,States[np.argmin(XG_list)]

def coloring_graph(fromFile , toFilePath):
Graph = from_file(fromFile)
to_file(toFilePath+ fromFile+".Soluce.txt",Graph)

coloring_graph("myciel4.col","DynamicSoluce/")






15 changes: 15 additions & 0 deletions DynamicProgramming/DynamicSoluce/myciel3.col.Soluce.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Solution pour le Graph du fichier DynamicSoluce/myciel3.col.Soluce.txt
Minimum number of colors used : 4
Temps execution :: 0.002442598342895508
Color Affectation to the nodes :
Node 0 :: 0
Node 1 :: 1
Node 2 :: 0
Node 3 :: 1
Node 4 :: 2
Node 5 :: 0
Node 6 :: 1
Node 7 :: 0
Node 8 :: 1
Node 9 :: 2
Node 10 :: 3
27 changes: 27 additions & 0 deletions DynamicProgramming/DynamicSoluce/myciel4.col.Soluce.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Solution pour le Graph du fichier DynamicSoluce/myciel4.col.Soluce.txt
Minimum number of colors used : 5
Temps execution :: 0.29488134384155273
Color Affectation to the nodes :
Node 0 :: 0
Node 1 :: 1
Node 2 :: 0
Node 3 :: 1
Node 4 :: 2
Node 5 :: 0
Node 6 :: 1
Node 7 :: 0
Node 8 :: 1
Node 9 :: 2
Node 10 :: 3
Node 11 :: 0
Node 12 :: 1
Node 13 :: 0
Node 14 :: 1
Node 15 :: 2
Node 16 :: 0
Node 17 :: 1
Node 18 :: 0
Node 19 :: 1
Node 20 :: 2
Node 21 :: 3
Node 22 :: 4
29 changes: 29 additions & 0 deletions DynamicProgramming/DynamicSoluce/queen5_5.col.Soluce.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Solution pour le Graph du fichier DynamicSoluce/queen5_5.col.Soluce.txt
Minimum number of colors used : 5
Temps execution :: 0.0049898624420166016
Color Affectation to the nodes :
Node 0 :: 0
Node 1 :: 1
Node 2 :: 2
Node 3 :: 3
Node 4 :: 4
Node 5 :: 2
Node 6 :: 3
Node 7 :: 4
Node 8 :: 0
Node 9 :: 1
Node 10 :: 4
Node 11 :: 0
Node 12 :: 1
Node 13 :: 2
Node 14 :: 3
Node 15 :: 1
Node 16 :: 2
Node 17 :: 3
Node 18 :: 4
Node 19 :: 0
Node 20 :: 3
Node 21 :: 4
Node 22 :: 0
Node 23 :: 1
Node 24 :: 2
53 changes: 53 additions & 0 deletions DynamicProgramming/DynamicSoluce/queen7_7.col.Soluce.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# Solution pour le Graph du fichier DynamicSoluce/queen7_7.col.Soluce.txt
Minimum number of colors used : 7
Temps execution :: 4.870969772338867
Color Affectation to the nodes :
Node 0 :: 0
Node 1 :: 1
Node 2 :: 2
Node 3 :: 3
Node 4 :: 4
Node 5 :: 5
Node 6 :: 6
Node 7 :: 2
Node 8 :: 3
Node 9 :: 4
Node 10 :: 5
Node 11 :: 6
Node 12 :: 0
Node 13 :: 1
Node 14 :: 4
Node 15 :: 5
Node 16 :: 6
Node 17 :: 0
Node 18 :: 1
Node 19 :: 2
Node 20 :: 3
Node 21 :: 6
Node 22 :: 0
Node 23 :: 1
Node 24 :: 2
Node 25 :: 3
Node 26 :: 4
Node 27 :: 5
Node 28 :: 1
Node 29 :: 2
Node 30 :: 3
Node 31 :: 4
Node 32 :: 5
Node 33 :: 6
Node 34 :: 0
Node 35 :: 3
Node 36 :: 4
Node 37 :: 5
Node 38 :: 6
Node 39 :: 0
Node 40 :: 1
Node 41 :: 2
Node 42 :: 5
Node 43 :: 6
Node 44 :: 0
Node 45 :: 1
Node 46 :: 2
Node 47 :: 3
Node 48 :: 4
26 changes: 26 additions & 0 deletions DynamicProgramming/myciel3.col
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
c FILE: myciel3.col
c SOURCE: Michael Trick (trick@cmu.edu)
c DESCRIPTION: Graph based on Mycielski transformation.
c Triangle free (clique number 2) but increasing
c coloring number
p edge 11 20
e 1 2
e 1 4
e 1 7
e 1 9
e 2 3
e 2 6
e 2 8
e 3 5
e 3 7
e 3 10
e 4 5
e 4 6
e 4 10
e 5 8
e 5 9
e 6 11
e 7 11
e 8 11
e 9 11
e 10 11
77 changes: 77 additions & 0 deletions DynamicProgramming/myciel4.col
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
c FILE: myciel4.col
c SOURCE: Michael Trick (trick@cmu.edu)
c DESCRIPTION: Graph based on Mycielski transformation.
c Triangle free (clique number 2) but increasing
c coloring number
p edge 23 71
e 1 2
e 1 4
e 1 7
e 1 9
e 1 13
e 1 15
e 1 18
e 1 20
e 2 3
e 2 6
e 2 8
e 2 12
e 2 14
e 2 17
e 2 19
e 3 5
e 3 7
e 3 10
e 3 13
e 3 16
e 3 18
e 3 21
e 4 5
e 4 6
e 4 10
e 4 12
e 4 16
e 4 17
e 4 21
e 5 8
e 5 9
e 5 14
e 5 15
e 5 19
e 5 20
e 6 11
e 6 13
e 6 15
e 6 22
e 7 11
e 7 12
e 7 14
e 7 22
e 8 11
e 8 13
e 8 16
e 8 22
e 9 11
e 9 12
e 9 16
e 9 22
e 10 11
e 10 14
e 10 15
e 10 22
e 11 17
e 11 18
e 11 19
e 11 20
e 11 21
e 12 23
e 13 23
e 14 23
e 15 23
e 16 23
e 17 23
e 18 23
e 19 23
e 20 23
e 21 23
e 22 23
Loading