Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
40_алгоритмов_Python.pdf
Скачиваний:
9
Добавлен:
07.04.2024
Размер:
13.02 Mб
Скачать

116

Глава 4. Разработка алгоритмов

Определение ограничений

При попытке минимизировать или максимизировать что-либо на практике не­ обходимо принимать во внимание определенные ограничения. Например, если мы хотим затратить минимум времени на ремонт автомобиля, мы должны учи­ тывать ограниченный штат доступных механиков. Указание каждого ограниче­ ния с помощью линейного уравнения очень важно при формулировании задачи линейного программирования.

ПРАКТИЧЕСКОЕ ПРИМЕНЕНИЕ — ПЛАНИРОВАНИЕ ПРОИЗВОДСТВА С ПОМОЩЬЮ ЛИНЕЙНОГО ПРОГРАММИРОВАНИЯ

Рассмотрим практический пример использования линейного программирования для решения реальной задачи. Предположим, что нам требуется максимизиро­ вать прибыль современной фабрики, которая производит два типа роботов:

zz Улучшенная модель (A). Робот содержит полный набор функций. Производ­ ство каждой единицы улучшенной модели приносит прибыль в размере 4200 долларов.

zzБазовая модель (B). Она обеспечивает только базовую функциональность. Производство каждой единицы базовой модели приводит к прибыли в раз­ мере 2800 долларов.

Для изготовления каждого робота необходимы три типа специалистов и опре­ деленное количество дней. Эти данные представлены в следующей таблице (табл. 4.3).

Таблица 4.3

Тип робота

Техник

Специалист по ИИ

Инженер

 

 

 

 

Робот А: улучшенная

3 дня

4 дня

4 дня

модель

 

 

 

 

 

 

 

Робот B: базовая модель

2 дня

3 дня

3 дня

 

 

 

 

Фабрика работает по 30-дневным циклам. Один специалист по ИИ доступен в течение 30 дней в цикле. Каждый из двух инженеров возьмет по 8 выходных

Практическое применение — планирование производства

117

дней в течение 30 дней. Таким образом, инженер доступен только в течение 22 дней в цикле. Имеется один техник, доступный в течение 20 дней в 30-днев­ ном цикле.

В табл. 4.4 показано количество сотрудников, работающих на нашей фабрике.

Таблица 4.4

 

Техник

Специалист по ИИ

Инженер

 

 

 

 

Количество человек

1

1

2

 

 

 

 

Общее количество дней

1 × 20 = 20 дней

1 × 30 = 30 дней

2 × 22 = 44 дня

в цикле

 

 

 

 

 

 

 

Смоделировать это можно следующим образом:

zz Максимальная прибыль = 4200A + 2800B. zz Результат зависит от следующих условий:

yy A ≥0: Количество произведенных улучшенных роботов может быть 0 или более.

yy B ≥ 0: Количество произведенных базовых роботов может быть 0 или более.

yy 3A + 2B ≤ 20: Ограничения, связанные с доступностью техника.

yy 4A+3B ≤ 30: Ограничения‚ связанные с доступностью специалиста по ИИ.

yy 4A+ 3B ≤ 44: Ограничения‚ связанные с доступностью инженеров.

В первую очередь импортируем библиотеку Python под названием pulp, пред­ назначенную для реализации линейного программирования:

import pulp

Затем для создания экземпляра класса для решения задачи вызовем функцию этой библиотеки — LpProblem. Назовем экземпляр Profit maximizing problem (задачей максимизации прибыли):

# Создание экземпляра класса для решения задчи

model = pulp.LpProblem("Profit maximising problem", pulp.LpMaximize)

118

Глава 4. Разработка алгоритмов

Далее определим две линейные переменные, A и B. Переменная A представляет собой количество произведенных улучшенных роботов, а переменная B — ко­ личество произведенных базовых роботов:

A = pulp.LpVariable('A', lowBound=0, cat='Integer')

B = pulp.LpVariable('B', lowBound=0, cat='Integer')

Определим целевую функцию и ограничения следующим образом:

# Целевая функция

model += 5000 * A + 2500 * B, "Profit"

# Ограничения

model += 3 * A + 2 * B <= 20 model += 4 * A + 3 * B <= 30 model += 4 * A + 3 * B <= 44

Для генерации решения используем функцию solve:

# Решение задачи model.solve() pulp.LpStatus[model.status]

Затем выведем значения A и B и значение целевой функции (рис. 4.12).

Рис. 4.12

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

Вот мы и добрались до конца главы! Давайте подведем итоги.

Резюме

119

РЕЗЮМЕ

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

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