optNetwork

minCostFlow

Description

L'action `minCostFlow` calcule le flot à coût minimum d'un graphe. C'est un problème fondamental en optimisation de réseau, avec des applications variées comme la logistique, la planification de production, et les télécommunications. Elle permet de déterminer la manière la plus économique de transporter des biens d'un ensemble de points d'offre (sources) à un ensemble de points de demande (puits), tout en respectant les capacités des arcs et les contraintes de flot des nœuds.

optNetwork.minCostFlow <result=results> <status=rc> / deterministic=TRUE | FALSE, direction="DIRECTED" | "UNDIRECTED", display={...}, distributed=TRUE | FALSE, graph=integer, indexOffset=integer, links={...}, linksVar={...}, logFreq=integer, logFreqTime=integer, logLevel="AGGRESSIVE" | "BASIC" | "MODERATE" | "NONE", maxTime=double, multiLinks=TRUE | FALSE, nodes={...}, nodesVar={...}, nThreads=integer, outGraphList={...}, outLinks={...}, outNodes={...}, outputTables={...}, selfLinks=TRUE | FALSE, standardizedLabels=TRUE | FALSE, standardizedLabelsOut=TRUE | FALSE, timeType="CPU" | "REAL";
Paramètres
ParamètreDescription
deterministic Lorsque défini sur True, assure que chaque invocation (avec la même configuration machine et les mêmes paramètres) produit le même résultat final.
direction Spécifie si le graphe d'entrée doit être considéré comme orienté ou non orienté.
display Spécifie une liste de tables de résultats à envoyer au client pour affichage.
distributed Lorsque défini sur True, utilise un graphe distribué pour le calcul.
graph Spécifie le graphe en mémoire à utiliser.
indexOffset Spécifie le décalage d'index pour les identifiants dans les journaux et les tables de résultats.
links Spécifie la table de données d'entrée qui contient les informations sur les liens du graphe.
linksVar Spécifie les noms des variables de données pour la table des liens.
logFreq Spécifie la fréquence d'affichage des journaux d'itération pour les calculs de flot à coût minimum qui utilisent l'algorithme du simplexe de réseau.
logFreqTime Contrôle la fréquence (en secondes) d'affichage des journaux d'itération pour certains algorithmes.
logLevel Contrôle la quantité d'informations affichées dans le journal SAS.
maxTime Spécifie la durée maximale que l'algorithme peut utiliser.
multiLinks Lorsque défini sur True, inclut les liens multiples lors de la lecture d'un graphe d'entrée.
nodes Spécifie la table de données d'entrée qui contient les informations sur les nœuds du graphe.
nodesVar Spécifie les noms des variables de données pour la table des nœuds.
nThreads Spécifie le nombre maximal de threads à utiliser pour le traitement multithread.
outGraphList Spécifie la table de données de sortie pour contenir les informations sommaires sur les graphes en mémoire.
outLinks Spécifie la table de données de sortie pour contenir les informations sur les liens du graphe ainsi que les résultats des algorithmes.
outNodes Spécifie la table de données de sortie pour contenir les informations sur les nœuds du graphe ainsi que les résultats des algorithmes.
outputTables Liste les noms des tables de résultats à sauvegarder comme tables CAS sur le serveur.
selfLinks Lorsque défini sur True, inclut les liens réflexifs (boucles) lors de la lecture d'un graphe d'entrée.
standardizedLabels Lorsque défini sur True, spécifie que les données du graphe d'entrée sont dans un format standardisé.
standardizedLabelsOut Lorsque défini sur True, demande que les données du graphe de sortie incluent un format standardisé.
timeType Spécifie s'il faut utiliser le temps CPU ou le temps réel pour la limite de temps maximale.
Préparation des Données Voir la fiche de ce code dataprep
Création des jeux de données d'entrée

Cet exemple illustre comment calculer le flot à coût minimum pour un graphe orienté simple. Les jeux de données d'entrée, `LinkData` et `NodeData`, définissent les liens avec leurs capacités et coûts, ainsi que les demandes (ou offres) des nœuds.

Copié !
1DATA LinkData;
2 INPUT from $ to $ capacity weight upper;
3 DATALINES;
41 4 15 1 20
52 1 10 2 20
62 3 10 1 20
72 6 10 6 20
83 4 5 1 20
93 5 10 2 20
103 7 10 1 20
114 5 10 3 20
124 8 10 4 20
135 6 20 2 20
145 7 10 1 20
155 8 10 3 20
166 8 10 1 20
177 8 15 2 20
18;
19DATA NodeData;
20 INPUT node lower;
21 DATALINES;
221 10
232 20
248 -30
25;

Exemples

Cet exemple montre comment résoudre un problème de flot à coût minimum. Il utilise les tables `LinkData` et `NodeData` pour définir la structure du réseau, les capacités, les coûts et les demandes/offres des nœuds. L'objectif est de satisfaire la demande du nœud puits '8' à partir de l'offre des nœuds sources '1' et '2' au coût le plus bas possible.

Code SAS® / CAS Code en attente de validation par la communauté
Copié !
1PROC CAS;
2 LOADACTIONSET "optNetwork";
3 ACTION optNetwork.minCostFlow /
4 links={name='LinkData'}
5 nodes={name='NodeData'}
6 outLinks={name='OutLinks', replace=true}
7 outNodes={name='OutNodes', replace=true};
8 RUN;
9 ACTION TABLE.fetch / TABLE='OutLinks';
10 RUN;
11 ACTION TABLE.fetch / TABLE='OutNodes';
12 RUN;
13QUIT;
Résultat :
L'action génère plusieurs tables de sortie. Le résumé du problème et de la solution indique que la solution est optimale avec un coût total de 150. Les tables 'OutLinks' et 'OutNodes' détaillent le flot optimal sur chaque arc et le potentiel de chaque nœud, qui sont les variables duales associées aux contraintes de conservation du flot.

FAQ

À quoi sert l'action `minCostFlow` ?
Quelles sont les tables de données d'entrée requises par cette action ?
Quelles tables de sortie sont produites par l'action `minCostFlow` ?
Comment spécifier si le graphe est orienté ou non orienté ?
Comment définir les limites de capacité et les coûts sur les liens ?