Originally posted by: Domi.fl
Hi,
When running the code, Cplex indicates an error "5002: objective is not convex". I tried several ways to fix it but nothing works. Could someone please take a look?
{string} standorte = ...;
{string} lieferanten = ...;
{string} anlagen = ...;
{string} kunden = ...;
{string} endprodukte = ...;
{string} rohstoffe = ...;
//Parameter
float distanceS[standorte][lieferanten] = ...;
float vorkommen[lieferanten][rohstoffe] = ...;
float preis[standorte][rohstoffe] = ...;
float investition[anlagen] = ...;
float varKosten[anlagen] = ...;
float fixkosten[anlagen] = ...;
float kapazitaet[anlagen] = ...;
float distanceK[kunden][standorte] = ...;
float bedarf[kunden][endprodukte] = ...;
float umsatzE[endprodukte] = ...;
float anteilE[endprodukte][rohstoffe] = ...;
int maxTrans = ...;
//Entscheidungsvariablen
dvar int+ X[standorte][kunden][endprodukte]; //AM
dvar int+ Y[standorte][lieferanten][rohstoffe]; //BM
dvar int+ A[standorte];
dvar int+ B[standorte];
dvar int+ C[standorte];
//Zielfunktion
dexpr float umsatz = sum(s in standorte, k in kunden, e in endprodukte) X[s][k][e] * umsatzE[e];
dexpr float anlagenKosten = sum(s in standorte, a in anlagen) (fixkosten[a] + investition[a]) * A[s] + sum(s in standorte, a in anlagen)(fixkosten[a] + investition[a]) * B[s] + sum(s in standorte, a in anlagen)(fixkosten[a] + investition[a]) * C[s];
dexpr float beschaffungskosten = sum(s in standorte, l in lieferanten, r in rohstoffe) Y[s][l][r] * preis[l][r];
dexpr float transportkosten = sum(s in standorte, l in lieferanten, r in rohstoffe) (Y[s][l][r] / maxTrans) * (distanceS[s][l] * 2.2) +
sum(s in standorte, k in kunden, e in endprodukte) (X[s][k][e] / maxTrans) * (distanceK[k][s] * 2.2);
dexpr float verarbeitungskosten = sum(s in standorte, l in lieferanten, a in anlagen, r in rohstoffe) Y[s][l][r] * varKosten[a] * A[s] +
sum(s in standorte, l in lieferanten, a in anlagen, r in rohstoffe) Y[s][l][r] * varKosten[a] * B[s] +
sum(s in standorte, l in lieferanten, a in anlagen, r in rohstoffe) Y[s][l][r] * varKosten[a] * C[s];
dexpr float gesamtkosten = anlagenKosten + beschaffungskosten + transportkosten + verarbeitungskosten;
maximize umsatz - gesamtkosten;
subject to {
Nachfragebedingung:
forall(k in kunden, e in endprodukte)
sum(s in standorte) X[s][k][e] == bedarf[k][e];
Auslieferungsbeschraenkung:
forall(s in standorte, e in endprodukte, r in rohstoffe)
sum(k in kunden, e in endprodukte) X[s][k][e] <= sum(l in lieferanten, r in rohstoffe, e in endprodukte) anteilE[e][r] * Y[s][l][r];
Kapazitaetsbeschraenkung:
forall(s in standorte, a in anlagen)
sum(r in rohstoffe, l in lieferanten) Y[s][l][r] <= sum(a in anlagen) kapazitaet[a] * A[s] + sum(s in standorte)B[s] * kapazitaet[a] + sum(a in anlagen)C[s] * kapazitaet[a];
Beschaffungsbeschraenkung:
forall(l in lieferanten) {
forall(r in rohstoffe)
sum (r in rohstoffe, s in standorte) Y[s][l][r] <= vorkommen[l][r];
}
Anlagenkapatitaet:
forall(s in standorte)
sum(l in lieferanten, r in rohstoffe) Y[s][l][r] <= sum(a in anlagen) A[s] * kapazitaet[a] + sum(a in anlagen) B[s] * kapazitaet[a] + sum(a in anlagen) C[s] * kapazitaet[a];
}
that's the .mod file. Cplex gets the values from excel.
thanks very much.
#CPLEXOptimizers#DecisionOptimization