У меня есть AbstractModel и ConcreteModel, решающие одну и ту же проблему, но они работают по-разному. Это в основном о начальном значении переменной и толерантности ipopt.
Когда я инициализирую свою переменную model.x как 10 и opt.options ["tol"] = 1E-64:
ConcreteModel может найти оптимальное решение, в то время как абстрактная модель «Решена до приемлемого уровня». (Но решения, которые они находят, на самом деле одинаковы)
Когда я инициализирую свою переменную model.x как 100 и opt.options ["tol"] = 1E-64:
ConcreteModel может найти оптимальное решение, в то время как абстрактная модель иногда «Решена до приемлемого уровня», а иногда «Невозможно загрузить объект SolverResults с плохим состоянием: ошибка».
Если я просто использую значение допуска ipopt по умолчанию для допуска , как ConcreteModel, так и AbstractModel могут найти одно и то же оптимальное решение независимо от того, как я инициализирую переменную model.x.
Так что мне интересно, как opt.options ["tol"] имеет значение? Почему ConcreteModel всегда может найти оптимальное решение в этом случае, а AbstractModel - нет?
переменная
model.x = Var(model.Crops, model.Inputs, initialize = 100, within=NonNegativeReals)
решить скрипт AbstractModel
instance = model.create_instance(data="AbstractCDFarm.dat")
opt = SolverFactory("ipopt")
opt.options["tol"] = 1E-64
results = opt.solve(instance, tee=True)
instance.display()
решить скрипт ConcreteModel
opt = SolverFactory('ipopt')
opt.solve(model, tee=True)
opt.options["tol"] = 1E-64
results = opt.solve
model.display()