Recherche Opérationnelle: Modélisation avec MOSEL
Transcription
Recherche Opérationnelle: Modélisation avec MOSEL
Recherche Opérationnelle: Modélisation avec MOSEL Pierre Bonami [email protected] (copie des transparents et supports de cours disponibles à: http://pageperso.lif.univ-mrs.fr/ pierre.bonami/Teaching.html) 7 novembre 2012 Plan d’aujourd’hui Modélisation d’un problème par la programmation linéaire Mosel Résolution d’un premier programme linéaire avec MOSEL Améliorer le modèle Programme Linéaire max / min n X c i xi i=1 sous les contraintes : n ≤ X aij xi = bj , i=1 ≥ l ≤ x ≤ u, x ∈ Rn . j = 1, . . . , m Programme Linéaire max / min n X c i xi i=1 sous les contraintes : n ≤ X aij xi = bj , i=1 ≥ l ≤ x ≤ u, x ∈ Rn . I Variables de décisions (bornées ou non). j = 1, . . . , m Programme Linéaire max / min n X c i xi i=1 sous les contraintes : n ≤ X aij xi = bj , i=1 ≥ l ≤ x ≤ u, x ∈ Rn . I I Variables de décisions (bornées ou non). Des constantes j = 1, . . . , m Programme Linéaire max / min n X c i xi i=1 sous les contraintes : n ≤ X aij xi = bj , i=1 ≥ l ≤ x ≤ u, x ∈ Rn . I I I Variables de décisions (bornées ou non). Des constantes Fonction objectif. j = 1, . . . , m Programme Linéaire max / min n X c i xi i=1 sous les contraintes : n ≤ X aij xi = bj , i=1 ≥ l ≤ x ≤ u, x ∈ Rn . I I I I Variables de décisions (bornées ou non). Des constantes Fonction objectif. Contraintes. j = 1, . . . , m Programme Linéaire max / min n X c i xi i=1 sous les contraintes : n ≤ X aij xi = bj , i=1 ≥ l ≤ x ≤ u, x ∈ Rn . I I I I I j = 1, . . . , m Variables de décisions (bornées ou non). Des constantes Fonction objectif. Contraintes. Les relations entre les variables sont linéaires. Un problème La compagnie Pluton fabrique deux types de barres chocolatées : “pluton base” et “pluton extra”. Pour faire 100 barres de “pluton base” il faut 3 kilos de sucre et 1 kilo de chocolat. Pour faire 100 barres de “pluton extra”, il faut 2 kilos de sucre et 3 kilos de chocolat. Le profit réalisé est de 5 euros pour 100 barres de “pluton base”, et de 10 euros pour 100 barres de “pluton extra”. Nous avons en stock 160 kilos de sucre et 200 kilos de chocolat. Combien doit on produire de barres de chaque type pour maximiser le profit ? Des questions à se poser I Quelle décision doit on prendre ? Quelles sont les variables qui déterminent ces décisions ? I Quelles sont les quantités constantes du problème ? I Quelle est la fonction objectif ? I Des contraintes portent-elles sur les variables et quelles sont les relations entre les variables ? I Ces relations sont elles représentables par des relations linéaires ? I Des questions à se poser I Quelle décision doit on prendre ? Produire, vendre, acheter,. . . Quelles sont les variables qui déterminent ces décisions ? I Quelles sont les quantités constantes du problème ? I Quelle est la fonction objectif ? I Des contraintes portent-elles sur les variables et quelles sont les relations entre les variables ? I Ces relations sont elles représentables par des relations linéaires ? I Des questions à se poser I Quelle décision doit on prendre ? Produire, vendre, acheter,. . . Quelles sont les variables qui déterminent ces décisions ? des quantités à produire, à transporter Quelles sont les quantités constantes du problème ? I Quelle est la fonction objectif ? I Des contraintes portent-elles sur les variables et quelles sont les relations entre les variables ? I Ces relations sont elles représentables par des relations linéaires ? I I Des questions à se poser I I I I Quelle décision doit on prendre ? Produire, vendre, acheter,. . . Quelles sont les variables qui déterminent ces décisions ? des quantités à produire, à transporter Quelles sont les quantités constantes du problème ? Les ressources, les coûts unitaires, les temps de fabrication unitaires,. . . Quelle est la fonction objectif ? I Des contraintes portent-elles sur les variables et quelles sont les relations entre les variables ? I Ces relations sont elles représentables par des relations linéaires ? Des questions à se poser I I I I I I Quelle décision doit on prendre ? Produire, vendre, acheter,. . . Quelles sont les variables qui déterminent ces décisions ? des quantités à produire, à transporter Quelles sont les quantités constantes du problème ? Les ressources, les coûts unitaires, les temps de fabrication unitaires,. . . Quelle est la fonction objectif ? en général minimiser le coût, maximiser le revenu ou le profit, minimiser le temps d’exécution d’un processus Des contraintes portent-elles sur les variables et quelles sont les relations entre les variables ? Ces relations sont elles représentables par des relations linéaires ? Des questions à se poser I I I I I I Quelle décision doit on prendre ? Produire, vendre, acheter,. . . Quelles sont les variables qui déterminent ces décisions ? des quantités à produire, à transporter Quelles sont les quantités constantes du problème ? Les ressources, les coûts unitaires, les temps de fabrication unitaires,. . . Quelle est la fonction objectif ? en général minimiser le coût, maximiser le revenu ou le profit, minimiser le temps d’exécution d’un processus Des contraintes portent-elles sur les variables et quelles sont les relations entre les variables ? des ressources limités, un ordre d’exécution à respecter,. . . Ces relations sont elles représentables par des relations linéaires ? Des questions à se poser I I I I I I Quelle décision doit on prendre ? Produire, vendre, acheter,. . . Quelles sont les variables qui déterminent ces décisions ? des quantités à produire, à transporter Quelles sont les quantités constantes du problème ? Les ressources, les coûts unitaires, les temps de fabrication unitaires,. . . Quelle est la fonction objectif ? en général minimiser le coût, maximiser le revenu ou le profit, minimiser le temps d’exécution d’un processus Des contraintes portent-elles sur les variables et quelles sont les relations entre les variables ? des ressources limités, un ordre d’exécution à respecter,. . . Ces relations sont elles représentables par des relations linéaires ? Dans ce cours, oui toujours ! Mais des fois il faut être malin. Dans le reste du monde peut-être pas, mais en étant malin. . . Pluton suite... La compagnie Pluton fabrique deux types de barres chocolatées : “pluton base” et “pluton extra”. Pour faire 100 barres de “pluton base” il faut 3 kilos de sucre et 1 kilo de chocolat. Pour faire 100 barres de “pluton extra”, il faut 2 kilos de sucre et 3 kilos de chocolat. Le profit réalisé est de 5 euros pour 100 barres de “pluton base”, et de 10 euros pour 100 barres de “pluton extra”. Nous avons en stock 160 kilos de sucre et 200 kilos de chocolat. Combien doit on produire de barres de chaque type pour maximiser le profit ? Réponses I I I I I I Quelle décision doit on prendre ? Établir un programme de production des barres chocolatées. Quelles sont les variables qui déterminent ces décisions ? Les quantités (positives !) à produire de chaque type de barre. Quelles sont les quantités constantes du problème ? La quantité totale de sucre, de chocolat. Les quantités de sucre et de chocolat pour produire chaque type de barre. Le profits pour 100 barres de chaque type. Quelle est la fonction objectif ? Maximiser le profit. Des contraintes portent-elles sur les variables et quelles sont les relations entre les variables ? Respecter les contraintes de ressources en sucre et chocolat. Ces relations sont elles représentables par des relations linéaires ? On a dit, oui toujours ! Le programme de Pluton I I Soit x1 le nombre de barres bases à produire (en 100aine). Soit x2 le nombre de barres extras à produire (en 100aine). max 5x1 + 10x2 sous les contraintes : 3x1 + 2x2 ≤ 160 1x1 + 3x2 ≤ 200 0 ≤ x1 , 0 ≤ x2 . Langages de modélisation programmation mathématique I I I I Interfaces vers les logiciels de résolutions. But : Permettre d’écrire naturellement un programme mathématique en vue de le résoudre avec un logiciel (solveur). Avantages : prototypage rapide d’applications, détections d’erreurs dans le modèle, interfaces intuitives. Pour la programmation linéaires de nombreux languages : I I I propriétaires : Ampl 1, Gams1, Osl, Mosel, Concert (C++),. . . libres : GnuMathProg, zimpl, pulp (python), flopC++ (C++),. . . Interfacés avec un (des) solveur(s) I I propriétaires (payants) : Cplex, XpressMP, Mosek.. . . libres (gratuits) : GLPK, Clp.. . . 1. Permet aussi de modéliser des problèmes non-linéaires Mosel Langage de Modélisation crée par Yves Colombani & Susanne Heipcke 2. Aujourd’hui vendu par la société FICO 3. Interface avec le solveur XpressMP. Ressources web : I Tutoriel : http://brblog.typepad.com/files/mosel WP.pdf I Manuel utilisateur :http://iem.okstate.edu/baski/IEM4013/moselug.pdf I Manuel de référence :http://home.dei.polimi.it/malucell/didattica/appunti/mosel/ language reference.pdf Livre : I Applications of Optimization with Xpress-MP , Dash Optimization, 2002. 2. Anciens étudiants Luminy 3. www.fico.com Le minimum en Mosel Démarrer->Tous les programmes->FICO->Xpress IVE File->New Initialisation model Nom du model uses ‘‘mmxprs’’; Déclarations Toutes les variables de décision et données doivent être déclarées dans : declarations !... end-declarations Quelque commandes I I I end-model termine le model. . . writeln permet de faire des sorties. minimize/maximimize minimise/maximise un objectif. Syntaxe I I I Affectation avec := (sauf dans les déclarations). Contraintes d’égalité = ! Commence une ligne de commentaires Déclarer une variable On déclare une variable/donnée avec : nom : type ; Types principaux : real, string, integer, mpvar(variable de décision), linctr (expression linéaire). Exemple : x1: mpvar; x2: mpvar; Le retour de pluton model Pluton uses "mmxprs"; declarations x1 : mpvar; x2 : mpvar; Objective:linctr end-declarations Objective:= 5 * x1 + 10 * x2; 3*x1+2*x2 <= 160; x1 + 3* x2 <= 200; maximize(Objective); end-model Améliorer les sorties Pour accéder au résultats on peut utiliser les fonctions : I getobjval qui donne la valeur optimale ; I getsol(x1) qui donne la valeur de la variable x1 à l’optimum. En combinant avec writeln on peut faire une sortie raisonnable : writeln(‘‘On doit produire ’’,getsol(x1)*100,‘‘ barres bases et ’’,getsol(x2)*100, ‘‘ barres extras.’’); writeln(‘‘Le profit réalisé sera ’’,getobjval, ‘‘ euros’’.); Modèle → http://pageperso.lif.univ-mrs.fr/ pierre.bonami/MASS/Pluton.mos Améliorer la présentation du modèle I I I I I But séparer le modèle des données Le modèle est formulé de manière algébrique, abstraite. Les donnés sont concrètes et mécaniques. Quand la taille des problèmes augmente, il devient vite avantageux d’extraire le modèle des données. Que se passe-t-il si demain : 1. La quantité de sucre change ? 2. Un nouvel ingrédient entre dans la fabrication ? 3. Un nouvelle barre chocolatée est vendue ? I Dans tous ces cas, on devra changer les données mais pas le modèle. Ensembles, tableaux, . . . On les déclare entre declarations . . . end-declarations. Ensembles Il servent essentiellement à indexer. Il peuvent être : I Un intervalle d’entiers consécutifs : {1, 2, 3, 4, 5} : I = 1..5. I Un ensemble de chaines de caractères : S = { ‘‘base’’,‘‘extra’’}. On peut différer leur définition après la déclaration (ensembles dynamiques) : I Ensemble d’entiers : I : set of integer; I Ensemble de chaines de caractères : S : set of string; Ensembles, tableaux, . . . (suite) Tableaux Ils sont indexés par des ensembles (qui doivent avoir été déclarés au préalable). I Tableau unidimensionnel : A1 : array(1..3) of real; A2 : array(S) of integer; I Tableau bi-dimensionnel : A3: array(S,1..2) of real; (si S est déjà spécifié le tableau sera statique sinon il sera dynamique.) Pour accéder aux éléments du tableau on fait avec des parenthèses : I A(1), A(2), I x(“base”), x(“extra”). Initialisation des données dynamiques Deux méthodes : I Directement dans le fichier de modèle. I Dans un fichier .dat séparé. Initialisation des données dynamiques Deux méthodes : I Directement dans le fichier de modèle. I Dans un fichier .dat séparé. Dans le même répertoire que le fichier de modèle, créer un fichier d’extension .dat où seront stockées les données. Ce fichier sera lu dans le modèle dans un bloque : initializations from ‘‘fichier.dat’’ ... end-initializations Initialisations dans un fichier externe (conseillé) Hélas la syntaxe est différente, l’affectation est faite par ” :” I Donner une valeur à un real : r : 0.5 I Initialiser un tableau unidimensionnel (dont on connait les indices et la taille) : A1 : [1.2 3.4 2.3] ! A1 : array(1..3) of real; I Initialiser un ensemble : S : [‘‘bleu’’ ‘‘jaune’’] ! S: set of string;. I Initialiser un tableau unidimensionnel indexé par des string : A2 : [(‘‘bleu’’) 1 (‘‘jaune’’) 3]! A2 : array(S) of integer; I Initialiser un tableau multidimensionnel : A3 : [ (‘‘bleu’’ 1) 1.1 (‘‘jaune’’ 1) 1.7 (‘‘bleu’’ 2) 2.3 (‘‘jaune’’ 2) 4.3] ! A3 : array(S,1..2) of real; A nouveau Fichier data.dat A1 : [1.2 3.4 2.3] A2 : [(‘‘bleu’’) 1 (‘‘jaune’’) 3] A3 : [ (‘‘bleu’’ 1) 1.1 (‘‘jaune’’ 1) 1.7 (‘‘bleu’’ 2) 2.3 (‘‘jaune’’ 2) 4.3] Commandes dans le modèle initializations from ‘‘data.dat’’ r A1 S A2 A3 end-initializations Sommer, répéter, itérer I I I I Sommer sur un ensemble S prédéfini : sum(i in S) Sommer avec une condition : sum(i in S |i <> 0) Sommer sur deux ensembles S1 et S2 : sum(i in S1, j in S2) Répéter sur un ensemble : forall( i in S) Par exemple on peut définir un ensemble de contraintes : forall(i in S) sum(j in S2) a(i,j)*x(j) <= b(s). Retour à Pluton On peut maintenant définir des ensembles et des tableaux pour séparer les données du modèle. model Pluton uses "mmxprs"; declarations x1 : mpvar; x2 : mpvar; Objective:linctr end-declarations Objective:= 5 * x1 + 10 * x2; 3*x1+2*x2 <= 160; x1 + 3* x2 <= 200; maximize(Objective); end-model Données Données I L’ensemble des barres produites : {“base”, “extra”}. Données I I L’ensemble des barres produites : {“base”, “extra”}. L’ensemble des ingrédients : {“chocolat”, “sucre”}. Données I I I L’ensemble des barres produites : {“base”, “extra”}. L’ensemble des ingrédients : {“chocolat”, “sucre”}. Un tableau de variables de décision indexé par l’ensemble des barres Données I I I I L’ensemble des barres produites : {“base”, “extra”}. L’ensemble des ingrédients : {“chocolat”, “sucre”}. Un tableau de variables de décision indexé par l’ensemble des barres Un tableau bi-dimensionnel des quantités d’ingrédients nécessaires pour produire chaque barre. Données I I I I I L’ensemble des barres produites : {“base”, “extra”}. L’ensemble des ingrédients : {“chocolat”, “sucre”}. Un tableau de variables de décision indexé par l’ensemble des barres Un tableau bi-dimensionnel des quantités d’ingrédients nécessaires pour produire chaque barre. Un tableau unidimensionnel des quantités disponibles et des profits. Fichier données pour Pluton : http://pageperso.lif.univ-mrs.fr/ pierre.bonami/MASS/Pluton.dat. Fichier modèle amélioré : http://pageperso.lif.univ-mrs.fr/ pierre.bonami/MASS/Pluton2.mos