2017-06-27 2 views
0

Je veux résoudre un problème simple de programmation d'entiers pour la planification avec IBM ILOG CPLEX et mon code entier est ci-dessous.Solutions ne satisfaisant pas certaines contraintes

Sous des données spécifiques, la solution avec l'objectif 11,306 est trouvée mais certaines solutions ne satisfont pas la contrainte spécifique, ct2. Je me demande si CPLEX est considéré comme une solution optimale même s'il ne répond pas à certaines contraintes, ou y a-t-il un problème avec mon codage? Si vous avez besoin, je peux vous envoyer les données. Je voulais joindre les données sur ce post, mais je ne pouvais pas trouver un moyen.

Espérons vraiment que je peux obtenir une réponse ici.

int NbGroup = ...; 
int NbAutoclave = ...; 
int NbTimeslot = ...; 
range Group = 1..NbGroup; 
range Autoclave = 1..NbAutoclave; 
range Timeslot = 1..NbTimeslot; 
int MonthlyProduct[Group] = ...; 
int CycleTime[Group][Timeslot] = ...; 
int CureTime[Group] = ...; 
int Compatibility[Group][Autoclave] = ...; 



dvar int Assign[Group][Autoclave][Timeslot] in 0..1; 


minimize 
    sum(g in Group, a in Autoclave, t in Timeslot) t * Assign[g][a][t]; 



subject to { 


forall (g in Group) 
    ct1: 
    sum(a in Autoclave, t in Timeslot) 
     Compatibility[g][a] * Assign[g][a][t] == MonthlyProduct[g]; 


forall (g in Group) 
forall (t in 1..NbTimeslot:t in (1..NbTimeslot-CycleTime[g][t]+1)) 
    ct2: 
    sum(a in Autoclave, cy in 1..CycleTime[g][t]) 
     Compatibility[g][a] * Assign[g][a][t+cy-1] <= 1;     


forall(a in Autoclave, t in Timeslot) 
    ct3: 
    sum(g in Group, cu in 1..CureTime[g]: t-cu+1 in Timeslot) 
     Compatibility[g][a] * Assign[g][a][t-cu+1] <= 1; 


    ct4: 
    sum(g in Group, a in 1..1, t in 1..7) 
     Assign[g][a][t] == 0; 

    ct5: 
    sum(g in Group, a in 2..2, t in 1..6) 
     Assign[g][a][t] == 0; 


//to fix some solutions 

Assign[9][1][23]==1; 
Assign[9][1][95]==1; 
Assign[9][1][143]==1; 
Assign[9][1][167]==1; 
Assign[9][1][239]==1; 
Assign[9][1][287]==1; 
Assign[9][1][311]==1; 


} 


tuple SolutionT{ 
    int a; 
    int b; 
    int c; 
    int d; 
}; 
{SolutionT} Solution = {<a0,b0,c0,Assign[a0][b0][c0]> | a0 in Group, b0 in Autoclave, c0 in Timeslot}; 
execute{ 
    writeln(Solution); 
} 

Répondre

0
+0

Juste pour ajouter une précision - CPLEX ne * pas * générer des « solutions » qui violent les contraintes à moins qu'ils ne soient autorisés spécifiquement être détendu dans d'une certaine façon par le programmeur (sous réserve de tolérances, etc.). Si l'ensemble des valeurs des variables de décision ne satisfait pas à toutes les contraintes, alors ce n'est PAS une solution, quelle que soit la valeur objective. – TimChippingtonDerrick