我目前正在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));
我已经尝试在独立于x的约束函数内定义神经网络(net())的输入向量-这工作得很好:
dummyInput = [value; value; value];
net(dummyInput);
我在其他人中得到错误,我的函数约束没有得到足够的输入参数。
问题似乎是传递动态变化的"x"给一个函数,然后预测它,使用一组动态变化的约束的输出。
你知道是什么问题吗?
我一直在用这个和这个来寻找灵感。
任何帮助都是感激的-抱歉长时间的问题。我有几篇关于这个问题的文章-没有一篇解释了matlab中的问题,仅仅是过程。
通过最大化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]
。
关于函数中的额外参数,也许这个文档可以提供帮助。