minCut
Description
L'action `minCut` calcule la coupe minimale (minimum cutEnsemble minimal d'arcs dont la suppression sépare un réseau en deux sous-groupes déconnectés, minimisant la capacité totale de passage entre une source et une destination.) d'un graphe. En d'autres termes, elle cherche le moyen le moins coûteux de séparer votre graphe en deux, comme si vous cherchiez le meilleur endroit pour couper un pont sans trop vous fatiguer. ✂️ Elle prend en charge les graphes orientés et non orientés et peut calculer soit la coupe minimale globale, soit la coupe minimale entre un nœud source et un nœud cible (sinkDans un réseau, un sink (puits) est un nœud de destination finale qui absorbe le flux. Il possède une demande nette positive et aucun arc de sortie dans les modèles de flux optimisés.) .
Paramètres Clés
| Nom du paramètre | Description |
|---|---|
| direction | Spécifie si le graphe est orienté ('DIRECTED') ou non orienté ('UNDIRECTED'). Par défaut, c'est 'UNDIRECTED'. |
| links | Table CAS en entrée contenant les informations des liens (arêtes) du graphe. |
| outCutSets | Table de sortie listant les arêtes qui composent la (ou les) coupe(s) minimale(s). |
| outPartitions | Table de sortie contenant l'affectation des nœuds aux partitions générées par la coupe. |
| source | Nœud source (point de départ) pour trouver une coupe s-t spécifique. |
| sink | Nœud cible (point d'arrivée) pour trouver une coupe s-t spécifique. |
| maxCuts | Nombre maximum de coupes à retourner par l'algorithme. La valeur par défaut est 1. |
Préparation des données
Création d'un graphe pondéré de test
Nous créons un petit réseau de 5 nœuds pour illustrer la découpe. Assurez-vous d'avoir une session CAS active (associée ici à la caslib 'mycas').
| 1 | DATA mycas.LinkSetIn; |
| 2 | INPUT from $ to $ weight; |
| 3 | DATALINES; |
| 4 | A B 2 |
| 5 | A C 3 |
| 6 | B C 1 |
| 7 | B D 4 |
| 8 | C D 1 |
| 9 | C E 2 |
| 10 | D E 3 |
| 11 | ; |
| 12 | RUN; |
Exemples d'utilisation
Calcul de la coupe minimale globale
Cet exemple cherche la coupe globale la plus petite dans le graphe non orienté fourni, sans spécifier de source ou de cible.
| 1 | PROC CAS; |
| 2 | optNetwork.minCut / |
| 3 | links={name="LinkSetIn"} |
| 4 | outCutSets={name="CutSetsOut", replace=true} |
| 5 | outPartitions={name="PartitionsOut", replace=true}; |
| 6 | RUN; |
| 7 | QUIT; |
Résultat Attendu :
Calcul de la coupe minimale s-t (Source vers Sink)
Ici, l'algorithme cherche spécifiquement la coupe minimale pour déconnecter le nœud 'A' (source) du nœud 'E' (cible). Le paramètre logLevel='AGGRESSIVE' affichera tous les détails algorithmiques dans le journal SAS pour les curieux. 🕵️♂️
| 1 | PROC CAS; |
| 2 | optNetwork.minCut / |
| 3 | direction="UNDIRECTED" |
| 4 | links={name="LinkSetIn"} |
| 5 | SOURCE="A" |
| 6 | sink="E" |
| 7 | outCutSets={name="CutSetsOut_ST", replace=true} |
| 8 | outPartitions={name="PartitionsOut_ST", replace=true} |
| 9 | logLevel="AGGRESSIVE"; |
| 10 | RUN; |
| 11 | QUIT; |