使用scipy.optimize.fmin_slsqp作为整数设计变量

时间:2016-10-17 22:45:23

标签: optimization scipy

我试图将scipy.optimize.slsqp用于与工业相关的约束优化。高度非线性有限元模型用于生成目标和约束函数及其导数/灵敏度。

目标函数的形式如下:
obj =根据有限元模型计算的数字

设置了一系列约束函数,其中大多数都采用以下形式:
cons =实数i - 实数j(根据有限元模型计算)

我想尝试将设计变量限制为整数,因为这将是植物机器的输入。

另一个考虑因素是让日志文件记录已经尝试过的设计变量。如果已经尝试了一组设计变量(整数),则跳过计算,扰乱设计变量并再试一次。通过将设计变量限制为整数,我们可以限制试验次数(同时将设计变量保留为实数,例如,第8个小数点的变化可以视为未经验证的值)。

我使用SLSQP,因为它是SQP方法之一(如果我错了,请纠正我),并且它被认为是处理非线性问题的强大功能。我理解SLSQP算法是一个基于梯度的优化器,我无法在FORTRAN编码的算法中实现设计变量的整数限制。所以相反,我将slsqp.py文件修改为以下内容(它调用从FORTRAN算法构建的python扩展):

slsqp(m, meq, x, xl, xu, fx, c, g, a, acc, majiter, mode, w, jw)
for i in range(len(x)):
    x[i]=int(x[i])

代码在第二次迭代时停止并输出以下内容:

优化已成功终止。 (退出模式0)
           当前功能值:-1.286621577077517
            迭代次数:7
            功能评估:0
            梯度评估:0

但是,违反了约束函数之一(值约为-5.2,而优化代码的默认收敛标准= 10 ^ -6)。

问题:
1.由于有限元模型是高度非线性的,我认为可以安全地假设客观和约束函数也是高度非线性的(无论其数学形式如何)。这是对的吗? 2.基于slsqp算法的收敛准则(请参见下文),其中一个要求所有约束违规的总和(绝对值)小于一个非常小的值(10 ^ -6),如何进行优化退出并成功终止消息?

 IF ((ABS(f-f0).LT.acc .OR. dnrm2_(n,s,1).LT.acc).AND. h3.LT.acc)

感谢任何帮助或建议。谢谢。

0 个答案:

没有答案