Я столкнулся с проблемой при использовании addMIPStart ().
Сначала, для целей тестирования, я взял обобщенную задачу присваивания (имеет только один набор двоичных переменных решения x [i] [] j) и добавил границу с помощью addMIPStart (). Это сработало отлично.
Но, когда я пытался сделать то же самое на своей собственной проблеме, я получил ошибку CPLEX: «IloExtractable 189 IloNumVarl не был извлечен алгоритмом Iloalgorithm 000001ECF89B160».
В моей задаче есть четыре типа переменных:
x[k][p][t] = IloNumVar(env, 0.0, 1, ILOINT, name.str().c_str()); //binary
y[p][t] = IloNumVar(env, 0.0, 1, ILOINT, name.str().c_str()); //binary
z[k][p][t] = IloNumVar(env, 0.0, 1, ILOINT, name.str().c_str()); //binary
w[p][t] = IloNumVar(env, 0.0, IloInfinity, ILOINT, name.str().c_str()); //pure integer
Теперь я добавил следующий фрагмент кода ………………….
/*************************************************/
IloNumVarArray startVar(env);
IloNumArray startVal(env);
IloNum remExtResource = 0;
IloInt cutOffTime = 0;
IloInt totExtResource = 0;
for (k = 0; k < K; k++) {
for (p = 0; p<P; p++) {
for (t = 0; t<T + 2; t++) {
startVar.add(x[k][p][t]);
startVal.add(0);
}
}
}
for (k = 0; k < K; k++) {
for (p = 0; p<P2; p++) {
for (t = 0; t<T + 1; t++) {
startVar.add(z[k][p][t]);
startVal.add(0);
}
}
}
for (p = 0; p<P2; p++) {
totExtResource = ceil(D[p] / a_e[p]);
cutOffTime = ceil(totExtResource / Q[p]);
for (t_p = 0; t_p<T + 2; t_p++) {
if (t <= cutOffTime){
startVar.add(y[p][t]);
startVal.add(0);
}
if (t > cutOffTime){
startVar.add(y[p][t]);
startVal.add(1);
}
}
totExtResource = 0;
cutOffTime = 0;
}
for (p = 0; p<P2; p++) {
remExtResource = ceil(D[p] / a_e[p]);
for (t = 0; t<T + 1; t++) {
if (t == 0) {
startVar.add(w[p][t]);
startVal.add(0);
}
else {
if (remExtResource == 0) {
startVar.add(w[p][t]);
startVal.add(0);
}
else if ((remExtResource > 0) && (remExtResource <= Q[p])) {
startVar.add(w[p][t]);
startVal.add(remExtResource);
remExtResource = 0;
}
else {
startVar.add(w[p][t]);
startVal.add(Q[p]);
remExtResource = remExtResource - Q[p];
}
}
}
remExtResource = 0;
}
// cplex.addMIPStart(startVar, startVal, IloCplex::MIPStartAuto, "secondMIPStart");
cplex.addMIPStart(startVar, startVal);
startVal.end();
startVar.end();
/*************************************************/
В качестве исходного решения я делаю все х-переменные а также Z-переменные в 0. И на основе некоторой логики некоторые у-переменные являются 0 а некоторые 1, тогда как некоторые W-переменные назначены на полную мощность В [р], в то время как другие 0.
У него та же логика, которой я придерживался, но мог найти то, что здесь упустил. Не могли бы вы мне помочь?
Чаще всего, когда я видел такого рода ошибки, это потому, что я пытаюсь добавить значение mipstart для переменной, которая не входит в мою проблему. Например, переменные объявлены, но не включены ни в какие ограничения или в цель, поэтому у cplex их нет в извлеченной модели.
Других решений пока нет …