Цели и обратные вызовы в CPLEX + Java: нелинейная предварительная обработка - PullRequest
0 голосов
/ 14 июля 2020

У меня проблема, в которой я хочу вставить новые решения в CPLEX. Первоначально я делал это с помощью обратного вызова Heuristi c. Проблема здесь в том, что игнорируется следующее:

model.setParam(IloCplex.Param.Preprocessing.Linear,1);

(я знаю, что это происходит из-за обратного вызова управления). Проблема в следующем: нелинейная предварительная обработка очень помогла бы мне снизить нижнюю границу стоимости (иначе я не смогу доказать оптимальность).

Я провел небольшое исследование в Интернете и обнаружил, что могу также добавить решение, используя Цели, в частности Цели решения.

Теперь я использую цель решения, которая вкратце выглядит следующим образом:

private class InsertSolution2 extends IloCplex.Goal {
    @Override
    public IloCplex.Goal execute(IloCplex iloCplex) throws IloException {
        if (nextSolution != null) {
            System.out.println("In Solution Goal: Next Solution Exists");
            //inject solution
            //set values for vars and vals
            nextSolution = null;
            return cplex.solutionGoal(vars, vals);
        }
        return null;
    }
}

Затем я добавляю это к cplex.solve(new InsertSolution2())

Это вызывает у меня несколько проблем (но я полный новичок с целями ...)

  • Правильно ли указанное выше?
  • Как это реализовано в серверной части ? Он по-прежнему игнорирует предварительную обработку ... Есть ли альтернатива, которая допускает нелинейную предварительную обработку?
  • Это противоречит стартовым решениям? Мои стартовые решения теперь игнорируются ...

Спасибо! Лейла

1 Ответ

1 голос
/ 15 июля 2020

Я не думаю, что использование целей поможет вам. Цели реализуются с помощью обратных вызовов, поэтому вы ничего не можете достичь с помощью целей, которых нельзя достичь с помощью обратных вызовов. generi c структура обратного вызова. Эта структура была разработана для решения именно той проблемы, которую вы описываете. В этой структуре вы можете, например, активировать контекст GLOBAL_PROGRESS и публиковать решения c оттуда. См. Пример AdMIPex9.java, поставляемый с CPLEX, чтобы узнать, как внедрить возможные решения из общего c обратного вызова во время поиска по дереву.

...