Вот минимальный пример с индексированными значениями:
Код: Выделить всё
import pyomo.environ as pyo
model = pyo.ConcreteModel()
model.s = pyo.Set(initialize=[1, 2, 3]) # with indexes = with warnings
model.v1 = pyo.Var(model.s, bounds=(0.1, 1.0))
model.v2 = pyo.Var(model.s, bounds=(0.2, 1.0))
def x_rule(m: pyo.Model, s: int):
return m.v1[s] * m.v2[s]
model.x = pyo.Expression(model.s, rule=x_rule)
def objective(m: pyo.Model):
return sum(m.x[s] for s in m.s)
model.obj = pyo.Objective(rule=objective)
pyo.SolverFactory("ipopt").solve(model)
- В правиле x_rule (специально для оператора умножения *):
Код: Выделить всё
Class 'ComponentData' does not define '__mul__', so the '*' operator cannot be used on its instances - В целевой функции (особенно для кода внутри функции суммы):
Код: Выделить всё
Unexpected type(s): Generator[ComponentData, Any, None]) Possible type(s): [...]
Код: Выделить всё
import pyomo.environ as pyo
model = pyo.ConcreteModel()
model.v1 = pyo.Var(bounds=(0.1, 1.0))
model.v2 = pyo.Var(bounds=(0.2, 1.0))
def x_rule(m: pyo.Model):
return m.v1 * m.v2
model.x = pyo.Expression(rule=x_rule)
def objective(m: pyo.Model):
return m.x
model.obj = pyo.Objective(rule=objective)
pyo.SolverFactory("ipopt").solve(model)
В обоих случаях я получаю одинаковые результаты (только один раз для всех трех значений v1 и v2 и один раз для одной переменной). Мой собственный проект со значительно большим количеством переменных (и, к сожалению, с большим количеством предупреждений...) также выполняется и дает значимые результаты.
Использую ли я индексированные значения в функциях неправильно или нечисто, из-за чего я получаю эти предупреждения, или это из-за «ложноположительных» предупреждений, которые иногда выдает Pyomo? В аналогичном случае (почему PyCharm выдает мне предупреждение при использовании метода .fix() Pyomo?) я также получал предупреждения от Pyomo о функциях, которые описаны в их документации по мере их использования и, вероятно, еще не устранены.
Подробнее здесь: https://stackoverflow.com/questions/798 ... e-componen
Мобильная версия