Так что я немного новичок в pyomo,
Я попытался реализовать проблему, на которую смотрю:
from pyomo.core import *
from pyomo.environ import *
import numpy as np
def objective_func(xk):
x_len = len(xk)
my_sum=0.0
for i in range(0,x_len):
my_sum = my_sum + ((-1)**i)*(xk[i]-1)**2
return my_sum
def grad_func(xk):
x_len = len(xk)
grad=np.zeros((x_len,1))
my_sum=0.0
for i in range(0,x_len):
grad[i,0]= ((-1)**i)*2.0*(xk[i]-1)
return grad
def hess_func(xk):
H = np.zeros((len(xk),len(xk)))
for i in range(0,len(xk)):
H[i,i] = ((-1)**i)*2.0
return H
def line_search(init_x,eps):
def c_param_init ( model, v ):
grad_set=init_grad
return grad_set[ v -1 ]
def x_param_init ( model, v ):
return init_x[ v -1 ]
def hessian_init(model,v1,v2):
return init_hessian[ v1 -1 ][ v2 -1 ]
def line_obj(model):
return .5*sum(model.g[ i ] * model.g[ i ] for i in model.m_set) + .5*sum( model.g[i]*model.H[i,j]*model.pk[j] for i in model.m_set for j in model.m_set ) + .5*sum( model.pk[i]*model.H[j,i]*model.g[j] for i in model.m_set for j in model.m_set ) + .5*sum( model.pk[i]*model.H[j,i]*model.H[i,j]*model.pk[j] for i in model.m_set for j in model.m_set )
def shifted_obj(model):
return .5*sum(model.g[ i ] * model.g[ i ] for i in model.m_set) + .5*sum( model.g[i]*model.H[i,j]*model.v[j] for i in model.m_set for j in model.m_set ) + .5*sum( model.v[i]*model.H[j,i]*model.g[j] for i in model.m_set for j in model.m_set ) + .5*sum( model.v[i]*model.H[j,i]*model.H[i,j]*model.v[j] for i in model.m_set for j in model.m_set )
def sufficentprogress(model):
return shifted_obj(model) - M.epsilon - line_obj(model)
def build_line_constraint(M,i):
return M.v[i] - M.xk[i] - M.alpha*M.pk[i]
counter=0
curr_xk = init_x
current_grad = grad_func(curr_xk)
current_H = hess_func(curr_xk)
def c_param_init ( model, v ):
return current_grad[ v -1 ] # -1 because Python is 0-based
def x_param_init ( model, v ):
return curr_xk[ v -1 ] # -1 because Python is 0-based
def hessian_init(model,v1,v2):
return current_H[ v1 -1 ][ v2 -1 ]
while(counter <1):
current_grad = grad_func(curr_xk)
current_H = hess_func(curr_xk)
M = AbstractModel()
M.obj = Objective( rule=line_obj, sense=minimize )
M.m_set = RangeSet(1, len(curr_xk))
M.n_set = RangeSet(1, 1)
M.a_set = RangeSet(1)
M.H = Param( M.m_set, M.m_set, initialize=hessian_init)
M.g = Param( M.m_set, initialize=c_param_init)
M.xk = Param( M.m_set, initialize=x_param_init)
M.epsilon = Param(M.a_set,initialize=eps)
#M.x = Var( M.m_set, within=Binary,initialize=x_param_init)
M.v = Var( M.m_set, within=Binary)
M.pk = Var( M.m_set, domain=Reals )
M.alpha = Var(M.a_set,within=PositiveReals)
M.Ngen =RangeSet(len(curr_xk))
sufficentprogress_rule = lambda M: sufficentprogress(M) <=0.0
M.de_constraint2= Constraint(rule=sufficentprogress_rule)
M.Co1 = Constraint(M.Ngen, rule = build_line_constraint)
instance = M.create_instance()
print(instance.pprint())
#results=SolverFactory('mindtpy').solve(instance, mip_solver='cplex', nlp_solver='ipopt',tee=True)
#results=SolverFactory('mindtpy').solve(instance, mip_solver='gurobi', nlp_solver='ipopt',tee=True)
results=SolverFactory('mindtpy').solve(instance, mip_solver='glpk', nlp_solver='ipopt',tee=True)
new_xk=[]
for i in M.v:
new_xk.append(M.v[i])
curr_xk = new_xk
counter=counter+1
first_obj = objective_func(init_x)
final_obj = objective_func(curr_xk)
print(first_obj)
print(final_obj)
mult=1600
run=1
eps=10^(-4)
for i in range(0,run):
size = mult*i
x_vec =[]
for i in range(0,size):
x_vec.append(.5)
#init_obj = objective_func(x_vec)
init_x = x_vec
line_search(init_x,eps)
Когда я запускаю это, я обнаруживаю, что это похоже, что конструкция моего de_constraint2 не работает:
ERROR: Rule failed when generating expression for constraint de_constraint2:
TypeError: unsupported operand type(s) for -: 'float' and 'IndexedParam'
ERROR: Constructing component 'de_constraint2' from data=None failed:
TypeError: unsupported operand type(s) for -: 'float' and
'IndexedParam'
, с которой я раньше не сталкивался.
Даже когда я комментирую это ограничение и пытаюсь построить модель, это выглядит так все пусто, т.е. даже другие ограничения не создаются:
1 Set Declarations
H_index : Size=1, Index=None, Ordered=True
Key : Dimen : Domain : Size : Members
None : 2 : m_set*m_set : 0 : {}
4 RangeSet Declarations
Ngen : Dimen=1, Size=0, Bounds=(None, None)
Key : Finite : Members
None : True : []
a_set : Dimen=1, Size=1, Bounds=(1, 1)
Key : Finite : Members
None : True : [1]
m_set : Dimen=1, Size=0, Bounds=(None, None)
Key : Finite : Members
None : True : []
n_set : Dimen=1, Size=1, Bounds=(1, 1)
Key : Finite : Members
None : True : [1]
4 Param Declarations
H : Size=0, Index=H_index, Domain=Any, Default=None, Mutable=False
Key : Value
epsilon : Size=1, Index=a_set, Domain=Any, Default=None, Mutable=False
Key : Value
1 : -10
g : Size=0, Index=m_set, Domain=Any, Default=None, Mutable=False
Key : Value
xk : Size=0, Index=m_set, Domain=Any, Default=None, Mutable=False
Key : Value
3 Var Declarations
alpha : Size=1, Index=a_set
Key : Lower : Value : Upper : Fixed : Stale : Domain
1 : 0 : None : None : False : True : PositiveReals
pk : Size=0, Index=m_set
Key : Lower : Value : Upper : Fixed : Stale : Domain
v : Size=0, Index=m_set
Key : Lower : Value : Upper : Fixed : Stale : Domain
1 Objective Declarations
obj : Size=1, Index=None, Active=True
Key : Active : Sense : Expression
None : True : minimize : 0.0
1 Constraint Declarations
Co1 : Size=0, Index=Ngen, Active=True
Key : Lower : Body : Upper : Active
14 Declarations: obj m_set n_set a_set H_index H g xk epsilon v pk alpha Ngen Co1
None
INFO: ---Starting MindtPy---
INFO: Original model has 0 constraints (0 nonlinear) and 0 disjunctions, with
0 variables, of which 0 are binary, 0 are integer, and 0 are continuous.
INFO: Problem has no discrete decisions.
INFO: Your model is an LP (linear program). Using LP solver glpk to solve.
WARNING: Constant objective detected, replacing with a placeholder to prevent
solver failure.
WARNING: Empty constraint block written in LP format - solver may error
0.0
0.0
, что вызывает сбой моего решателя при его вызове. Если у кого-то есть предложения, как мне правильно решить эту проблему / какие решатели вы бы посоветовали использовать, я был бы очень признателен.
Спасибо.