Решение смешанной целочисленной проблемы инженерного проектирования Используя генетический алгоритм

В этом примере показано, как решить смешанную целочисленную задачу инженерного проектирования с помощью Генетического алгоритма (ga) решатель в Global Optimization Toolbox.

Проблема, проиллюстрированная в этом примере, включает проект ступенчатого консольного луча. В частности, луч должен смочь нести предписанную загрузку конца. Мы решим задачу, чтобы минимизировать объем луча, удовлетворяющий различным ограничениям инженерного проектирования.

В этом примере мы решим две ограниченных версии проблемы, опубликованной в [1].

Ступенчатая консольная проблема проектирования луча

Ступенчатый консольный луч поддерживается в одном конце, и загрузка применяется в свободном конце, как показано на рисунке ниже. Луч должен смочь поддержать данную загрузку $P$на фиксированном расстоянии$L$ от поддержки. Разработчики луча могут варьироваться ширина ($b_i$) и высота ($h_i$) каждого раздела. Мы примем, что каждый раздел консоли имеет ту же длину$l$.

Объем луча

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

$$V = l(b_1h_1 + b_2h_2 + b_3h_3 + b_4h_4 + b_5h_5)$$

Ограничения на проект: 1 - изгибающий напряжение

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

$$\sigma_b = M(x)y/I$$

где$M(x)$ изгибающий момент в$x$,$x$ является расстоянием от загрузки конца и$I$ является моментом области инерции луча.

Теперь в ступенчатом консольном показанном на рисунке луче, максимальный момент каждого раздела луча$PD_i$, где$D_i$ максимальное расстояние от загрузки конца $P$для каждого раздела луча. Поэтому максимальное напряжение для$i$-th раздела луча$\sigma_i$, дают

$$\sigma_i = PD_i(h_i/2)/I_i$$

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

$$I_i = b_ih_i^3/12$$

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

$$\sigma_i = 6PD_i/b_ih_i^2$$

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

$$\frac{6Pl}{b_5h_5^2} \leq \sigma_{max}$$

$$\frac{6P(2l)}{b_4h_4^2} \leq \sigma_{max}$$

$$\frac{6P(3l)}{b_3h_3^2} \leq \sigma_{max}$$

$$\frac{6P(4l)}{b_2h_2^2} \leq \sigma_{max}$$

$$\frac{6P(5l)}{b_1h_1^2} \leq \sigma_{max}$$

Ограничения на Проект: 2 - отклонение Конца

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

$$\delta = \frac{\partial U}{\partial P}$$

то, где$\delta$ отклонение луча,$U$ энергия, хранится в луче из-за приложенной силы$P$.

Энергией, сохраненной в консольном луче, дают

$$U = \int_0^L \! M^2/2EI \, \mathrm{d} x$$

где$M$ момент приложенной силы в$x$.

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

$$U =
P^2/2E \int_0^l \! [(x+4l)^2/I_1 \,
 + (x+3l)^2/I_2 \,
 + (x+2l)^2/I_3 \,
 + (x+l)^2/I_4 \,
 + x^2/I_5 ]\, \mathrm{d} x$$

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

$$U = (P^2/2)(l^3/3E)(61/I_1 + 37/I_2 + 19/I_3 + 7/I_4 + 1/I_5)$$

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

$$\delta = Pl^3/3E(61/I_1 + 37/I_2 + 19/I_3 + 7/I_4 + 1/I_5)$$

Теперь отклонение конца консоли$\delta$, должен быть меньше максимального допустимого отклонения$\delta_{max}$, которое дает нам следующее ограничение.

$$Pl^3/3E(61/I_1 + 37/I_2 + 19/I_3 + 7/I_4 + 1/I_5) \leq
\delta_{max}$$

Ограничения на Проект: 3 - Соотношение сторон

Для каждого шага консоли соотношение сторон не должно превышать максимальное допустимое соотношение сторон$a_{max}$. Таким образом,

$h_i/b_i \leq a_{max}$ для $i = 1, ..., 5$

Состояние задача оптимизации

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

Позвольте$x_1 = b_1$$x_2 = h_1$, $x_3 = b_2$$x_4 = h_2$$x_5 = b_3$$x_6 = h_3$$x_7 = b_4$$x_8 = h_4$$x_9 = b_5$и $x_{10} = h_5$

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

$$V = l(x_1x_2 + x_3x_4 + x_5x_6 + x_7x_8 + x_9x_{10})$$

При ограничениях:

$$\frac{6Pl}{x_9x_{10}^2} \leq \sigma_{max}$$

$$\frac{6P(2l)}{x_7x_8^2} \leq \sigma_{max}$$

$$\frac{6P(3l)}{x_5x_6^2} \leq \sigma_{max}$$

