-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathordo_Dynamique_Iterative.py
95 lines (83 loc) · 3.33 KB
/
ordo_Dynamique_Iterative.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import csv
from itertools import chain, combinations
import generation
import time
pi = []
wi = []
di = []
n = input("How many tasks do you want to schedule ? \n")
k=tuple(range(1,n+1))
#la fonction qui supprime un element dans l'ensemble des taches, elle facilite comment retrouver les sous taches de J
def supp(c,chaine):
res=[]
if chaine[0]==c:
res=chaine[1:]
for j in range(len(chaine)):
if c==chaine[j]:
res=chaine[0:j]+chaine[j+1:]
return res
# Cette boucle pour generer les donnees des taches en respectant les contraintes du poids
# chose qui existe deja dans la fonction generer
for i in range(n):
pi.append(generation.generer(n)[0][i])
wi.append(generation.generer(n)[1][i])
di.append(generation.generer(n)[2][i])
#enregistrer les donnees generes dans un fichier csv sous le nom LesDonnesDyna
with open("LesDonnesDyna.csv", "w") as new_file:
csv_writer = csv.writer(new_file, delimiter='\t')
csv_writer.writerow(['i', 'Pi', 'Wi', 'Di'])
for i in range(1, n + 1):
csv_writer.writerow([i, pi[i - 1], wi[i - 1], di[i - 1]])
#pour generer les sequenses possibles
# i c'est le nombre de chaque sequence
debut = time.time()
def all_subsets(ss,i):
return chain(*map(lambda x: combinations(ss, x), range(i,i+1)))
#Combinaison est une liste qui stoque les differentes sous listes (sous taches)
combinaison=[]
for subset in all_subsets(k,2):
combinaison.append(subset)
#pour calculer la condition initiale qui est l'execution d'une seule tache
def f1(i):
return wi[i[0]-1]*max(0,(pi[i[0]-1]-di[i[0]-1]))
#pour calculer les valeurs optimales de 2 combinaisons
def f2(i):
ci=0
for j in range(len(i)):
ci+=pi[int(i[j])-1]
resultP={}
resultP[str(i[0])+" => "+str(i[1])]=f1(supp(i[1],i))+wi[int(i[1])-1]*max(0,(ci-di[int(i[1])-1]))
resultP[str(i[1])+" => "+str(i[0])]=f1(supp(i[0],i))+wi[int(i[0])-1]*max(0,(ci-di[int(i[0])-1]))
#min=min_dic(resultP)
mino=min(resultP.values())
n=resultP.values().index(mino)
v=resultP.keys()[n]
#chemin.append(v)
return mino,v
etapeII={}
for i in range(len(combinaison)):
etapeII[combinaison[i]]=f2(combinaison[i])
for i in range(3,len(k)+1):
combinaison1=[]
for subset in all_subsets(k,i):
combinaison1.append(subset)
for t in range(len(combinaison1)):
resultP={}
for h in range(len(combinaison1[t])):
ci=0
for j in range(len(combinaison1[t])):
ci+=pi[combinaison1[t][j] - 1]
r=supp(combinaison1[t][h], combinaison1[t])
resultP[etapeII[r][1] +' => ' + str(combinaison1[t][h])]= etapeII[r][0] + wi[combinaison1[t][h] - 1] * max(0, (ci - (di[combinaison1[t][h] - 1])))
mino=min(resultP.values())
n=resultP.values().index(mino)
v=resultP.keys()[n]
etapeII[combinaison1[t]]=(mino, v)
fin = time.time()
with open('resultat.txt','w') as resultat:
resultat.write("-la valeur optimal est :"+str(etapeII[k][0])+"\n")
resultat.write("-La séquence optimale est : \n")
resultat.write("-"*len(str(etapeII[k][1])) +"\n")
resultat.write('|'+str(etapeII[k][1])+'|\n')
resultat.write("-"*len(str(etapeII[k][1])) +"\n")
resultat.write("Le temps d'execution est : "+str(fin - debut)+" secondes.")