Ошибка при использовании addMIPStart () в CPLEX C ++

У меня возникла проблема при использовании 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();
/*************************************************/

В качестве начального решения я устанавливаю все переменные x и z на 0. И, исходя из некоторой логики, некоторые y-переменные равны 0, а некоторые - 1, тогда как некоторые w-переменные равны назначена на полную мощность Q [p], а другим - 0.

Логика та же, что и я, но я смог найти здесь то, что упустил. Не могли бы вы мне помочь?


person user3064404    schedule 05.05.2017    source источник


Ответы (1)


Чаще всего я сталкиваюсь с такой ошибкой, потому что пытаюсь добавить значение mipstart для переменной, которой нет в моей проблеме. Например, переменные объявлены, но не участвуют в каких-либо ограничениях или целях, поэтому cplex не имеет их в своей извлеченной модели.

person TimChippingtonDerrick    schedule 06.05.2017