问题描述
因此,在使用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 (将#修改为@)