Этот пример показывает, как решить смешанную целочисленную проблему инженерного проектирования с помощью Генетического алгоритма (ga) решатель в Global Optimization Toolbox.
Проблема, проиллюстрированная в этом примере, включает проект ступенчатого консольного луча. В частности, луч должен смочь нести предписанную загрузку конца. Мы решим проблему минимизировать объем луча, подвергающийся различным ограничениям инженерного проектирования.
В этом примере мы решим две ограниченных версии проблемы, опубликованной в [1].
Ступенчатый консольный луч поддерживается в одном конце, и загрузка применяется в свободном конце, как показано в фигуре ниже. Луч должен смочь поддержать данную загрузку
на фиксированном расстоянии
от поддержки. Разработчики луча могут отличаться ширина (
) и высота (
) каждого раздела. Мы примем, что каждый раздел консоли имеет ту же длину
.

Объем луча
Объем луча
, сумма объема отдельных разделов

Ограничения на проект: 1 - изгибающий напряжение
Рассмотрите один консольный луч с центром координат в центре его сечения в свободном конце луча. Изгибающееся напряжение в точке
в луче дано следующим уравнением

где
изгибающий момент в
,
является расстоянием от загрузки конца и
является моментом области инерции луча.
Теперь, в ступенчатом консольном луче, показанном в фигуре, максимальный момент каждого раздела луча
, где
максимальное расстояние от загрузки конца
для каждого раздела луча. Поэтому максимальное напряжение для
-th раздела луча
, дают

где максимальное напряжение появляется в ребре луча
. Моментом области инерции
-th раздела луча дают

Замена этим в уравнение для
дает

Изгибающееся напряжение в каждой части консоли не должно превышать максимальное допустимое напряжение
. Следовательно, мы можем наконец утвердить пять изгибающихся ограничений напряжения (один для каждого шага консоли)





Ограничения на Проект: 2 - отклонение Конца
Отклонение конца консоли может быть вычислено с помощью второй теоремы Кастиглиано, которая утверждает это

то, где
отклонение луча,
энергия, хранится в луче из-за приложенной силы
.
Энергией, сохраненной в консольном луче, дают

где
момент приложенной силы в
.
Учитывая, что
для консольного луча, мы можем записать вышеупомянутое уравнение как

где
момент области инерции
-th части консоли. Оценка интеграла дает следующее выражение для
.

Применяя теорему Кастиглиано, отклонением конца луча дают

Теперь, отклонение конца консоли
, должны быть меньше, чем максимальное допустимое отклонение
, которое дает нам следующее ограничение.

Ограничения на Проект: 3 - Соотношение сторон
Для каждого шага консоли соотношение сторон не должно превышать максимальное допустимое соотношение сторон
. Таким образом,
для 
Мы теперь можем утвердить проблему найти, что оптимальные параметры для ступенчатой консоли излучают, учитывая установленные ограничения.
Позвольте
, 





и 
Минимизируйте:

Согласно:







Первый шаг луча может только быть обработан машинным способом к самому близкому сантиметру. Таким образом,
и
должно быть целое число. Остающиеся переменные непрерывны. Границы на переменных даны ниже:-






