cplex: снижение эффективного допуска cplexlp за счет масштабирования линейной программы

Я использую линейное программирование cplex в matlab (cplexlp) для решения проблемы

min f'u s.t. Au>=b, u>=lb

с использованием

[u,minima,flag] = cplexlp(f,-A,-b,[],[],lb);

но мне нужен допуск решения ниже 1e-9, что является минимальным допуском в документации. Я решил, что могу просто масштабировать проблему (например, на 10000) и добиться эффективного допуска 1e-13.

scale=10000;
tolerance=1e-9;
options = cplexoptimset('cplex');
options.simplex.tolerances.feasibility = tolerance;
options.simplex.tolerances.optimality = tolerance;
[u,minima,flag] = cplexlp(scale*f,-scale*A,-scale*b,[],[],scale*lb,[], [], options);
minima = minima / scale;

Не работает, и толерантность улучшается до 1е-11 но не меньше. На изображении ниже показано в масштабе log10 «реальное решение» (найденное с использованием другого метода) и решение, возвращенное алгоритмом для разных параметров (каждый цвет отличается A, b, а оси x — это некоторые параметры задачи, которые контролируют решение). Как видите, реальное решение достигается, пока оно выше 1e-11.

Любое предложение, почему это так или как избежать этой проблемы?

Насыщение минимального решения


person Uri Cohen    schedule 30.10.2014    source источник


Ответы (2)


CPLEX, как и большинство других кодов, использует арифметику двойной точности. В этой среде вы обычно можете доверять своим результатам только до первых 9 или 10, может быть, 11 цифр. По этой же причине вы не можете установить меньший допуск в CPLEX.

Чтобы получить более точные результаты, вам придется использовать решатель, использующий рациональную арифметику. QSopt_ex и SoPlex (с итеративным уточнением) — две возможности. Я не знаю, как это возможно изнутри Matlab.

person mattmilten    schedule 04.11.2014

Дополнительные ответы, , предлагаемые на форуме cplex, но никто не решил ее.

person Uri Cohen    schedule 10.11.2014