В качестве примера оптимизации целевой функции на языке программирования Python рассмотрим поиск вариантов оптимального раскроя листов материала на заготовки определённого размера с использованием линейного программирования, которое является наиболее простым и лучше всего изученным разделом математического программирования [2,3].
Формальная модель
В ходе производственного процесса из листов материала получают заготовки деталей 2-х типов А и Б тремя различными способами, при этом количество получаемых заготовок при этих способах различны. В таблице на пересечении строк и столбцов записаны количества заготовок типов А и Б при соответствующих способах раскроя (табл. 1).
Таблица 1. Способы раскроя заготовок
Тип заготовки |
Способы раскроя |
||
1-й способ |
2-й способ |
3-й способ |
|
А |
10 |
3 |
8 |
Б |
3 |
6 |
4 |
Необходимо выбрать оптимальное сочетание способов раскроя, для того чтобы получить 500 заготовок типа А и 300 заготовок типа Б при расходовании наименьшего количества листов материала.
Параметрами, значения которых требуется определить, являются количество листов материала, которые будут раскроены различными способами:
X1 – количество листов, раскроенное способом 1;
X2 – количество листов, раскроенное способом 2;
X3 – количество листов, раскроенное способом 3;
Целевая функция, выражающая количество листов материала, которое надо минимизировать, примет вид:
F = X1 + X2 + X3.
Ограничения накладываются требуемыми количествами заготовок типов А и Б, тогда с учётом количества заготовок, получаемых различными способами, должны выполняться два равенства:
10 * X1 + 3 * X2 + 8 * X3 = 500;
3 * X1 + 6 * X2 + 4 * X3 = 300.
Кроме того, количество листов не могут быть отрицательными, поэтому должны выполняться неравенства:
X1 0; X2 0; X3 0.
Таким образом, необходимо найти удовлетворяющие ограничениям значения параметров, при которых целевая функция принимает минимальное значение [2].
Компьютерная модель на языке объектно-ориентированного программирования Python.
Войти в систему объектно-ориентированного программирования Python.
Создать графический интерфейс проекта. Поместить на форму (рис. 1):
пять компонент Label (метки) для добавления текста;
четыре компоненты Entry (текстовые окна) для вывода информации;
кнопку Button для запуска программы (скрипта) [1].
Рис. 1. Графический интерфейс проекта
Ввести программный код с комментариями и использованием трёх вложенных циклов for, которые будут выполняться при заданном условии:
(10 * L2 + 3 * L3 + 8 * L4 == 500) and (3 * L2 + 6 * L3 + 4 * L4 == 300);
В начало программного кода ввести модуль для работы с графикой Tkinter.
Программный код (событийная процедура)
#Оптимизация целевой функции
#Подключить графическую библиотеку Tkinter
from tkinter import *
import tkinter
top=tkinter.Tk()
#Функция пользователя для командной кнопки (скрипт – программный код)
def process():
L2=Entry.get(E1)
L3=Entry.get(E2)
L4=Entry.get(E3)
L5=Entry.get(E4)
#Ввод данных с преобразованием типа (bool)
L2=bool(L2)
L3=bool(L3)
L4=bool(L4)
L5=bool(L5)
for L2 in range(100):
for L3 in range(100):
for L4 in range(100):
#Сложное условие поиска в две строки (перенос через \)
if (10 * L2 + 3 * L3 + 8 * L4 == 500) and \
(3 * L2 + 6 * L3 + 4 * L4 == 300):
Entry.insert(E1,0,L2)
Entry.insert(E2,0,L3)
Entry.insert(E3,0,L4)
Entry.insert(E4,0,L2+L3+L4)
#Чтобы добавить текст, создать 5 компонентов (виджет Label),
#ввести названия и установить их позиции с помощью функции grid()
L1=Label(top,text="Оптимизацияцелевойфункции",).grid(row=0,column=1)
L2=Label(top,text="X1 =",).grid(row=1,column=0)
L3=Label(top,text="X2=",).grid(row=2,column=0)
L4=Label(top,text="X3 =",).grid(row=3,column=0)
L5=Label(top,text="F =",).grid(row=4,column=0)
#Для ввода информации создать 4 компонента (текстовые поля - Entry)
E1=Entry(top,bd =5)
E1.grid(row=1,column=1)
E2=Entry(top,bd =5)
E2.grid(row=2,column=1)
E3=Entry(top,bd =5)
E3.grid(row=3,column=1)
E4=Entry(top,bd =5)
E4.grid(row=4,column=1)
#Создать командную кнопку (виджет – Button), ввести её название – Оптимизировать
B=Button(top,text="Оптимизировать",command = process).grid(row=5,column=1)
#Для работы с окнами (без функции mainloop() на экране проект не отобразится)
top.mainloop()
Компьютерный эксперимент
Запустить скрипт на выполнение, выполнив команду [Run-RunModule (F5)]. Сохранить выполняемый файл. Нажать на командную кнопку Оптимизировать (рис. 2).
Рис. 2. Выполнение скрипта
В текстовые поля будет выведен набор параметров:
X1 – (количество листов, раскроенное способом 1) – 20; X2 – (количество листов, раскроенное способом 2) – 20; X3 – (количество листов, раскроенное способом 3) – 30; Значение целевой функции (общее количество листов) – 70 (рис. 2).
Анализ полученных результатов
Разработка данного проекта основана на математическом программировании (это раздел математики, занимающийся разработкой методов отыскания экстремальных значений функции, на аргументы которой наложены ограничения). Типичным примером такой задачи является рассмотренная в статье организация выпуска продукции на оборудовании различных типов [3].
Рассмотренный вариант работы на языке объектно-ориентированного программирования Python можно применять на уроках информатики в старших классах социально-экономического профиля при изучении ООП. Проведение подобных уроков позволяет получить учащимся дополнительные знания по практическому использованию изучаемого языка.
Список использованных источников и литературы
Tkinter — создание графического интерфейса в Python [Электронный ресурс]. – Режим доступа: https://python-scripts.com/tkinter.
Информатика и ИКТ. Профильный уровень : учебник для 11 класса / Н.Д. Угринович. – 2-е изд., испр. и доп. – М.: БИНОМ. Лаборатория знаний, 2009. – 308 с. : ил.
Оптимизационные модели в экономике. Способы нахождения оптимальных решений [Электронный ресурс].–Режим доступа: https://studopedia.ru/7_133687_optimizatsionnie-modeli-v-ekonomike-sposobi-nahozhdeniya-optimalnih-resheniy.html