首页 > 解决方案 > 定义可变矩阵并在运行期间手动设置值

问题描述

所以我的兴趣是在运行期间生成粗麻布和梯度来评估约束 -

def shifted_obj(model):
    for i in range(1,1+model.m_set):
        M.g_shift[i] =((-1)**(i-1))*math.cos(model.v[i])

    for i in range(1,1+model.m_set+1):
        for j in range(1,1+model.m_set+1):
            if(i==j):
                model.H_shift[i,j] = -((-1)**(i-1))*math.sin(model.v[i])

    return .5*sum(model.g_shift[ i ] * model.g_shift[ i ] for i in model.m_set) +  .5*sum( model.g_shift[i]*model.H_shift[i,j]*model.pk[j] for i in model.m_set for j in model.m_set ) +  .5*sum( model.pk[i]*model.H_shift[j,i]*model.g_shift[j] for i in model.m_set for j in model.m_set ) +  .5*sum( model.pk[i]*model.H_shift[j,i]*model.H_shift[i,j]*model.pk[j] for i in model.m_set for j in model.m_set )

我设置了两个可变参数,并尝试对它们进行索引以将它们设置为正确的值,但看起来这不是这样做的方法:

ERROR: Rule failed when generating expression for constraint de_constraint2:
    TypeError: unsupported operand type(s) for +: 'int' and
    'FiniteSimpleRangeSet'
ERROR: Constructing component 'de_constraint2' from data=None failed:
        TypeError: unsupported operand type(s) for +: 'int' and
        'FiniteSimpleRangeSet'
Traceback (most recent call last):
  File "line_search.py", line 199, in <module>
    line_search(init_x,eps)
  File "line_search.py", line 156, in line_search
    instance = M.create_instance()
  File "/Users/drvogt/opt/anaconda3/lib/python3.7/site-packages/pyomo/core/base/PyomoModel.py", line 726, in create_instance
    profile_memory=profile_memory )
  File "/Users/drvogt/opt/anaconda3/lib/python3.7/site-packages/pyomo/core/base/PyomoModel.py", line 783, in load
    profile_memory=profile_memory)
  File "/Users/drvogt/opt/anaconda3/lib/python3.7/site-packages/pyomo/core/base/PyomoModel.py", line 834, in _load_model_data
    self._initialize_component(modeldata, namespaces, component_name, profile_memory)
  File "/Users/drvogt/opt/anaconda3/lib/python3.7/site-packages/pyomo/core/base/PyomoModel.py", line 885, in _initialize_component
    declaration.construct(data)
  File "/Users/drvogt/opt/anaconda3/lib/python3.7/site-packages/pyomo/core/base/constraint.py", line 755, in construct
    tmp = _init_rule(_self_parent)
  File "line_search.py", line 152, in <lambda>
    sufficentprogress_rule = lambda M: sufficentprogress(M) <=0.0
  File "line_search.py", line 80, in sufficentprogress
    return shifted_obj(model) - extra_term  - line_obj(model)
  File "line_search.py", line 66, in shifted_obj
    for i in range(1,1+model.m_set):
TypeError: unsupported operand type(s) for +: 'int' and 'FiniteSimpleRangeSet' 

如果有人能告诉我如何手动设置这些字段,我将不胜感激。设置这些矩阵后,我还必须进行一些重构吗?de_constraint2我想我可能是因为在约束中调用了这个函数。

这是我的整个上下文代码,谢谢。

from pyomo.core import *
from pyomo.environ import *
import numpy as np
import random
import math
#More Thuente linesearch

def objective_func(xk):
    x_len = len(xk)

    my_sum=0.0
    for i in range(1,x_len+1):
        #my_sum = my_sum + ((-1)**(i-1))*(xk[i-1]-1)**2
        my_sum = my_sum + ((-1)**(i-1))*math.sin(xk[i-1])
    return my_sum

def grad_func(xk):
    x_len = len(xk)
    grad ={}
    for i in range(1,len(xk)+1):
        grad[i] = ((-1)**(i-1))*math.cos(xk[i-1])
    return grad

    # 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
    H = {}
    for i in range(1,len(xk)+1):
        for j in range(1,len(xk)+1):
            #print((i,j))
            if(i==j):
                H[(i,j)] = -((-1)**(i-1))*math.sin(xk[i-1])
            else:
                H[(i,j)] = 0.0
    return H
