C++ Cplez

cs_Matematica Messages postés 1 Date d'inscription vendredi 20 avril 2012 Statut Membre Dernière intervention 20 avril 2012 - 20 avril 2012 à 10:49
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 - 20 avril 2012 à 12:43
J'ai un fichier .lp, ou il y a mon porblème de programation lineaire. Quand j'appele le CPLEX à main pour le resoudre, ça marche très bien. Mais quand j'utilise un code en C++ pour appeler CPLEX, ça ne marche pas. Seulement le valeur de la fonction objectif est just. Les variables recevoient les valeurs bizarres.

Ci-dessous il y a le code:

#include
#include <cstdlib>
#include <string>
#include
#include <fstream>


using namespace std;





int main( int argc, char *argv[] ){

char nomlpin[30];
char fichier[30];

char * xctype;
CPXENVptr env;

CPXLPptr lp;
int statut;
double * x;
double objval;
ofstream out;

// si le nombre de parametres inseres n'est pas correct

if (argc != 2)

{

cout << "Utilisation: GenLectExec.exe <Fichier lp>\n";

return -1;

}



strcpy(nomlpin, argv[1]);

strncpy(fichier, nomlpin, strlen(nomlpin) - 2);
strcat(fichier, "Response.txt");



// Environnement Cplex

env = CPXopenCPLEX (&statut);


// Faire une liason avec le fichier .lp
lp = CPXcreateprob (env, &statut, nomlpin);

// Define objectif function type

CPXchgobjsen(env, lp, CPX_MIN) ;


// Define Prob type : LP, MILP,...

CPXchgprobtype(env, lp, CPXPROB_MILP) ;

// Lecture du fichier .lp
statut = CPXreadcopyprob (env, lp, nomlpin, NULL);
// NULL signfie que la fin du name du fichier du etre par exemple .lp


// Lance les calculs
statut = CPXmipopt (env, lp);


// Enresgistrer le valeur de la fonction objectif dans la variable objval
statut = CPXgetmipobjval (env, lp, &objval);


// CPXgetnumcols retourne la taille du problème et enregistre les valeurs des variables CPXgetmipx dans le mémoire pointé par x.
x = (double *) malloc (CPXgetnumcols(env, lp) * sizeof(double));
statut = CPXgetmipx(env,lp,x,0,CPXgetnumcols(env,lp) -1);

xctype = (char *) malloc (CPXgetnumcols(env, lp) * sizeof(char));

cout << "Nombre de variables: " << CPXgetnumcols(env, lp) << endl;
cout << "Nombre de contraintes: " << CPXgetnumrows (env, lp) << endl;

// La routine retourne 1 si c'est un MIP
cout << "Type du probleme: " << CPXgetprobtype(env, lp) << endl;

cout << "Nombre de variables du type binnaire: " << CPXgetnumbin (env, lp) << endl;
cout << "Nombre de variables du type entier: " << CPXgetnumint (env, lp) << endl;


// Accéde les types de gamme de variables
// La routine retourne 0 en cas de succès
cout << "Type variable: " << CPXgetctype(env,lp, xctype, 0,CPXgetnumcols(env,lp)-1) << endl;

// Ouvrir un fichier txt
out.open(fichier);

// Pour savoir se la mémoire de la variable x a été alloué de maniére correct
if (!x)
{
out << " Erro: Memoria Insuficiente" << endl;
}

// Ecrire les variables et la fo dans le fichier txt
for (int i = 0; i <= CPXgetnumcols(env,lp) -1; i++)

{
out << "x" << i << ": " << x[i] << endl;
}
out << "Fonction Objectif: " << objval << endl;

// Fermer le fichier txt
out.close();

return 0;

}

Matematica

1 réponse

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
20 avril 2012 à 12:43
Bonjour,

C++ n'est pas C#, ej déplace dans le bon forum.
Sinon, pour le code, lis le point 2 de ma signature.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
0
Rejoignez-nous