optNetwork

maxFlow

##set_optnetwork

Description

L'action `maxFlow` calcule le flot maximum (maximum flow) d'un graphe . Imaginez que vous soyez un plombier essayant de faire passer le maximum d'eau dans un réseau de tuyaux de tailles différentes, ou un architecte réseau optimisant le trafic de données... c'est exactement ce que fait cette action ! Elle détermine la quantité maximale de 'flux' qui peut voyager d'un nœud source vers 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.) sans dépasser la capacité (la limite) des liens.

Syntaxe Officielle
optNetwork.maxFlow <result=results> <status=rc> /
deterministic=TRUE | FALSE,
direction="DIRECTED" | "UNDIRECTED",
display={...},
distributed=TRUE | FALSE,
graph=integer,
indexOffset=integer,
links={name="table-name", caslib="string", ...},
linksVar={from="variable-name", to="variable-name", lower="variable-name", upper="variable-name", weight="variable-name", ...},
logFreqTime=integer,
logLevel="AGGRESSIVE" | "BASIC" | "MODERATE" | "NONE",
multiLinks=TRUE | FALSE,
nodes={name="table-name", ...},
nodesVar={node="variable-name", ...},
nThreads=integer,
outGraphList={name="table-name", ...},
outLinks={name="table-name", ...},
outNodes={name="table-name", ...},
outputTables={names={"string-1", ...}},
selfLinks=TRUE | FALSE,
sink="string" | double | 64-bit-integer,
source="string" | double | 64-bit-integer,
standardizedLabels=TRUE | FALSE,
standardizedLabelsOut=TRUE | FALSE;

Paramètres Clés

Nom du paramètre Description
links Spécifie la table de données d'entrée contenant les informations sur les liens (les 'tuyaux') du graphe.
source Spécifie le nœud de départ (la source) pour les calculs du flot maximum.
sink Spécifie le nœud d'arrivée (la cible ou le puits) pour les calculs du flot maximum.
linksVar Spécifie les noms des variables pour la table des liens (par exemple `from` et `to` pour les extrémités du lien, `upper` pour la capacité maximale, et `lower` pour la capacité minimale).
direction Indique si le graphe d'entrée est dirigé (`DIRECTED`) ou non dirigé (`UNDIRECTED`).
outLinks Spécifie la table de sortie qui contiendra les informations sur les liens ainsi que le flux calculé pour chaque lien.
logLevel Contrôle la quantité d'informations affichée dans le journal SAS (`NONE`, `BASIC`, `MODERATE`, `AGGRESSIVE`).

Préparation des données

Création d'un réseau de transport (Plomberie de base)

Nous allons créer une table représentant un réseau de liens avec une capacité maximale (`upper`) pour chaque tronçon. Le flux ira de 'S' (Source) vers 'T' (Target/Sink).

1DATA mycas.LinkSetIn;
2 LENGTH from $2 to $2;
3 INPUT from $ to $ upper;
4 DATALINES;
5S A 3
6S B 2
7A B 1
8A T 3
9B T 3
10;
11RUN;

Exemples d'utilisation

Calcul du flot maximum simple

Dans cet exemple, nous calculons le flux maximal possible entre la source S et le puits T. L'action s'assure qu'aucun lien ne dépasse sa limite `upper`.

1PROC CAS;
2 optNetwork.maxFlow /
3 direction="DIRECTED"
4 links={name="LinkSetIn"}
5 linksVar={from="from", to="to", upper="upper"}
6 SOURCE="S"
7 sink="T"
8 outLinks={name="LinkSetOut", replace=true};
9RUN;
10QUIT;
Résultat Attendu :
L'action retournera un résumé indiquant un flux maximum (objective) de 5. La table de sortie 'LinkSetOut' sera créée avec une nouvelle colonne 'flow' représentant la quantité de flux passant par chaque lien.
Flot maximum avec limites inférieures (lower bounds) et journalisation poussée

Un cas plus avancé %%https://go.documentation.sas.com/doc/en/pgmsascdc/v_069/casactnopt/casactnopt_optnetwork_examples.htm%% où nous définissons non seulement une capacité maximale (`upper`), mais aussi une obligation de passage minimale (`lower`). On demande également un niveau de log agressif pour observer le comportement de l'algorithme sous le capot. Idéal pour les ingénieurs réseaux les plus exigeants !

1DATA mycas.LinkSetInAdv;
2 LENGTH from $2 to $2;
3 INPUT from $ to $ lower upper;
4 DATALINES;
5S A 0 5
6S B 1 2
7A B 0 1
8A T 0 4
9B T 0 3
10;
11RUN;
12PROC CAS;
13 optNetwork.maxFlow /
14 direction="DIRECTED"
15 links={name="LinkSetInAdv"}
16 linksVar={from="from", to="to", lower="lower", upper="upper"}
17 SOURCE="S"
18 sink="T"
19 logLevel="AGGRESSIVE"
20 outLinks={name="LinkSetOutAdv", replace=true}
21 outNodes={name="NodeSetOutAdv", replace=true};
22RUN;
23QUIT;
Résultat Attendu :
Le journal SAS (`log`) affichera des informations très détaillées sur chaque itération de l'algorithme. Les tables de sortie contiendront le routage optimal garantissant le flux minimum (lower) de 1 sur le lien S->B tout en maximisant le flux global vers T.