$$\frac{6P(4l)}{x_3x_4^2} \leq \sigma_{max}$$

$$\frac{6P(5l)}{x_1x_2^2} \leq \sigma_{max}$$

$$\frac{Pl^3}{E}(\frac{244}{x_1x_2^3} + \frac{148}{x_3x_4^3} +
\frac{76}{x_5x_6^3} + \frac{28}{x_7x_8^3} +
\frac{4}{x_9x_{10}^3}) \leq \delta_{max}$$

$$x_2/x_1 \leq 20$$, $$x_4/x_3 \leq 20$$, $$x_6/x_5 \leq 20$$,
$$x_8/x_7 \leq 20$$ and $$x_{10}/x_9 \leq 20$$

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

$$1 \leq x_1 \leq 5$$

$$30 \leq x_2 \leq 65$$

$$2.4 \leq x_3, x_5 \leq 3.1$$

$$45 \leq x_4, x_6 \leq 60$$

$$1 \leq x_7, x_9 \leq 5$$

$30 \leq x_8, x_{10} \leq 65$

Расчетные параметры для этой проблемы

Для проблемы мы решим в этом примере, загрузка конца, которую должен поддержать луч$P = 50000 N$.

Длины луча и максимальное отклонение конца:

  • Общая длина луча, $L = 500 cm$

  • Отдельный раздел луча, $l = 100 cm$

  • Максимальное отклонение конца луча, $\delta_{max} = 2.7 cm$

Максимальное позволенное напряжение на каждом шаге луча, $\sigma_{max} = 14000 N/cm^2$

Модуль молодежи каждого шага луча, $E = 2\times10^{7} N/cm^2$

Решите смешанную целочисленную задачу оптимизации

Мы теперь решаем задачу, описанную в состоянии Задача оптимизации.

Задайте функции фитнеса и ограничения

Исследуйте файлы MATLAB cantileverVolume.m и cantileverConstraints.m чтобы видеть, как фитнес и ограничительные функции реализованы.

Примечание по линейным ограничениям: Когда линейные ограничения заданы к ga, вы обычно задаете их через AB, 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 опции от их значений по умолчанию и уменьшение EliteCount и FunctionTolerance опции. Эти настройки вызывают 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 решать задачу. В проблемном операторе$x_1$ и$x_2$ целочисленные переменные. Мы задаем это путем передачи вектора индекса [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 отображен ниже. Обратите внимание на то, что раздел, самый близкий, поддержка ограничивается иметь ширину ($x_1$) и высота ($x_2$), который является целочисленным значением, и это ограничение соблюдалось 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

Чтобы решить эту задачу, мы должны смочь задать переменные$x_3$$x_4$, $x_5$и$x_6$ как дискретные переменные. Чтобы задать компонент$x_j$ как принимающий дискретные значения от набора$S = {v_1,\ldots,v_k}$, оптимизируйте с$x_j$ целочисленной переменной, принимающей значения от 1 до$k$, и использование$S(x_j)$ в качестве дискретного значения. Чтобы указать диапазон (1 к$k$), установите 1 как нижняя граница и$k$ как верхняя граница.

Так, сначала мы преобразовываем границы на дискретных переменных. Каждый набор имеет 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];

Преобразованные (целочисленные) версии$x_3$$x_4$, $x_5$и$x_6$ будут теперь переданы фитнесу и ограничительным функциям когда ga решатель называется. Выполнять эти функции правильно$x_3$, $x_4$$x_5$и$x_6$ должно быть преобразовано члену данного дискретного набора в этих функциях. Чтобы видеть, как это сделано, исследуйте файлы MATLAB cantileverVolumeWithDisc.m, cantileverConstraintsWithDisc.m и cantileverMapVariables.m.

Теперь мы можем вызвать ga решать задачу с дискретными переменными. В этом случае$x_1, ..., x_6$ целые числа. Это означает, что мы передаем вектор индекса 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 как целые числа (i.e. в их преобразованном состоянии). Мы должны инвертировать преобразование, чтобы получить значение в их технических модулях.

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 соблюдает ограничение это$x_1$ и$x_2$ целые числа. Мы можем также видеть, что$x_3$,$x_5$ выбраны из набора [2.4, 2.6, 2.8, 3.1] cm и$x_4$,$x_6$ выбраны из набора [45, 50, 55, 60] cm.

Вспомните, что мы добавили дополнительные ограничения на переменные x(3), x(4), x(5) и x(6). Как ожидалось, когда существуют дополнительные дискретные ограничения на эти переменные, оптимальное решение имеет более высокий минимальный объем. Обратите внимание далее, что решение, о котором сообщают в [1], имеет минимальный объем$64558 cm^3$ и что мы находим решение, которое является приблизительно тем же самым, как это сообщило в [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)

Похожие темы