我试图将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)
感谢任何帮助或建议。谢谢。