以不同方式初始化参数会给我相同的属性错误

时间:2019-02-27 02:40:05

标签: python pyomo

我正在尝试使用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.,这就是为什么将数组转换为字典的原因。

2 个答案:

答案 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语句中并解决问题。