Я использую линейное программирование 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.
Любое предложение, почему это так или как избежать этой проблемы?