我目前正在做激光切割的过程优化——在MATLAB中。我试图将工艺参数与切割质量联系起来,例如:
输入(工艺参数)
输出(质量参数)
我首先训练一个神经网络模型,以便根据工艺参数预测切削质量。
[inputs,targets] = lasercutting_dataset;
nLayers = 2; % number of hidden layers
trainFcn = 'trainlm'; % Levenberg Marqhart training function
net = fitnet(nLayers,trainFcn);
这很好,现在我对表演不感兴趣。
接下来我想使用遗传算法优化(最大化)输入参数切割速度。这意味着我的适应度函数(目标函数)是1/切割速度。
我为我的适应度函数制作了一个matlab函数:
function y = fitness(x)
y = 1/x(1);
end
接下来,我设置设计变量的数量及其上下限:
nvars = 3; % Number of variables
LB = [130 8130 4470]; % Lower bound
UB = [175 11255 8250]; % Upper bound
接下来,我定义了切割宽度的约束条件(我还将为深度添加一个约束条件)。
function [c, ceq] = constraints(net,x)
outs = net(x)
c = [outs(2)+495; outs(2)-505];
% 495 <= outs
% outs <= 505
ceq = [];
end
出问题的就是这个功能!
最后,我做了函数句柄,并开始优化:
[x,fval] = ga(@fitness_func,nvars,[],[],[],[],LB,UB,@(x) ConstraintFunction(net,x));
我尝试为神经网络(net())在约束函数中定义一个独立于x的输入向量-这很好:
dummyInput = [value; value; value];
net(dummyInput);
我和其他人一起得到了一个错误,我的函数约束没有得到足够的输入参数。
问题似乎在于,将动态变化的“x”传递给函数,然后使用一组动态变化的约束的输出对其进行预测。
有什么问题吗?
我一直在用这个和这个来寻找灵感。
感谢任何帮助——抱歉问题太长了。我有几篇关于这个问题的文章——没有一篇解释matlab中的问题,只是程序。
通过最大化1/x,这将为您提供约束保持的最慢切割速度。我想你想让切割速度最大化,而不是最小化。
此外,约束函数也不是真正有效的。约束需要以x的形式给出
然而,在函数中,您可以编写c=[out(2)495; out(2)-505];
,这应该是c=[495-out(2); out(2)-505]
。
关于函数中的额外参数,这个文档可能会有所帮助。