-
Notifications
You must be signed in to change notification settings - Fork 1
/
PPV.py
58 lines (52 loc) · 1.86 KB
/
PPV.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
# Nearest Neighbor Implementation provided by Oussama BENDJABALLAH, refactored into a command line program by Smail KOURTA
import numpy as np
import Parser
import argparse
import time
def PPV(graphe, v_depart=None):
# Faire une copie du graphe vu qu'il va subir a des modification
_graphe = graphe.copy()
# La liste chemin gardera trace de notre parcour
chemin = []
# Selection d'un point de depart
if v_depart is None:
depart = v_depart = np.random.randint(0, len(graphe))
depart = v_depart
chemin.append(v_depart)
# Creation de l'ensemble des noeuds non visités
noeudsNonVisite = set(
np.delete(np.arange(0, len(graphe)), v_depart).flatten())
cout = 0
while (len(noeudsNonVisite) != 0):
# Retourner le plus proche voisin
v_suivante = np.argmin(_graphe[v_depart, :])
# Màj du chemin
chemin.append(v_suivante)
# Màj du cout
cout += _graphe[v_depart, v_suivante]
# Visiter le prochain neoud
noeudsNonVisite.remove(v_suivante)
v_depart = v_suivante
# Mettre vers les noeuds deja visité a l'infini
_graphe[v_depart, chemin] = float("inf")
_graphe[chemin, v_depart] = float("inf")
# Ajouter le cout de retour
cout += graphe[v_suivante, depart]
return chemin, cout
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("instance")
parser.add_argument("--start",
help="Starting Node",)
args = parser.parse_args()
instance = Parser.TSPInstance(args.instance)
instance.readData()
start_time = time.time()
if args.start is not None:
tour, cost = PPV(np.array(instance.data), int(args.start))
else:
tour, cost = PPV(np.array(instance.data))
end_time = time.time()
print(tour)
print(cost)
print(end_time - start_time)