我正在通过为有限元模型选择最佳横截面(连续变量)和材料(整数变量)来构建结构优化项目。以下是我的 run_simulation :
from gekko import GEKKO
optimizer = GEKKO(remote = False) # Create a GEKKO object
num_vars = len(initial_opt_vars) // 2
# Continous vars
x_continuous = [optimizer.Var(value=0.005, lb=0) for _ in range(num_vars)]
# Integer Vars
x_integer = [optimizer.sos1([0, 1, 2]) for _ in range(num_vars)] # SOS1 for selecting among discrete options
optimizer.Minimize(self.objective_function(x_continuous, x_integer))
stress_expr = self.stress_constraint(x_continuous, x_integer)
optimizer.Equation([expr >= 0 for expr in stress_expr])
optimizer.options.SOLVER = 1
optimizer.solve(disp = True)
在约束函数和目标函数内,我使用优化的当前值来求解有限元模型。约束的输出是一个包含 542 个元素的 numpy 数组。我不知道为什么不等式表达式是错误的,我也不知道如何从那里开始。
错误:
error: Equation Definition
Equation without an equality (=) or inequality (>,<)
true
STOPPING...
有人可以帮助我吗?
有限元分析模型的结构优化。
我的
gk_model0.apm
具有以下结构:
Model
Variables
v1 = 0.005, >= 0
v2 = 0.005, >= 0
-
v270 = 0.005, >= 0
v271 = 0.005, >= 0
int_v272 = 0.01, <= 1, >= 0
int_v273 = 0.01, <= 1, >= 0
-
int_v1352 = 0.01, <= 1, >= 0
int_v1353 = 0.01, <= 1, >= 0
int_v1354 = 0.01, <= 1, >= 0
v1355 = 0
End Variables
Intermediates
i0=(((0+((0)*(int_v272)))+((1)*(int_v273)))+((2)*(int_v274)))
i1=(((0+((0)*(int_v276)))+((1)*(int_v277)))+((2)*(int_v278)))
-
i269=(((0+((0)*(int_v1348)))+((1)*(int_v1349)))+((2)*(int_v1350)))
i270=(((0+((0)*(int_v1352)))+((1)*(int_v1353)))+((2)*(int_v1354)))
End Intermediates
Equations
(((0+int_v272)+int_v273)+int_v274)=1
v275=i0
(((0+int_v276)+int_v277)+int_v278)=1
-
v1351=i269
(((0+int_v1352)+int_v1353)+int_v1354)=1
v1355=i270
True
True
-
True
minimize 776.8284358905587
End Equations
End Model
函数
self.objective_function(x_continuous, x_integer)
和 self.stress_constraint(x_continuous, x_integer)
是对外部代码的调用。 Gekko 变量被传递到函数中,但 Gekko 无法从该函数中提取基于梯度的解决方案所需的信息。处理黑盒模型的一种策略是根据函数输入的数量创建代理函数。
除了基于梯度的优化之外,另一种方法是使用无梯度方法,例如模拟退火、遗传算法(参见第 6 章)或工程优化课程中描述的其他方法。