Pyomo: TypeError: неподдерживаемые типы операндов для -: 'float' и проблемы построения экземпляра для MIQP - PullRequest
0 голосов
/ 06 августа 2020

Так что я немного новичок в 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

, что вызывает сбой моего решателя при его вызове. Если у кого-то есть предложения, как мне правильно решить эту проблему / какие решатели вы бы посоветовали использовать, я был бы очень признателен.

Спасибо.

...