Déclaration d'une variable avec trois indices avec ilocplex

Fermé
sonya - Modifié le 12 avril 2017 à 20:22
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 13 avril 2017 à 10:49
Bonjour,
Je suis débutante avec le cplex en utilisant le langage c
Je cherche à déclarer une variable que je vais la manipuler avec trois indices.
J'ai essayé ce code :
NumVar3Matrix X(env,nb_nodes);
 /* initialize this matrix */
 for(i=1; i<= nb_nodes; i++)
 {
  X[i] = NumVarMatrix(env, nb_nodes);
  for(j=1; j<= nb_nodes; j++) 
  {
   X[i][j] = IloNumVarArray(env, nb_commodities);
   for(k=1; k<=nb_commodities; k++) 
   {
    X[i][j][k] = IloNumVar(env, 0.0, 10000, ILOFLOAT);
   }
  }
 }
 avec: i in 1..nb_nodes
         j in 1..nb_nodes
         k in 1..nb_commodoties


Cependant le programme me génère cette erreur: ut of bounds index supperior to size of array

Pourriez-vous m'aider pour résoudre ce problème?
Merci d'avance

1 réponse

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
12 avril 2017 à 17:57
Salut,

Je ne connais pas cplex, cependant, en C, un tableau de taille "nb_nodes" est accessible par des indices allant de 0 à nb_nodes - 1

Une boucle for sur un tel tableau devrait alors s'écrire :

for(i=0; i< nb_nodes; i++) {
(...)

Pour le reste ton code est très bizarre pour moi et ne ressemble guère syntaxiquement à du C.

Dal
0
Merci pour votre réponse.
En fait, j'ai intégré le cplex avec visual studio et je cherche à écrire mon programme linéaire en utilisant l'ilocplex et le langage C.
Pour faire, il me faut déclarer une variable que je vais la manipuler avec trois indices. x[i][j][k]
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 12 avril 2017 à 19:18
si cela est du C, alors je ne comprends pas :

NumVar3Matrix X(env,nb_nodes);

si NumVar3Matrix était un type C définit avec typedef, et X un nom de variable, il ne me parait pas qu'il soit correct en C que la déclaration de cette variable soit suivie de paramètres entre parenthèses.

Cela ressemble plutôt à l'appel au constructeur d'un objet C++

en cherchant un peu sur le Net, on trouve cette doc d'IBM :

https://www.ibm.com/support/pages/node/397011

qui évoque un fichier d'exemple "facility.cpp example available in $CPLEXDIR\examples\src" qui est du C++ avec du code qui utilise les indices de tableaux correctement (c'est à dire en comptant à partir de 0), le C++ ne différant pas du C sur ce point.

Dal
0
Moi aussi j'ai consulté cet exemple et j'ai essayé de le suivre mais je ne comprend pas pourquoi ça n'a pas fonctionné.
Pourriez vous m'aider à declarer une variable de type prédefini NumVar3Matrix en C et la manipuler avec langage c aussi.
Merci d'avance.
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 12 avril 2017 à 20:01
apparemment cplex (que je connais pas) a effectivement une API C, mais ton code n'est pas en C.

Voir : https://www.ibm.com/support/knowledgecenter/SSSA5P_12.7.0/ilog.odms.studio.help/pdf/usrcplex.pdf (pages 60 et suivantes) mais la doc sur la façon d'utiliser l'API C est très spartiate.

En page 66, on confirme par ailleurs dans "Referencing ranges of objects" que "Consistent with standard C programming practices, in CPLEX an array containing k
items will contain these items in locations 0 (zero) through k-1".

Quand à "NumVar3Matrix" si c'est un type prédéfinit par cplex, il n'est pas mentionné dans cette doc... et cela n'en serait pas un, si on se fie à l'exemple dont j'ai posté le lien ci-dessus, qui le définit ainsi :

typedef IloArray<NumVarMatrix>   NumVar3Matrix;

c'est à dire un type définit par l'utilisateur (donc une sorte d'alias) sur un template C++.

pourquoi ne le fais-tu pas en C++ cela a l'air bien mieux documenté ?

si je me fie à l'exemple, et sans connaître du tout cplex, ni être en mesure de tester quoi que ce soit, cela donnerait cela en corrigeant simplement les bornes des tableaux :

NumVar3Matrix X(env,nb_nodes);
/* initialize this matrix */
for(i=0; i< nb_nodes; i++) {
    X[i] = NumVarMatrix(env, nb_nodes);
    for(j=0; j< nb_nodes; j++) {
        X[i][j] = IloNumVarArray(env, nb_commodities);
        for(k=0; k<nb_commodities; k++) {
            X[i][j][k] = IloNumVar(env, 0.0, 10000, ILOFLOAT);
        }
    }
}

Dal
0
sonya > [Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024
12 avril 2017 à 20:17
Merci pour vos réponses et l'intérêt que vous avez accordé ainsi que les fichiers que vous m'avez fournies.
J'ai déja consulté ce document et j'ai essayé de comprendre comment utiliser l'API c mais je n'arrive pas.
Il me faut travailler avec le langage c , c'est tout un projet de mémoire dont la base est codée en C.
Je vais essayer de changer les bornes et tester.
0