AbstractModel VS Конкретная модель pyomo? как "opt.options [" tol "]" влияет на поиск оптимального решения? - PullRequest
0 голосов
/ 21 июня 2019

У меня есть AbstractModel и ConcreteModel, решающие одну и ту же проблему, но они работают по-разному. Это в основном о начальном значении переменной и толерантности ipopt.

  1. Когда я инициализирую свою переменную model.x как 10 и opt.options ["tol"] = 1E-64: ConcreteModel может найти оптимальное решение, в то время как абстрактная модель «Решена до приемлемого уровня». (Но решения, которые они находят, на самом деле одинаковы)

  2. Когда я инициализирую свою переменную model.x как 100 и opt.options ["tol"] = 1E-64: ConcreteModel может найти оптимальное решение, в то время как абстрактная модель иногда «Решена до приемлемого уровня», а иногда «Невозможно загрузить объект SolverResults с плохим состоянием: ошибка».

  3. Если я просто использую значение допуска 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()

1 Ответ

1 голос
/ 21 июня 2019

Вы дважды вызываете функцию поиска для ConcreteModel, и похоже, что вывод, который вы видите, предназначен для допуска Ipopt по умолчанию, а не для допуска 1E-64.Почему вы устанавливаете такую ​​низкую терпимость?1E-64 меньше точности станка, поэтому допуск к невероятно малому отклонению.

...