Связь ввода с выводом с помощью нейронной сети и оптимизация ввода с использованием генетического алгоритма

В настоящее время я занимаюсь оптимизацией процессов лазерной резки в MATLAB. Я пытаюсь связать параметры процесса с качеством резки, например:

Входные данные (параметры процесса)

  1. Скорость резки
  2. Мощность лазера
  3. Вспомогательное давление газа

Выходные данные (параметры качества)

  1. Глубина резания
  2. Ширина реза

Сначала я тренирую модель нейронной сети, чтобы предсказать качество резки на основе параметров процесса.

[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, а только процедуру.


person Emil Nielsen    schedule 26.03.2013    source источник
comment
MATLAB предназначен для обработки переменных, имеющих такое динамическое поведение. Не могли бы вы быть более конкретным?   -  person Roney Michael    schedule 26.03.2013


Ответы (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].

Что касается дополнительного параметра в вашей функции, возможно, этот документ может иметь вид помощь.

person Andreas    schedule 14.04.2013
comment
Верно подмечено. Я понял, что сделал ограничения неправильно, когда начал оптимизировать. Теперь это работает, я просто неправильно использовал дескриптор функции. - person Emil Nielsen; 18.04.2013
comment
Итак, если этого ответа достаточно для вопроса, возможно, вы тоже можете его принять. - person Andreas; 18.04.2013