我目前正在进行激光切割的工艺优化 - 在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中的问题,只是程序。
答案 0 :(得分:1)
通过最大化1 / x,这将为您提供约束所持有的最慢切割速度。我假设你想要最大化切割速度,而不是最小化它。
此外,您的约束功能并非真正有效。约束需要以x <= 0
的形式给出。因此,如果输出应该是有界的,则约束变为x >= 495 <=> 0 >= 495 - x
和x <= 505 <=> x - 505 <= 0
在您的函数中,您可以编写c = [outs(2)+495; outs(2)-505];
,然后应该c = [495 - outs(2); outs(2) - 505]
。
关于函数中的额外参数,可能此文档可以是help。