我正在尝试使用Python和scipy.optimize库实现结构优化代码。目标是最小化结构的重量,并且对于各种材料应力和失效条件存在5个不等式约束。我的计划是使用COBYLA或SLSQP方法。
我过去使用scipy做了一些优化代码,但它们都是设计变量的相当简单的功能(很像官方scipy文档中的教程)。我似乎无法解决这个问题,因为所有的约束函数都有点依赖于它。
我创建了一个包含一堆无关数据(材料属性,载荷,常量几何参数,辅助函数......)的类,它们将作为额外参数传递给目标函数和约束函数。我的问题围绕何时调用辅助函数来计算用于计算约束的几个参数。
当scipy.optimize将外部参数传递给目标和约束函数时,它是对象的单个实例吗?或者它是否为每个功能制作了n份副本?
优化模块在评估目标函数之前是否评估约束?
优化模块是否并行评估约束,还是从0到n依次评估约束?
我可以调用一次helperclass.updateSharedValues()(例如,在第一个约束函数或目标函数中)并且所有其他约束函数都可以访问新值吗?或者我是否需要在每个约束函数中调用它?
这里有一些伪代码可以帮助解释我正在做的事情:
""" inside the main script that calls scipy.optimize """
cons =({'type': 'ineq', 'fun': G0},
{'type': 'ineq', 'fun': G1},
{'type': 'ineq', 'fun': G2},
{'type': 'ineq', 'fun': G3},
{'type': 'ineq', 'fun': G4})
result = scipy.optimize.minimize(weight, x0, args =(helperclass),bounds = bnds,constraints = cons)
目标函数的一般示例
def weight(X,arg):
helperclass = arg
# calculate the current weight based on the design parameters and
# 10 other constants
w = doStuff(X, helperclass.someStuff1, helperclass.someStuff2,...)
return w
约束函数的一般化示例:
def G0(X,arg):
helperclass = arg
# call a function that calculates 10 other variables that
# are used by the 5 constraint functions
helperclass.updateSharedValues(X)
g0 = doStuff(X,helperclass.value1,helperclass.value5)
return g0
def G1(X,arg):
helperclass = arg
# do I need to calculate these values in every constraint function
# or can I just do it in the first one and all the others will have
# access to the updated values?
helperclass.updateSharedValues(X)
g0 = doStuff(X,helperclass.value2,helperclass.value3)
return g1