Ola Fred,
Encore une fois dans la table ne figure pas les chemins inverses... Je te cite :
On a déjà eu cette discussion il me semble. C'est pas cool de déterrer des vieux topics pour polémiquer.
Si tu lis attentivement ce que tu as cité tu constateras qu'il existe déjà des aller-retours.
CLERMONT-FERRAND LYON 206,11
[..]
LYON CLERMONT-FERRAND 205,04
et
LYON MONTPELLIER 303,6
[..]
MONTPELLIER LYON 301,66
et aussi
MONTPELLIER TOULOUSE 241,3
[..]
TOULOUSE MONTPELLIER 242,34
et encore
CLERMONT-FERRAND MONTPELLIER 335,23
[..]
CLERMONT-FERRAND TOULOUSE 375,6
C'est donc 1 graphe valué orienté cyclique comportant plusieurs composantes fortement connexes.
Ajouter 1 ou plusieurs arêtes ne changera rien à la chose.
La requête déjà fournie retournera toujours un résultat juste au problème du plus court chemin.
Donc avec Oracle on peut gèrer les arbres, mais aussi les graphes. Et même les treillis (qui pour le coup est aussi un cycle Hamiltonien) comme dans l'exemple du ''traveller saleman problem de E. Rich'' ci-dessus.
Par contre dans ton article (pas mal fait par ailleurs) tu parles du ''problème du voyageur de commerce''. Je ne suis pas d'accord. Il ne s'agit que du plus court chemin ainsi que tu le dis dans cette discussion.
Allez, courage... Oracle va peut être te permettre de faire cela avec une requête encore plus tordue... ;-)
chiche ;) ... Tu sais bien que je ne vais pas résister. Mais c'est juste pour le fun. La requête que j'ai donné fonctionne trés bien.
Dans ma 1ere réponse j'ai dit que je ne voulais pas bricoler la chaîne trajets et que j'avais choisi de le faire en SQL.
(Petit apparté, si tu trouve tordu un classique appareillage maitre/détail, comment tu qualifies une division relationnelle alors ?)
En fait j'avais d'abord utilisé les expressions régulières pour faire le total.
Voilà ce que ça donne (et j'ai rajouté les 2 aller-retours de ton post, dsl, je n'ai pas trouvé le etc..)
SQL> SELECT *
2 FROM Carte
3 ;
PARIS CLERMONT-FERRAND 422
PARIS LYON 463
CLERMONT-FERRAND PARIS 422
CLERMONT-FERRAND LYON 206
CLERMONT-FERRAND MONTPELLIER 335
CLERMONT-FERRAND TOULOUSE 375
LYON PARIS 463
LYON CLERMONT-FERRAND 205
LYON MONTPELLIER 303
MONTPELLIER CLERMONT-FERRAND 332
MONTPELLIER LYON 301
MONTPELLIER TOULOUSE 241
TOULOUSE CLERMONT-FERRAND 374
TOULOUSE MONTPELLIER 242
14 ligne(s) sÚlectionnÚe(s).
SQL> WITH T AS
2 (
3 SELECT CONNECT_BY_ROOT depart || SYS_CONNECT_BY_PATH (destination,
4 SYS_CONNECT_BY_PATH (km, '+') AS x
5 FROM Carte
6 WHERE CONNECT_BY_ROOT depart = 'PARIS'
7 AND destination = 'TOULOUSE'
8 CONNECT BY NOCYCLE PRIOR destination = depart
9 AND destination <> CONNECT_BY_ROOT depart
10 )
11 SELECT CAST (t AS VARCHAR(48)),
12 CAST (x AS VARCHAR(16)),
13 CAST (SUM (CASE SUBSTR(x, LEVEL, 1)
14 WHEN '+'
15 THEN REGEXP_SUBSTR (SUBSTR (x, LEVEL, LENGTH(x)), '^[+][0-9
16 END) AS VARCHAR(8) )
17 FROM T
18 GROUP BY t,
19 x
20 CONNECT BY x = CONNECT_BY_ROOT x
21 AND LEVEL <= LENGTH(x)
22 ;
PARIS,CLERMONT-FERRAND,LYON,MONTPELLIER,TOULOUSE +422+206+303+241 1172
PARIS,LYON,MONTPELLIER,CLERMONT-FERRAND,TOULOUSE +463+303+332+375 1473
PARIS,CLERMONT-FERRAND,MONTPELLIER,TOULOUSE +422+335+241 998
PARIS,LYON,CLERMONT-FERRAND,MONTPELLIER,TOULOUSE +463+205+335+241 1244
PARIS,LYON,MONTPELLIER,TOULOUSE +463+303+241 1007
PARIS,CLERMONT-FERRAND,TOULOUSE +422+375 797
PARIS,LYON,CLERMONT-FERRAND,TOULOUSE +463+205+375 1043
7 ligne(s) sÚlectionnÚe(s).
1 |
0 |