Переменная Pyomo с границами = (0.0, None) получает отрицательное значение

Я использую модель pyomo-Concreate, и в этой модели есть переменная pyomo, называемая Lambda, которая ограничена (0.0, None) и внутри = Non.NegativeReals.

Проблема в том, что после решения модели она каким-то образом получает отрицательное значение, чего не должно происходить.

Как думаете, в чем может быть проблема?

PS: Я использую GLPK Solver v4.61 для решения модели.

Вот объявление переменной Lambda, а также результаты:

    m.Lambda = pyomo.Var(
        within=pyomo.NonNegativeReals,
        bounds=(0.0, None),
        doc='Sub Problem Objective')

Проверить последнюю итерацию, даже если результаты верны, лямбда не должна иметь значение минус что-то? ??


person oakca    schedule 06.09.2017    source источник
comment
Вы проверили вывод решателя и возвращаемое значение, чтобы убедиться, что они сходятся?   -  person Bethany Nicholson    schedule 06.09.2017


Ответы (1)


В дополнение к комментарию Бетани, и в более общем смысле, все решатели должны использовать встроенные допуски из-за использования арифметики конечной точности для решения вашей модели. Хотя результат, на который вы ссылаетесь, отрицателен на последней итерации, он отрицателен на достаточно малую величину, которая, вероятно, считалась выполнимой на основе допуска, используемого вашим решателем. Вероятно, вы можете ужесточить этот допуск, используя параметры для вашего решателя, но, в конце концов, вам нужно будет использовать допуски в своем собственном коде, когда вы будете выполнять дополнительные проверки для любого алгоритма, который вы пишете (например, assert var.value <= var.ub + feas_abstol, где feas_abstol установлен на некоторый небольшое число, например 1e-8 где-нибудь в вашем коде).

person Gabe Hackebeil    schedule 06.09.2017