Скачиваний:
22
Добавлен:
01.05.2014
Размер:
292.35 Кб
Скачать

Пользование программой

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

Постепенное уточнение

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

Программа Алгоритм планирования

Алгоритм составления оптимального плана стоит рассмотреть подробно. Процедура "найти_оптимальное_распределение" является декларативным интерфейсом между планирующей компонентой и остальной частью программы. Распределение операторов по установкам на целую смену описывается переменной «ОпПуть». С этой переменной связана переменная «НакопПуть», описывающая положение заказов в накопителях во время смены. Информация, которую несет переменная «НакопПуть», получается в результате распределений, описываемых переменной « ОпПуть ». Переменная « ЗакНакопители » (итоговый список накопителей) является последним элементом списка « НакопПуть » и она описывает положение всех заказов в конце смены. Процедура "индекс_спис-ка_накопителей" вычисляет значение переменной «ЗакНакопители» и присваивает ей значение индекса. Чем больше работы будет сделано к концу смены, тем выше будет значение индекса.

Процедура "найти_оптимальное _распределение"

Процедура "найти_оптимальное_распределение" начинает свою работу с добавления факта "оптимальный_план" со значением индекса, равным нулю. Затем она вызывает процедуру "найти_распределение", которая вырабатывает пробный план и возвращает его через переменную «ОпПуть» и связанные с ней переменные «ЗакНакопители» и «НакопПуть». Вычисляется значение индекса для «ЗакНакопители». Затем это значение сравнивается со значением индекса, содержащимся в факте "оптимальный_план". Если индекс для «ЗнакНакопители» будет более высоким, то текущий факт "оптимальный_ план" будет заменен на одноименный факт, содержащий текущие значения переменных «ОпПуть» и «НакопПуть». Затем процедура "найти_оптимальное_распределение" возвратится назад к процедуре "найти распределение" с тем, чтобы получить еще один пробный план. Если значение индекса для нового плана окажется более высоким, чем значение индекса, хранящееся в текущем факте "оптимальный_план", то этот факт будет заменен на новый, содержащий новый план. (Обратите внимание на сходство описываемого метода с одним из решений упражнения 4.1.) Данный процесс будет продолжаться до тех пор, пока процедура "найти_распределение" не сгенерирует все возможные варианты плана. После этого второе правило процедуры "найти_оптимальное_распределение" возвратит план, содержащийся в последнем добавленном в программу факте "оптимальный_план".

Процедура "распределить _операторов "

Процедура "найти_распределение" вызывает процедуру "распре-делить_операторов" с тем, чтобы отыскать распределение операторов на один час рабочей смены. Алгоритм работы процедуры "распределить_операторов" основан на нескольких эвристических предположениях. Во-первых, каждый из присутствующих операторов должен быть приставлен к какой-нибудь производственной установке в течение каждого часа рабочей смены. Во-вторых, если в каком-либо накопителе имеются изделия, подлежащие обработке, то по крайней мере один оператор должен быть приставлен к установке, которая обрабатывает изделия, поступающие из этого накопителя. Две данные эвристики исключают из рассмотрения многие бесполезные планы. Если мастер не хочет в течение нескольких часов смены трогать заказы, собирающиеся в одном из промежуточных накопителей, то он может выполнить одно из следующих действий:

1) удалить соответствующие факты "заказ" из базы данных и после этого выработать план; или

2) скорректировать выработанный программой план и снять с нужной установки всех операторов.

Процедура "найти_распределение" рекурсивно вызывает сама себя по одному разу на каждый час рабочей смены. После вызова процедуры "распределить_операторов" для отыскания распределения операторов по установкам на один час, она вызывает процедуру "от_накопит_к_на-копит", чтобы вычислить объем работы, который будет выполнен за этот час при данном распределении операторов. (После этого процедура "найти_распределение" может возвратиться назад к процедуре "распреде-лить_операторов" с тем, чтобы найти иное распределение.) Как и процедура "распределить_операторов", процедура "от_накопит_к_накопит" рекурсивно вызывает себя по одному разу на каждый накопитель. Процедура "от_сост_к_сост" вызывает процедуру "от_зака-за_ к _ заказу", которая рекурсивно вызывает сама себя по одному разу на каждый заказ, находящийся в накопителе. Процедура "от_зака-за__к_заказу" всегда отдает приоритет в использовании установки первому заказу из полученного списка. Остальные заказы будут обрабатываться только после обработки первого.

Соседние файлы в папке Гл.6,7,Прилож.,Допол