#python #pyomo #ampl
#python #pyomo #усиление
Вопрос:
Итак, я пытаюсь найти оптимальное решение проблемы. Я попытался скопировать формат здесь:https://pyomo.readthedocs.io/en/latest/pyomo_overview/simple_examples.html
Я создал файл .dat и model.py файл, но получил странную ошибку индексации, попытался настроить мой файл .dat, получил аналогичную ошибку. Я не уверен, что делать, чтобы исправить мой файл .dat и устранить ошибку.
файл .py:
import numpy as np
import pandas as pd
import pyomo.environ as pyo
# probability model
# model parameters
model = pyo.AbstractModel()
model.k = pyo.Param(within=pyo.NonNegativeIntegers)
model.L = pyo.Param(within=pyo.NonNegativeReals)
model.J = pyo.RangeSet(1, model.k)
model.mean = pyo.Param(model.J)
model.var = pyo.Param(model.J)
# decision variable
model.n = pyo.Var(model.J, domain=pyo.NonNegativeIntegers)
# objective function
def objective(model):
return sum(model.n[j]*model.n[j]*model.var[j] for j in model.J)/(sum(model.n[j] for j in model.J)**2)
sum(model.n[j] for j in model.J)
model.Obj = pyo.Objective(rule=objective)
def constraint(model):
return (sum(model.n[j]*model.mean[j] for j in model.J)/sum(model.n[j] for j in model.J) >= model.L)
model.Const = pyo.Constraint(rule=constraint)
начальный .файл dat:
param k := 9 ;
param L := 0 ;
param mean := 0.9581711079943904 0.8838415730337069 0.8984853752157478 0.8986654447608105 0.8663875972671153 0.8211460863742999 0.7847600783146949 0.7788767153059641 0.7484350221893459 0.6894005956320362 ;
param var := 0.18608283075010482 0.3505045997323567 0.3302027274449947 0.3346348960541469 0.3985411187856784 0.47583289045335103 0.5711695307985707 0.595920918431739 0.639842447473589 0.7188389471803242 ;
первая ошибка:
[ 0.00] Setting up Pyomo environment
[ 0.00] Applying Pyomo preprocessing actions
[ 0.20] Creating model
ERROR: Constructing component 'mean' from data={0.9581711079943904:
0.8838415730337069, 0.8984853752157478: 0.8986654447608105,
0.8663875972671153: 0.8211460863742999, 0.7847600783146949:
0.7788767153059641, 0.7484350221893459: 0.6894005956320362} failed:
RuntimeError: Failed to set value for param=mean,
index=0.9581711079943904, value=0.8838415730337069.
source error message="Index '0.9581711079943904' is not valid for indexed
component 'mean'"
[ 0.20] Pyomo Finished
ERROR: Unexpected exception while running model:
Failed to set value for param=mean, index=0.9581711079943904,
value=0.8838415730337069.
source error message="Index '0.9581711079943904' is not valid for indexed
component 'mean'"
Я подумал, что, возможно, мне нужно поместить индекс перед значением в моем файле .dat, поскольку в ошибке перечислены последовательные значения с первым в качестве индекса, поэтому я изменил свой файл .dat.
скорректированный файл .dat:
param k := 9 ;
param L := 0 ;
param mean := 0 0.9581711079943904 1 0.8838415730337069 2 0.8984853752157478 3 0.8986654447608105 4 0.8663875972671153 5 0.8211460863742999 6 0.7847600783146949 7 0.7788767153059641 8 0.7484350221893459 9 0.6894005956320362 ;
param var := 0 0.18608283075010482 1 0.3505045997323567 2 0.3302027274449947 3 0.3346348960541469 4 0.3985411187856784 5 0.47583289045335103 6 0.5711695307985707 7 0.595920918431739 8 0.639842447473589 9 0.7188389471803242 ;
вторая ошибка:
[ 0.00] Setting up Pyomo environment
[ 0.00] Applying Pyomo preprocessing actions
[ 0.20] Creating model
ERROR: Constructing component 'mean' from data={0: 0.9581711079943904, 1:
0.8838415730337069, 2: 0.8984853752157478, 3: 0.8986654447608105, 4:
0.8663875972671153, 5: 0.8211460863742999, 6: 0.7847600783146949, 7:
0.7788767153059641, 8: 0.7484350221893459, 9: 0.6894005956320362} failed:
RuntimeError: Failed to set value for param=mean, index=0,
value=0.9581711079943904.
source error message="Index '0' is not valid for indexed component
'mean'"
[ 0.20] Pyomo Finished
ERROR: Unexpected exception while running model:
Failed to set value for param=mean, index=0, value=0.9581711079943904.
source error message="Index '0' is not valid for indexed component
'mean'"
Здесь говорится, что 0 недопустимо для индексированного компонента. Я не уверен, что делать, так как я просто устал копировать материал по ссылке, размещенной выше. Кто-нибудь знает об этой ошибке?
Ответ №1:
Я надеюсь, вы нашли ответ. Если нет, model.mean индексируется моделью.J и модель.J начинается с «1» с RangeSet(1, model.k), а не с «0».
Комментарии:
1. Да, это была ошибка индексации, на которой я застрял на некоторое время, потому что я неправильно интерпретировал формат AMPL, спасибо