pyomo - 定义可变矩阵并在运行期间手动设置值
问题描述
所以我的兴趣是在运行期间生成粗麻布和梯度来评估约束 -
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)
解决方案
推荐阅读
- java-8 - 使用资源尝试时丢失 ZLIB 输入流失败
- docker - 在 Azure DeVops 中为部署在 Kubernetes 上的 docker 映像标记最佳实践
- c# - 在 AR 环境中显示设备摄像头的输入
- powershell - 空值似乎在 foreach 循环中产生不正确的数据
- javascript - 如何在 React 中使用“this.props.params”?
- javascript - Threejs:如何使用 GLTFExporter 导出具有绘制范围的索引几何?
- dita - DITA OT 预处理
- r - 为什么 Rserve 不能运行?
- html - 如何使另一个下的 div 接收悬停事件?
- reactjs - React Native 和 React Navigation 出错