Моя пользовательская функция не выполняется в режиме выполнения, но выполняется во время отладки.
Я решаю проблему оптимизации в 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 не перезаписывает все параметры при выполнении внешних функций, но почему?