저는 PyOMO를 사용하여 제약 된 정수형 비선형 최적화 문제를 해결하려고합니다. 특히, 주어진 기어비가 충족되도록 기어 지름과 치 수를 찾으려고합니다. 나는 Set()
과 Var()
을 사용하는 방법에 관해서는 꽤 복잡하다. 나는 설명서를 읽었지만 Set가 실제로 무엇인지에 관해서는 슈퍼 슈퍼 클리어가 아닙니다! 문제의 비슷한 그룹화 된 부분에 액세스하는 데 사용할 수있는 색인입니까? 여기 내 코드입니다 :Pyomo ValueError : PositiveReals가 유효한 도메인이 아닙니다.
WARNING: Element 4.5 already exists in set D_index; no action taken.
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pyomo/core/base/PyomoModel.py", line 920, in _initialize_component
ERROR: Constructing component 'D' from data=None failed:
declaration.construct(data)
ValueError: PositiveReals is not a valid domain. Variable domains must be an instance of one of (<class 'pyomo.core.base.set_types.RealSet' at 0x1004bee98>, <class 'pyomo.core.base.set_types.IntegerSet' at 0x1004f2558>, <class 'pyomo.core.base.set_types.BooleanSet' at 0x1004f28f8>), or an object that declares a method for bounds (like a Pyomo Set). Examples: NonNegativeReals, Integers, Binary
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pyomo/core/base/var.py", line 573, in construct
component=None)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pyomo/core/base/var.py", line 299, in __init__
"Integers, Binary" % (domain, (RealSet, IntegerSet, BooleanSet)))
ValueError: PositiveReals is not a valid d
나는 또한
RangeSet()
을 사용하고
Var()
의 첫 번째 인수로 관련 설정을 전달하려고했습니다
그러나이 : (파이썬 3.5)
from pyomo.environ import *
from pyomo.opt import SolverFactory
import numpy as np
# Define Forward and Reverse Gear Ratios
fwd_ratio = 4.3
rev_ratio = 9.1
D_guess = [4.5, 11.5, 6.0, 10.0, 4.5, 2.5, 2.25, 9.0]
N_guess = [18, 46, 24, 40, 18, 20, 18, 72]
idx = np.arange(0,8)
print(idx)
model = AbstractModel()
# Declare Model Sets??? I tried this as first argument to Var(), didn't work
#model.Didx = Set(D_guess)
#model.Nidx = Set(N_guess)
# Declare Model Variables
model.D = Var(D_guess, within='PositiveReals', bounds=(1.0,None))
model.N = Var(N_guess, within='PositiveInteger', bounds=(18,None))
# Declare Objective Functions
def obj_funcD(model):
F1 = (model.D[1]/model.D[0])*(model.D[3]/model.D[2]) - fwd_ratio
F2 = (model.D[1]/model.D[4])*(model.D[6]/model.D[5])*(model.D[7]/model.D[6]) - rev_ratio
return F1 + F2
def obj_funcN(model):
F1 = (model.N[1]/model.N[0])*(model.N[3]/model.N[2]) - fwd_ratio
F2 = (model.N[1]/model.N[4])*(model.N[6]/model.N[5])*(model.N[7]/model.N[6]) - rev_ratio
return F1 + F2
# Declare Constraint
def con_func1(model):
return model.D[1]/model.D[0] == model.N[1]/model.N[0]
def con_func2(model):
return model.D[3]/model.D[2] == model.N[3]/model.N[3]
def con_func3(model):
return model.D[1]/model.D[4] == model.N[1]/model.N[4]
def con_func4(model):
return model.D[6]/model.D[5] == model.N[6]/model.N[5]
def con_func5(model):
return model.D[7]/model.D[6] == model.N[7]/model.N[6]
# Create Constraint List
model.c1 = Constraint(rule=con_func1)
model.c2 = Constraint(rule=con_func2)
model.c3 = Constraint(rule=con_func3)
model.c4 = Constraint(rule=con_func4)
model.c5 = Constraint(rule=con_func5)
# Create Objectives
model.obj1 = Objective(rule=obj_funcD,sense='minimize')
model.obj2 = Objective(rule=obj_funcN,sense='minimize')
# Solve the Problem?
opt = SolverFactory('glpk')
instance = model.create_instance()
results = opt.solve(instance)
이 코드는 다음과 같은 오류를 제공합니다 아무 것도하지 않습니다! 나는 여기에서 명백한 무엇인가 명백한 것을 놓치고있다라는 것을 알고 있었다. 그러나 나는 4 시간 동안 스크린을 꼼짝 않고 바라 보았다. 그리고 나는 당신의 도움을 입대하고있다! 감사합니다