метод amppy не выполняется в пользовательской функции - PullRequest
0 голосов
/ 05 февраля 2019

Моя пользовательская функция не выполняется в режиме выполнения, но выполняется во время отладки.

Я решаю проблему оптимизации в AMPL, вызывая ее из Python.Я использую пакет amppy.

from amplpy import AMPL, Environment

# read AMPL model and data
model = AMPL(Environment(mypath + '/amplide.mswin64'))
model.read(mypath + '/amplide.mswin64/models/diet.mod')
model.readData(mypath + '/amplide.mswin64/models/diet.dat')

Я хочу установить для решателя CPLEX и для параметра solution_round значение 2 (округляет результаты до 2 десятичных знаков).Когда я звоню по этому коду:

model.setOption("solution_round", 2)
model.setOption("solver", "cplex")
model.solve()

, он прекрасно работает.

>> model.getVariable("Buy").getValues().toPandas()

      Buy.val
BEEF     0.00
CHK      0.00
FISH     0.00
HAM      0.00
MCH     46.67
MTL      0.00
SPG      0.00
TUR      0.00

Однако, когда я перемещаю его в отдельную функцию solve_model , параметр solution_round не обновляется, решатель остается CPLEX иМодель правильно решена.Ниже приведена функция, написанная в пакете func_model и ее использование в основном файле.

def solve_model(model):
    model.setOption("solution_round", 2)
    model.setOption("solver", "cplex")
    model.solve()
    return model

import func_model
model = func_model.solve_model(model)

Но это будет результат с 6 десятичными знаками.

>> model.getVariable("Buy").getValues().toPandas()

      Buy.val
BEEF     0.000000
CHK      0.000000
FISH     0.000000
HAM      0.000000
MCH     46.666667
MTL      0.000000
SPG      0.000000
TUR      0.000000

Что более удивительно, если я запускаю этот код в режиме отладки, все методы вызываются, и я получаю 2 десятичных знака, как и ожидалось.Я попытался изменить модель имя внутри функции, а также сохранить вывод solve_model как что-то вроде model2 и т. Д., Затем я прочитал, что иногда структура объектав Python нельзя перезаписать, поэтому лучше работать с копией;Я добавил model2 = copy.copy (model) в функцию solve_model и изменил остальную часть кода для работы с model2, но ничего не помогло.Я понимаю, что по некоторым причинам Python не перезаписывает все параметры при выполнении внешних функций, но почему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...