2016-06-12 4 views
0

В моей проблеме минимизации мне нужно свести к минимуму член, факторы которого могут быть очень большими (например, 2^200 для некоторых случаев). Например, мне нужно добавить объективные термины, какCplex Java API: очень большие числа (> 64 бит) или точные числа с плавающей запятой

objective.addTerm(vars.get(i).get(j), math.pow(2,200); // vars is a list of lists of IloNumVar, objective is of type IloLinearNumExpr 
// ... Add terms for all cvars ... 
cplex.addMinimize(objective); 

Есть ли способ, чтобы добавить такие большие объективные условия для CPLEX? Я запускаю cplex 12.3, и API предлагает мне передавать переменные типа double. Кажется, что нет поддержки BigIntegers?

Другим решением было бы уменьшить все значения до диапазона [0,2^32]. Однако результаты не являются оптимальными из-за ошибок округления. Является ли cplex поддержкой BigDecimals или некоторых эквивалентных типов?

+1

Я думаю, что вам просто нужно его масштабировать. Если у вас есть проблема значительного размера (количество варов и ограничений), вы, как правило, только докажете оптимальность с точностью до определенного допуска. Ошибки округления на ваших больших количествах, вероятно, не будут значительными по сравнению с допуском оптимальности. Допуск по оптимальности по умолчанию - это что-то вроде 1e-5, и я столкнулся с некоторыми проблемами; но обычно мы склонны расслабляться и принимать более высокую толерантность, чтобы получить разумное время работы. – TimChippingtonDerrick

ответ

0

Чтобы ответить на ваш вопрос конкретно, нет, поддержка BigInteger отсутствует. Вы можете проверить это, просмотрев CPLEX Java Reference Manual.

Как уже упоминалось в комментариях, вы, вероятно, захотите масштабировать эти большие коэффициенты. Для переменных верхних границ следует иметь в виду, что CPX_INFBOUND (1.0e + 20) рассматривается как бесконечность (см., Например, документацию для CPXXnewcols, то есть для C Callable Library, но все же уместной). Кроме того, убедитесь, что у вас нет «широких вариаций (скажем, на шесть или более порядков) в коэффициентах, найденных в целевой функции», или вы можете столкнуться с numeric difficulties.