exponenta event banner

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

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

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

В этом примере мы решим две ограниченные версии задачи, опубликованной в [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$сечения балки,, $\sigma_i$задается как

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

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

$$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$й части консоли. Оценка интеграла дает следующее выражение для.$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, вы обычно указываете их через 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 от их значений по умолчанию и уменьшите EliteCount и FunctionTolerance варианты. Эти параметры вызывают ga использовать большую популяцию (увеличенный размер), увеличить поиск пространства дизайна (уменьшенный номер элемента EliteCount) и продолжать работу до тех пор, пока его лучший элемент не изменится очень мало (маленький FuncureTolerance). Также определяется функция графика для контроля значения штрафной функции как ga прогрессирует.

Обратите внимание, что существует ограниченный набор ga параметры, доступные при решении проблем со смешанными целыми числами - дополнительные сведения см. в Руководстве пользователя Global Optimization Toolbox.

opts = optimoptions(@ga, ...
                    'PopulationSize', 150, ...
                    'MaxGenerations', 200, ...
                    'EliteCount', 10, ...
                    'FunctionTolerance', 1e-8, ...
                    'PlotFcn', @gaplotbestf);

Звонить ga Для решения проблемы

Теперь мы можем позвонить ga для решения проблемы. В инструкции problem$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] см

  • Высота второй и третьей ступеней балки должна выбираться из следующего набора: - [45, 50, 55, 60] см

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

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] см и, $x_4$выбираются $x_6$из набора [45, 50, 55, 60] см.

Напомним, что мы добавили дополнительные ограничения на переменные 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] Исследование оптимизации дискретных переменных для проектирования конструкций, П. Б. Танедар, Г. Н. Вандерплаац, Дж. Структур, англ., 121 (3), 301-306 (1995)

Связанные темы