optNetwork

cycle

##set_optnetwork

Description

L'action cycle du set d'actions network est conçue pour l'énumération des cycles dans un graphe. Un cycle est un chemin qui commence et se termine au même nœud sans répéter de liens. Cette action est particulièrement utile pour détecter des dépendances circulaires, optimiser des routes ou analyser des structures de réseaux complexes. Elle propose deux algorithmes principaux : 'BACKTRACK' pour les énumérations exhaustives (recommandé pour les longs cycles) et 'BUILD' pour une approche plus incrémentale. Parce que parfois, pour avancer, il faut savoir boucler la boucle (mais pas trop souvent non plus !).

Syntaxe Officielle
proc cas;
optNetwork.cycle /
algorithm="BACKTRACK" | "BUILD"
deterministic=true | false
direction="DIRECTED" | "UNDIRECTED"
links={caslib="nom_caslib", name="nom_table_liens"}
nodes={caslib="nom_caslib", name="nom_table_noeuds"}
maxCycles=nombre | "ALL"
maxLength=entier
minLength=entier
out={name="table_noeuds_cycles"}
outCyclesLinks={name="table_liens_cycles"}
;
run;

Paramètres Clés

Nom du paramètre Description
algorithm Définit l'algorithme de recherche : 'BACKTRACK' (retour sur trace) ou 'BUILD' (construction progressive). Par défaut, 'BUILD' est utilisé si maxLength <= 20.
direction Indique si le graphe est orienté ('DIRECTED') ou non ('UNDIRECTED'). Un cycle dans un graphe non orienté nécessite au moins 3 nœuds.
maxCycles Le nombre maximum de cycles à trouver avant de s'arrêter. Utilisez 'ALL' pour une recherche exhaustive (attention aux performances sur les gros graphes !).
maxLength La longueur maximale (nombre de liens) autorisée pour un cycle.
minLength La longueur minimale (nombre de liens) requise pour qu'un cycle soit conservé dans les résultats.
out Nom de la table CAS qui recevra la liste des nœuds appartenant aux cycles trouvés.
outCyclesLinks Nom de la table CAS qui contiendra les liens formant les cycles.

Préparation des données

Création d'un réseau de transport avec cycles

Nous créons ici un petit graphe simple représentant des villes (A, B, C, D) où il existe un cycle évident entre A, B et C.

1DATA casuser.liens_transport;
2 INPUT from $ to $ weight;
3 DATALINES;
4A B 10
5B C 15
6C A 12
7C D 20
8D A 25
9;
10RUN;

Exemples d'utilisation

Détection de base des cycles

Recherche de tous les cycles dans notre graphe de transport sans contrainte particulière.

1PROC CAS;
2 optNetwork.cycle /
3 links={name="liens_transport"}
4 direction="DIRECTED"
5 out={name="cycles_villes"}
6 ;
7RUN;
Résultat Attendu :
Une table CAS 'cycles_villes' listant les cycles identifiés (ex: A-B-C-A).
Énumération limitée avec contraintes de longueur

Ici, on cherche maximum 5 cycles dont la longueur est comprise entre 3 et 4 liens, en utilisant l'algorithme de backtracking.

1PROC CAS;
2 optNetwork.cycle /
3 links={name="liens_transport"}
4 algorithm="BACKTRACK"
5 direction="DIRECTED"
6 maxCycles=5
7 minLength=3
8 maxLength=4
9 out={name="noeuds_cycles_contraints", replace=true}
10 outCyclesLinks={name="liens_cycles_contraints", replace=true}
11 ;
12RUN;
Résultat Attendu :
Deux tables : 'noeuds_cycles_contraints' (les étapes) et 'liens_cycles_contraints' (les arcs utilisés), filtrées selon nos critères de taille.