自定义函数未执行amplpy方法

时间:2019-02-05 14:34:29

标签: python function amplpy

我的自定义函数不是在运行模式下执行的,而是在调试时执行的。

我正在解决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在执行外部函数时不会覆盖所有参数,但是为什么呢?

0 个答案:

没有答案