我正在尝试使用pyomo来解决二次程序。我的模特在下面。我将在以后的阶段添加更多的约束和目标。
from pyomo.environ import *
model = ConcreteModel()
model.IDX1 = range(96)
model.IDX2 = range(192)
model.IDX3 = range(49)
# Variables
model.x = Var(model.IDX1)
b2 = main_power2.iloc[[0]]
b2 = np.append([0], np.asarray(b2))
model.H_py = Param(model.IDX1, initialize = arrtodict(Hp)) # Hp: 96*96
model.A1_py = Param(model.IDX2, initialize = arrtodict(A1l)) # A1l: 192 * 96
model.b1_py = Param(model.IDX2, initialize = arrtodict(b1)) # 192*1
model.A2_py = Param(model.IDX3, initialize = arrtodict(A2)) # 49 * 96
model.b2_py = Param(model.IDX3, initialize = arrtodict(b2)) # 49,1
def inequality_rule(model,i): # i = IDX2
return sum( model.A1_py[i][j] * model.x[j] for j in model.IDX1 ) <= model.b1_py[i]
model.c1 = Constraint (model.IDX2, rule = inequality_rule )
其中arrtodict是将数组(1-D,2-D)转换为字典的函数,如下所示。将其转换为字典的全部要点是,如果我没有记错的话,则使用字典来完成参数初始化。
def arrtodict(your_array):
your_array = your_array.tolist()
dict_data = {key: value for key, value in enumerate(your_array)}
if type(dict_data[0]) is list:
for key, value in dict_data.items():
dict_data[key] = {k: v for k, v in enumerate(value)}
elif type(dict_data[0]) is (float or int):
pass
else:
print ('Check Your data')
return dict_data
由于某些原因,我继续出现以下错误:
line 3530, in _generate_relational_expression
if not (rhs.__class__ in native_types or rhs.is_expression_type()):
AttributeError: 'dict' object has no attribute 'is_expression_type'
如果我尝试使用列表/数组初始化参数,则错误完全相同。错误中唯一的区别是错误地将“ dict”更改为“ list / numpy.ndarray”。我不确定我在做什么错。
此外,我确实查看了question here.,这就是为什么将数组转换为字典的原因。
答案 0 :(得分:2)
如ycx所述,Pyomo中存在一个错误。如果将对象传递给Param初始化,它会尝试将其用作表达式对象,而不是遍历它并使用值来初始化param。
您需要做的是更改代码,以使用为输入返回正确值的函数。请参阅代码文档中的示例:
https://github.com/Pyomo/pyomo/blob/master/examples/pyomo/tutorials/param.py
# A parameter can be constructed with the _initialize_ option, which is a
# function that accepts the parameter indices and model and returns the value
# of that parameter element:
#
def W_init(model, i, j):
#
# Create the value of model.W[i,j]
#
return i*j
model.W = Param(model.A, model.B, initialize=W_init)
答案 1 :(得分:0)
继续我以前的评论:
github.com/Pyomo/pyomo/issues/611。您可能需要进入 pyomo的源代码,用于实现return float(np.random.rand(1)) Param()函数以便在等待库时对其进行修复 创建者进行更新
您将必须使用IDE并检查import Cocoa
let file = "slowreadText.txt"
let waitTime: TimeInterval = 1
if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
let fileURL = dir.appendingPathComponent(file)
do {
let text = try String(contentsOf: fileURL, encoding: .utf8)
let sentences = text.components(separatedBy: ".")
for i in 0..<sentences.count {
let sentence = sentences[i]
DispatchQueue.main.asyncAfter(deadline: .now() + (waitTime * Double(i))) {
print(sentence)
}
}
}catch {
print(error)
}
}
函数(我正在使用Spyder,所以它是Param()
。它应该打开一个mouse highlight Param > mouse right-click > mouse click 'Go to definition'
文件,您将能够从此处编辑源代码以将其插入上述return语句中并解决问题。