我的自定义函数不是在运行模式下执行的,而是在调试时执行的。
我正在解决AMPL中的优化问题,从Python调用它。我用的是amplpy包。
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(将结果四舍五入到小数点后两位)。当我调用此代码时:
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 参数未更新, solver 仍为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
更令人惊讶的是,如果我在调试模式下运行此代码,则所有方法都将被调用,并且我得到了预期的两位小数。我试图在函数内更改 model 名称,并将 solve_model 的输出另存为 model2 等,然后有时我会读到Python中的对象结构无法覆盖,因此最好在副本上进行操作;我在 solve_model 函数中添加了model2 = copy.copy(model),并更改了其余代码以在model2上工作,但没有任何帮助。我了解由于某些原因,Python在执行外部函数时不会覆盖所有参数,但是为什么呢?