• Aucun résultat trouvé

Les tableaux template : la classe IloArray

9 Les tableaux dans Concert Technology

9.1 Les tableaux template : la classe IloArray

Concert Technology possède une classe template pour créer des tableaux d'objets : IloArray. Elle s'utilise dans la même logique que la classe vector de la STL. On peut l'utiliser pour créer des tableaux à plusieurs dimensions en créant des IloArray d'IloArray.

Un IloArray est toujours associé à un environnement IloEnv. Le constructeur permet d'allouer un IloArray d'une taille donnée (0 par défaut) :

public IloArray(IloEnv env, IloInt max=0)

Si la taille n'est pas connue au moment de la déclaration de l'IloArray, on peut déclarer un tableau vide (de taille 0) et le remplir par la suite à l'aide de la méthode :

public void add(X x) const

qui ajoute un élément à la fin de l'IloArray (et le redimensionne donc en conséquence - comme la méthode push_back() du vector de la STL).

L'opérateur << est surdéfini pour la classe IloArray. On peut donc afficher en une ligne de code le contenu complet d'un tableau IloArray (et de toute classe dérivant d'un IloArray).

9.2 LES TABLEAUX D'OBJETS DEJA DEFINIS

Concert Technology définit des classes "tableaux" pour chaque classe de base X qu'elle possède (elles utilisent la classe IloArray vue précédemment). La classe s'appelle alors IloArrayX ou IloXArray. Par exemple pour créer un tableau d'IloNumVar il existe la classe IloNumVarArray. Elle possède plusieurs constructeurs qui permettent de créer en une ligne un ensemble de variables (avec les mêmes caractéristiques ou avec des caractéristiques différentes). On dispose par exemple d'un constructeur qui crée un tableau de n variables ayant toutes les mêmes bornes et le même type (ILOFLOAT par défaut) :

11

public IloNumVarArray(const IloEnv env, //environnement

IloInt n, //nombre de variables a créer (= taille du tableau) IloNum lb, // borne inf (commune a toutes les variables) IloNum ub, // borne sup (commune a toutes les variables)

IloNumVar::Type type=ILOFLOAT //type (commun a toutes les var.) )

Si on souhaite imposer des bornes différentes aux variables il existe un second constructeur qui prend en paramètres un premier tableau contenant les bornes inférieures et un second tableau contenant les bornes supérieures. Il est clair que ces deux tableaux doivent avoir la même taille, taille qui sera également celle du tableau de variables créé :

public IloNumVarArray(const IloEnv env, const IloNumArray lb, const IloNumArray ub, IloNumVar::Type type=ILOFLOAT)

Par ailleurs on peut aussi, dans un premier temps, déclarer des tableaux vides et, dans un second temps, affecter une variable à chaque case du tableau. L'exemple suivant illustre cette possibilité en créant un tableau de tableaux de variables pour représenter des variables à double indices ( variables booléennes ( ) ) :

IloArray<IloNumVarArray> x_ij (env, n);

for ( int i = 0; i < n; i++ ) {

//chaque x_ij[i] est un tableau de m variables booléennes x_ij[i] = IloNumVarArray(env, m, 0.0, 1.0, ILOBOOL);

}

10 LES EXPRESSIONS NUMERIQUES DANS CONCERT TECHNOLOGY

Concert Technology dispose d'une classe très pratique pour représenter et manipuler les expressions numériques (combinaison linéaire de variables par exemple) : IloExpr. On écrit dans une IloExpr les expressions de manière naturelle :

IloNumVar x (env); // crée une variable avec les paramètres par défaut (float, >= 0) IloNumVar y (env);

IloExpr expr = x + 2*y;

On peut facilement ajouter ou retirer des termes dans une IloExpr déjà initialisée en utilisant les opéteur += et -=. Ces derniers sont très pratiques dans le cas où l'expression est construite à l'aide d'une itérative.

Il y a deux règles à respecter :

 Une IloExpr doit toujours être initialisée (avant d'utiliser un opérateur tel que += par exemple)

 Une IloExpr doit toujours être libérée en appelant la méthode end() lorsqu'on n'en a plus besoin

12

IloExpr dérive de IloNumExpr qui dérive elle-même de IloNumExprArg. On peut donc l'utiliser comme argument dans les méthodes qui attendent un argument de type IloNumExprArg comme c'est le cas par exemple pour les constructeurs d'IloRange ou d'IloObjective vus précédemment.

11 PARAMETRAGE DES ALGORITHMES

La classe IloCplex dispose d'une méthode :

public void setParam(<nom du paramètre>, <valeur du paramètre>)

qui permet de fixer la valeur des paramètres de Cplex. Il existe un grand nombre de paramètres de types différents (booléen, entier, réel, chaîne de caractères, ...), la méthode setParam est surdéfinie pour chacun. Dans le cas où aucune valeur n'a été attribuée à un paramètre via setParam() la valeur par défaut du paramètre est utilisée par Cplex.

Les paramètres sont définis dans des énumérations imbriquées dans la classe IloCplex, il faut donc toujours les préfixer par IloCplex::.

Quelques exemples d'utilisation de setParam() : //cpu max (en secondes)

cplex.setParam(IloCplex::TiLim, 10);

//desactive l'affichage lors de la résolution d'un MIP cplex.setParam(IloCplex::MIPDisplay, 0);

//limite le nombre de threads utilise par cplex (32 par défaut) cplex.setParam(IloCplex::Threads, 2);

Cplex dispose de différents algorithmes et on peut choisir lequel on souhaite utiliser. Par défaut Cplex résout le modèle courant comme un MIP, et nous autorise donc à choisir un algorithme pour la racine et un autre pour les nœuds :

void IloCplex::setParam(IloCplex::RootAlg, algo) void IloCplex::setParam(IloCplex::NodeAlg, algo)

algo est à choisir parmi l'énumération IloCplex::Algorithm :

IloCplex::AutoAlg : algorithme choisi par Cplex

IloCplex::Primal : simplexe primal

IloCplex::Dual : simplexe dual

IloCplex::Network : network simplex algorithm

IloCplex::Barrier : barrier algorithm (souvent efficace sur les grandes matrices creuses)

IloCplex::Sifting : sifting algorithm

IloCplex::Concurrent : permet a Cplex d'utiliser différents algorithmes sur les machines multiprocesseurs

13

Pour connaître l'algorithme utilisé par Cplex pour résoudre le modèle courant (si ce n'est pas un MIP) on peut utiliser la fonction :

public IloCplex::Algorithm getAlgorithm() const

12 CHRONOMÈTRE

Concert Technology dispose d'une classe IloTimer qui fonctionne comme un chronomètre. Pour l'utiliser on a besoin des trois méthodes suivantes :

//constructeur

public IloTimer(const IloEnv env) //initialise le chronometre

public IloNum start ()

//retourne le temps écoulé depuis l'appel à start() en secondes (si on est sur un environnement multithreadé, le temps des différents threads est cumulé)

public IloNum getTime () const

13 QUELQUES FONCTIONS MATHEMATIQUES DE CONCERT TECHNOLOGY

Concert Technology dispose de fonctions qui peuvent être très pratiques lors de la construction d'un modèle. On en donne ici un aperçu :

produit scalaire entre deux arrays de même taille :

public IloNumExprArg IloScalProd ( const IloNumArray values, const IloNumVarArray vars)

On remarque que cette fonction retourne une IloNumExprArg, on peut donc l'ajouter directement au modèle. Par exemple si on a initialisé un tableau de coefficients coeffs et un tableau de variables vars, on peut écrire :

model.add( IloScalProd(coeffs, vars) <= 20 )

arrondis :

o à l'entier supérieur : public IloNum IloCeil(IloNum val) o à l'entier inférieur : public IloNum IloFloor(IloNum val) o à l'entier le plus proche : public IloNum IloRound(IloNum val)

sommes :

o somme de nombres : public IloNum IloSum(const IloNumArray values)

o somme de variables : public IloNumExprArg IloSum(const IloNumVarArray exprs)

14 14 UN PROGRAMME MINIMAL

On a vu dans la première partie comment déclarer variables et contraintes. En réalité on n'est pas obligé de les déclarer explicitement (c'est surtout utile si on a besoin de les stocker pour s'en servir par la suite). On peut simplement les ajouter au modèle sous forme d'Ilo expressions comme le montre l'exemple suivant :

#include <ilcplex/ilocplex.h>

//associe le modèle a une instance d'IloCplex pour résolution IloCplex cplex(model);

cplex.exportModel("test.lp");

}

Programme généré par le code précédent :

\ENCODING=ISO-8859-1

15

0 <= x1 <= 50 0 <= x2 <= 50 0 <= x3 <= 50 End

15 RÉFÉRENCES

[1] IBM Knowledge Center, Manuel de référence en ligne

http://www-01.ibm.com/support/knowledgecenter/SSSA5P_12.6.0/ilog.odms.cplex.help/

refcppcplex/html/overview.html?cp=SSSA5P_12.6.0%2F2-8&lang=fr

[2] IBM, IBM ILOG CPLEX Optimization Studio Getting Started with CPLEX, Version 12 Release 4 http://cedric.cnam.fr/~lamberta/MPRO/ECMA/doc/Interface.pdf

[3] IBM Knowledge Center, Anatomie d'une application C++ Concert Technology

http://www-01.ibm.com/support/knowledgecenter/SSSA5P_12.6.0/ilog.odms.cplex.help/

CPLEX/GettingStarted/topics/tutorials/Cplusplus/appliAnatomy_synopsis.html?lang=fr [4] IBM Knowledge Center, La classe IloCplex

http://www-01.ibm.com/support/knowledgecenter/SSSA5P_12.6.0/ilog.odms.cplex.help/

refcppcplex/html/classes/IloCplex.html?lang=fr

Documents relatifs