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.
| Paramètre | Description |
|---|---|
| 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. |
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.
| 1 | DATA LinkData; |
| 2 | INPUT from $ to $ capacity weight upper; |
| 3 | DATALINES; |
| 4 | 1 4 15 1 20 |
| 5 | 2 1 10 2 20 |
| 6 | 2 3 10 1 20 |
| 7 | 2 6 10 6 20 |
| 8 | 3 4 5 1 20 |
| 9 | 3 5 10 2 20 |
| 10 | 3 7 10 1 20 |
| 11 | 4 5 10 3 20 |
| 12 | 4 8 10 4 20 |
| 13 | 5 6 20 2 20 |
| 14 | 5 7 10 1 20 |
| 15 | 5 8 10 3 20 |
| 16 | 6 8 10 1 20 |
| 17 | 7 8 15 2 20 |
| 18 | ; |
| 19 | DATA NodeData; |
| 20 | INPUT node lower; |
| 21 | DATALINES; |
| 22 | 1 10 |
| 23 | 2 20 |
| 24 | 8 -30 |
| 25 | ; |
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.
| 1 | PROC 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; |
| 13 | QUIT; |