使用跨约束的共享值进行复杂的scipy优化

时间:2016-11-11 03:38:05

标签: python optimization scipy

我正在尝试使用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

0 个答案:

没有答案