Разработайте Параметры для этой проблемы
Для проблемы мы решим в этом примере, загрузка конца, которую должен поддержать луч
.
Длины луча и максимальное отклонение конца:
Общая длина луча, 
Отдельный раздел луча, 
Максимальное отклонение конца луча, 
Максимальное позволенное напряжение на каждом шаге луча, 
Модуль молодежи каждого шага луча, 
Мы теперь решаем проблему, описанную в состоянии Задача оптимизации.
Задайте функции фитнеса и ограничения
Исследуйте файлы MATLAB cantileverVolume.m и cantileverConstraints.m, чтобы видеть, как фитнес и ограничительные функции реализованы.
Примечание по линейным ограничениям: Когда линейные ограничения заданы к ga, вы обычно задаете их через A, b, Aeq и входные параметры beq. В этом случае мы задали их через нелинейную ограничительную функцию. Это вызвано тем, что позже в этом примере, некоторые переменные станут дискретными. Когда существуют дискретные переменные в проблеме, намного легче задать линейные ограничения в нелинейной ограничительной функции. Альтернатива должна изменить линейные ограничительные матрицы, чтобы работать на преобразованном переменном пробеле, который не тривиален и возможно не возможен. Кроме того, в смешанном целочисленном решателе ga линейные ограничения не обработаны никто по-другому к нелинейным ограничениям независимо от того, как они заданы.
Установите границы
Создайте векторы, содержащие нижнюю границу (lb) и ограничения верхней границы (ub).
lb = [1 30 2.4 45 2.4 45 1 30 1 30]; ub = [5 65 3.1 60 3.1 60 5 65 5 65];
Установите опции
Чтобы получить более точное решение, мы увеличиваем PopulationSize и опции MaxGenerations от их значений по умолчанию, и уменьшаем опции FunctionTolerance и EliteCount. Эти настройки заставляют ga использовать более многочисленную генеральную совокупность (увеличил PopulationSize), чтобы увеличить поиск пробела проекта (уменьшал EliteCount), и продолжить идти, пока его лучший участник не изменяется очень мало (небольшой FunctionTolerance). Мы также задаем функцию построения графика, чтобы контролировать значение функции штрафа, в то время как ga прогрессирует.
Обратите внимание на то, что существует ограниченный набор опций ga, доступных, когда решение смешанных целочисленных проблем - дополнительную информацию см. в Руководстве пользователя Global Optimization Toolbox.
opts = optimoptions(@ga, ... 'PopulationSize', 150, ... 'MaxGenerations', 200, ... 'EliteCount', 10, ... 'FunctionTolerance', 1e-8, ... 'PlotFcn', @gaplotbestf);
Вызовите ga, чтобы решить проблему
Мы можем теперь вызвать ga, чтобы решить проблему. В проблемном операторе
и
целочисленные переменные. Мы задаем это путем передачи индексного вектора [1 2] ga после того, как нелинейное ограничение ввело и прежде чем опции введут. Мы также отбираем и устанавливаем генератор случайных чисел здесь для воспроизводимости.
rng(0, 'twister'); [xbest, fbest, exitflag] = ga(@cantileverVolume, 10, [], [], [], [], ... lb, ub, @cantileverConstraints, [1 2], opts);
Optimization terminated: maximum number of generations exceeded.

