用pyomo解决MIQP-将变量设置为postivereals在迭代过程中变为零

问题描述

因此,在使用mintpy,gurobi和ipopt求解器调用Solve函数时,我的变量alpha(在我的公式中应为> 0)变为零。

traceback (most recent call last):
  File "line_search.py",line 182,in <module>
    line_search(init_x,eps)
  File "line_search.py",line 147,in line_search
    results=SolverFactory('mindtpy').solve(instance,mip_solver='glpk',nlp_solver='ipopt',tee=True) 
  File "/Users/drvogt/opt/anaconda3/lib/python3.7/site-packages/pyomo/contrib/mindtpy/MindtPy.py",line 412,in solve
    MindtPy_iteration_loop(solve_data,config)
  File "/Users/drvogt/opt/anaconda3/lib/python3.7/site-packages/pyomo/contrib/mindtpy/iterate.py",line 33,in MindtPy_iteration_loop
    handle_master_mip_optimal(master_mip,solve_data,config)
  File "/Users/drvogt/opt/anaconda3/lib/python3.7/site-packages/pyomo/contrib/mindtpy/mip_solve.py",line 129,in handle_master_mip_optimal
    config)
  File "/Users/drvogt/opt/anaconda3/lib/python3.7/site-packages/pyomo/contrib/gdpopt/util.py",line 200,in copy_var_list_values
    v_to.set_value(value(v_from,exception=False))
  File "/Users/drvogt/opt/anaconda3/lib/python3.7/site-packages/pyomo/core/base/var.py",line 176,in set_value
    if valid or self._valid_value(val):
  File "/Users/drvogt/opt/anaconda3/lib/python3.7/site-packages/pyomo/core/base/var.py",line 189,in _valid_value
    (val,type(val),self.domain,self.name))
ValueError: Numeric value `0.0` (<class 'float'>) is not in domain PositiveReals for Var alpha[1]

有什么建议吗?从我在网上看到的内容来看,这可能是关于如何安装ipopt或pyomo的问题,但是我认为我要在这里检查是否有人可以确认这一点,或者他们认为这是另外一件事。这是我的代码

from pyomo.core import *
from pyomo.environ import *
import numpy as np
import random

#More Thuente linesearch

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 ={}
    for i in range(1,len(xk)+1):
        grad[i] = ((-1)**i)*2.0*(xk[i-1]-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))*2.0
            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):
        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,j]*model.v[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) 
        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 <1):

        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(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,initialize=current_H)
        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,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,domain=PositiveReals,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',tee=True) 
        #results=SolverFactory('mindtpy').solve(instance,mip_solver='gurobi',tee=True)
        results=SolverFactory('mindtpy').solve(instance,tee=True) 
        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(0.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)

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)