2017-05-08 2 views
0

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.

Répondre

1

L'implémentation PH dans PySP prend en charge un certain niveau de personnalisation grâce à l'utilisation d'extensions définies par l'utilisateur. Ce sont des classes que vous pouvez implémenter et dont les méthodes sont appelées par PH à différents points de l'algorithme. Vous pouvez indiquer à PH d'utiliser une extension en définissant l'option de ligne de commande "--user-defined-extension" dans un fichier contenant une implémentation. Un certain nombre d'exemples peuvent être trouvés here (recherchez les fichiers qui contiennent IPHExtension et copiez ce qu'ils font).

Malheureusement, il n'y a pas de code spécifique qui rendra ce que vous voulez faire facile. Vous devrez regarder le code source pour voir comment PH met à jour et gère ces paramètres d'objectif (voir ph.py pour cela et voir où différentes méthodes d'extension sont appelées dans l'algorithme).

+0

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! –