2017-05-15 4 views
0

Je souhaite résoudre le problème MILP avec CPLEX-C#. La taille de mon problème est grande et afin d'améliorer le temps CPU, je veux utiliser la solution initiale. Je veux ajouter cette solution dans cplex et commencer à résoudre le problème avec cette solution initiale donnée. J'utilisé le code suivant:Démarrez le CPLEX avec une solution initiale donnée sur C# (technologie Concert)

 try 
     { 
      startvar = new INumVar[numberOfAllNode * numberOfAllNode]; 
      startval = new double[numberOfAllNode * numberOfAllNode]; 

      for (int i = 0, idx = 0; i < numberOfAllNode; i++) 
       for (int j = 0; j < numberOfAllNode; j++) 
       { 
        startvar[idx] = X[i][j]; 
        startval[idx] = start[i][j]; 
        idx++; 
       } 

      startvar = null; 
      startval = null; 

      cplex.AddMIPStart(startvar, startval,Cplex.MIPStartEffort.SolveMIP); 

     } 
    catch (ILOG.Concert.Exception) 
     { 
      throw; 
     } 

Dans ce code Je variables de décision de tableau multidimensionnel X[i][j] (variables de décision binaire) et les valeurs sont égales à start[i][j]. Les valeurs de start[i][j] sont stockées sous la forme double [] array en tant que paramètre. Quand je lance le code, les erreurs suivantes sont apparues:

Warning: No solution found from 1 MIP starts. 

Root node processing (before b&c): 
    Real time    = 5.07 sec. (2238.50 ticks) 
Parallel b&c, 4 threads: 
    Real time    = 0.00 sec. (0.00 ticks) 
    Sync time (average) = 0.00 sec. 
    Wait time (average) = 0.00 sec. 
          ------------ 
Total (root+branch&cut) = 5.07 sec. (2238.50 ticks) 
Couldn't Solve The Problem! 

J'ai deux questions: 1) dans lequel une partie du modèle que je dois mettre ce code? (Je veux dire, après les toutes les contraintes et ajouter de la valeur objective et d'appeler addMin ou ADDmax ou devant eux?)

2) Quand je félicite à startvar = null; startval = null; je l'erreur suivante:

An unhandled exception of type 'ILOG.CPLEX.Cplex.UnknownObjectException' occurred in CPLEX.exe 

Additional information: CPLEX Error: object is unknown to IloCplex 

Je vous serais reconnaissant si vous pouviez aider à gérer ce problème.

Répondre

0

Très similaire à Error in using addMIPStart() in CPLEX C++ mais en C#.

J'appellerais normalement le AddMIPStart() à la fin du modèle, juste avant le solve(). C'est (pour moi) l'endroit «naturel» pour mettre l'appel. S'il existe des variables dans votre modèle qui ne sont mentionnées dans aucune contrainte ou objectif, alors CPLEX extrait le modèle interne des expressions Concert etc., il ne les inclura pas dans son modèle interne. Ensuite, si vous essayez de définir une valeur pour ces variables, CPLEX ne les reconnaîtra pas. Je vérifierais pour voir que toutes les variables dans votre début de MIP sont réellement incluses quelque part dans vos contraintes ou objectifs.

+0

Merci pour votre réponse. Mon problème a 3 variables de décision (2 binaires et 1 continue) dans mon MIPSTART je donne la valeur seulement pour l'un d'entre eux (X [i] [j]). Ai-je besoin de mettre les valeurs initiales pour les deux autres variables? –

+0

Je ne pense pas que vous devez fournir des valeurs pour toutes vos variables. L'erreur que vous avez signalée est ce que vous obtenez si vous essayez de fournir une valeur mipstart pour une variable qui n'est pas dans votre modèle. Aussi, comment pouvez-vous avoir seulement 2 binaires et 1 variable continue - le nombre de variables dans votre code devrait être un nombre carré, c'est-à-dire numberOfAllNode * numberOfAllNode. Quelle est la taille de numberOfAllNode? – TimChippingtonDerrick