Анализ результатов
Если проблема имеет целочисленные ограничения, ga повторно формулирует ее внутренне. В частности, функция фитнеса в проблеме заменяется функцией штрафа, которая обрабатывает ограничения. Для выполнимых членов генеральной совокупности функция штрафа совпадает с функцией фитнеса.
Решение, возвращенное в ga, отображено ниже. Обратите внимание на то, что раздел, самый близкий, поддержка ограничивается иметь ширину (
) и высота (
), который является целочисленным значением, и это ограничение соблюдалось GA.
display(xbest);
xbest =
Columns 1 through 7
3.0000 60.0000 2.8326 56.6516 2.5725 51.4445 2.2126
Columns 8 through 10
44.2423 1.7512 34.9805
Мы можем также попросить, чтобы ga возвратил оптимальный объем луча.
fprintf('\nCost function returned by ga = %g\n', fbest);
Cost function returned by ga = 63196.6
Инженерам теперь сообщают, что вторые и третьи шаги консоли могут только иметь ширины и высоты, которые выбраны из стандартного набора. В этом разделе мы показываем, как добавить это ограничение в задачу оптимизации. Обратите внимание на то, что со сложением этого ограничения, эта проблема идентична решенному в [1].
Во-первых, мы утверждаем дополнительные ограничения, которые будут добавлены к вышеупомянутой оптимизации
Ширина вторых и третьих шагов луча должна быть выбрана из следующего набора:-[2.4, 2.6, 2.8, 3.1] cm
Высота вторых и третьих шагов луча должна быть выбрана из следующего набора:-[45, 50, 55, 60] cm
Чтобы решить эту проблему, мы должны смочь задать переменные
,
и
как дискретные переменные. Чтобы задать компонент
как принимающий дискретные значения от набора
, оптимизируйте с
целочисленной переменной, принимающей значения от 1 до
, и использование
в качестве дискретного значения. Чтобы задать область значений (1 к
), установите 1 как нижняя граница и
как верхняя граница.
Так, сначала мы преобразовываем границы на дискретных переменных. Каждый набор имеет 4 участников, и мы сопоставим дискретные переменные с целым числом в области значений [1, 4]. Так, чтобы сопоставить эти переменные, чтобы быть целым числом, мы устанавливаем нижнюю границу на 1 и верхнюю границу к 4 для каждой из переменных.
lb = [1 30 1 1 1 1 1 30 1 30]; ub = [5 65 4 4 4 4 5 65 5 65];
Преобразованные (целочисленные) версии
,
и
будут теперь переданы фитнесу и ограничительным функциям, когда решатель ga будет назван. Выполнять эти функции правильно
, 
и
должно быть преобразовано члену данного дискретного набора в этих функциях. Чтобы видеть, как это сделано, исследуйте файлы MATLAB cantileverVolumeWithDisc.m, cantileverConstraintsWithDisc.m и cantileverMapVariables.m.
Теперь мы можем вызвать ga, чтобы решить проблему с дискретными переменными. В этом случае
целые числа. Это означает, что мы передаем индексный вектор 1:6 ga, чтобы задать целочисленные переменные.
rng(0, 'twister'); [xbestDisc, fbestDisc, exitflagDisc] = ga(@cantileverVolumeWithDisc, ... 10, [], [], [], [], lb, ub, @cantileverConstraintsWithDisc, 1:6, opts);
Optimization terminated: maximum number of generations exceeded.

Анализ результатов
xbestDisc(3:6) возвращен в ga как целые числа (т.е. в их преобразованном состоянии). Мы должны инвертировать преобразование, чтобы получить значение в их технических модулях.
xbestDisc = cantileverMapVariables(xbestDisc); display(xbestDisc);
xbestDisc =
Columns 1 through 7
3.0000 60.0000 3.1000 55.0000 2.8000 50.0000 2.3036
Columns 8 through 10
43.6153 1.7509 35.0071
Как прежде, решение, возвращенное в ga, соблюдает ограничение это
и
является целыми числами. Мы можем также видеть, что
,
выбраны из набора [2.4, 2.6, 2.8, 3.1] cm и
,
выбраны из набора [45, 50, 55, 60] cm.
Вспомните, что мы добавили дополнительные ограничения на переменные x(3), x(4), x(5) и x(6). Как ожидалось, когда существуют дополнительные дискретные ограничения на эти переменные, оптимальное решение имеет более высокий минимальный объем. Обратите внимание далее, что решение, о котором сообщают в [1], имеет минимальный объем
и что мы находим решение, которое является приблизительно тем же самым, как это сообщило в [1].
fprintf('\nCost function returned by ga = %g\n', fbestDisc);
Cost function returned by ga = 65226.5
Этот пример иллюстрирует, как использовать решатель генетического алгоритма, ga, чтобы решить ограниченную нелинейную задачу оптимизации, которая имеет целочисленные ограничения. Пример также показывает, как решить проблемы, которые имеют дискретные переменные в проблемной формулировке.
[1] Обзор дискретной переменной оптимизации для проектирования конструкций, П.Б. Тэнедэра, Г.Н. Вэндерплээтса, J. Struct (). Инженер, 121 (3), 301-306 (1995)