def convert_xk(xk):
    new_xk = {}
    for i in range(1,len(xk)+1):
    
        new_xk[i] = xk[i-1]
    return new_xk

  

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):
        for i in range(1,1+model.m_set):
            M.g_shift[i] =((-1)**(i-1))*math.cos(model.v[i])

        for i in range(1,1+model.m_set+1):
            for j in range(1,1+model.m_set+1):
                if(i==j):
                    model.H_shift[i,j] = -((-1)**(i-1))*math.sin(model.v[i])

        return .5*sum(model.g_shift[ i ] * model.g_shift[ i ] for i in model.m_set) +  .5*sum( model.g_shift[i]*model.H_shift[i,j]*model.pk[j] for i in model.m_set for j in model.m_set ) +  .5*sum( model.pk[i]*model.H_shift[j,i]*model.g_shift[j] for i in model.m_set for j in model.m_set ) +  .5*sum( model.pk[i]*model.H_shift[j,i]*model.H_shift[i,j]*model.pk[j] for i in model.m_set for j in model.m_set )
    
    def sufficentprogress(model):
        extra_term = .0001*model.alpha[1]*sum(model.g[i] * model.pk[i] for i in model.m_set) 
        print("YO")
        print(extra_term)
        return shifted_obj(model) - extra_term  - line_obj(model)
    def build_line_constraint(M,i):
        return (M.v[i] - M.xk[i] - M.alpha[1]*M.pk[i]==0.0)
    counter=0
    curr_xk = init_x
    #print(curr_xk)
    #current_grad = grad_func(curr_xk)
    #current_grad=current_grad.tolist()
    #current_H = hess_func(curr_xk)
    #print(current_H)
    #current_H = current_H.tolist()
    #print(current_H)


    first_obj = objective_func(init_x)
    #print(first_obj)
    obj_list=[]

    while(counter <10):

        current_grad = grad_func(curr_xk)
        #print(current_grad)
        current_H = hess_func(curr_xk)
        #current_grad = current_grad.tolist()
        #current_H=current_H.tolist()
        # print(curr_xk)
        # print(current_grad)
        # temp_grad = []
        # for i in range(0,len(current_grad)):
        #   temp_grad.append(current_grad[i][0])
        # print(current_H)
        # current_grad = temp_grad
        # print(current_grad)
        
        M = AbstractModel()
    
        
        
        M.m_set   = RangeSet(1, len(curr_xk))
        M.n_set   = RangeSet(1, 1)
        M.a_set   = RangeSet(1)


        dic_xk = convert_xk(curr_xk)
        print("xk" +str(dic_xk))
        #print(dic_xk)
        # 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.H = Param(M.m_set,M.m_set,initialize=current_H)
        M.H_shift = Param(M.m_set,M.m_set,mutable=True)
        M.g_shift = Param(M.m_set,mutable=True)
        #print(current_grad)
        M.g = Param(M.m_set,initialize=current_grad)
        M.xk = Param(M.m_set,initialize=dic_xk)
        #print(eps)
        M.epsilon = Param(M.n_set, initialize={1:eps})
        #M.x = Var( M.m_set, within=Binary,initialize=x_param_init)
        
        ones_init ={}
        for i in range(1,len(curr_xk)+1):
            ones_init[i]=1.0
        M.v = Var( M.m_set, within=Binary, initialize=ones_init)
        
        

        M.pk = Var( M.m_set, domain=Reals, initialize=ones_init)
        #M.alpha = Var(M.a_set,domain=NonNegativeReals,initialize={1:1.0})
        M.alpha = Var(M.a_set,bounds=(.001, 1.0),initialize={1:1.0})
        M.i =RangeSet(len(curr_xk))

        
        sufficentprogress_rule = lambda M: sufficentprogress(M) <=0.0
        M.de_constraint2= Constraint(rule=sufficentprogress_rule)
        M.Co1 = Constraint(M.i, rule = build_line_constraint)
        M.obj = Objective( rule=line_obj, sense=minimize )
        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) 
        #print(dir(results))
        instance.solutions.store_to(results)
        print(results)
        new_xk=[]
        for p in instance.m_set:
                #print(instance.v[p].value)
                new_xk.append(instance.v[p].value)
        #print("lol")
        #print(new_xk)
        curr_xk = new_xk
        counter=counter+1
        obj_list.append(instance.obj.value())
    first_obj = objective_func(init_x)
    final_obj = objective_func(curr_xk)
    print(first_obj)
    print(final_obj)
    print(instance.display())
    print(curr_xk)
    print(obj_list)

    
    
mult=10
run=1
eps=10**(-4)
for i in range(0,run):

    size = mult*(i+1)
    x_vec =[]
    
    for i in range(0,size):
        #x_vec.append(np.random.randint(0,2))
        x_vec.append(1.0)
        #x_vec.append(random.randint(0,2))
    #init_obj = objective_func(x_vec)
    init_x = x_vec
    print(x_vec)
    line_search(init_x,eps)
    print(x_vec)

标签: pyomo

解决方案


推荐阅读