Je voudrais utiliser le framework Pyomo de Pyomo pour effectuer une optimisation stochastique. Dans ce modèle, j'ai certaines variables qui doivent être les mêmes pour tous les scénarios (c'est-à-dire, les variables de nœud racine standard). Dans le cadre de l'approche Progressive Hedging, PySP crée un lagrangien augmenté, dont les multiplicateurs sont ajustés de façon itérative jusqu'à ce que toutes ces variables soient égales entre les scénarios. Tout va bien jusqu'ici. Mais j'ai aussi quelques contraintes qui doivent être appliquées sur une base de valeur attendue. Dans la forme extensive, ceux-ci ressemblent à ceci:Puis-je ajouter un terme au calcul lagrangien dans Pyomo/PySP?
sum(probability[s] * use[s] for s in scenarios) == resource
Cette contrainte pourrait compliquer être factoriser avec une relaxation lagrangienne. Cela nécessiterait l'ajout d'un terme comme celui-ci à la fonction objectif principal (qui deviendrait alors une partie de la fonction objective de chaque scénario):
(
lambda * (sum(probability[s] * use[s] for s in scenarios) - resource)
+ mu/2 * (sum(probability[s] * use[s] for s in scenarios) - resource)**2
)
Ceci est très similaire aux termes Lagrangiennes pour les contraintes de nonanticipativity qui sont déjà dans la fonction objective principale. À chaque itération, le cadre PySP met automatiquement à jour les multiplicateurs pour les termes de non-participation et ensuite propage leurs valeurs dans les scénarios individuels. Donc, ma question est la suivante: y a-t-il un moyen d'ajouter mes termes au lagrangien standard géré par PySP, et de mettre à jour automatiquement mes multiplicateurs avec les siens? Cela ne me dérange pas de faire de gros efforts, mais je ne trouve pas de documentation détaillée sur la façon dont PySP est mis en œuvre, donc je ne sais pas par où commencer.
Merci pour ces pointeurs! 'ph.py' a beaucoup de choses à faire, mais j'ai fini par comprendre que je peux le faire en créant un plugin qui place' ph._ph_weight_updates_enabled' à 'False' pendant 'post_iteration_0_solves', puis calcule des valeurs pour tous les poids dans 'post_asynchronous_var_w_update' ou' post_iteration_k_solve_solves'. (Cela devra reproduire l'effet de 'ph.ProgressiveHedging.update_weights' et/ou' ph.ProgressiveHedging.update_weights_for_scenario'.) Le plugin 'exsteincombettesextension.py' en donne un exemple. On dirait un travail difficile, mais j'y arriverai éventuellement! –