Вы находитесь на странице: 1из 74

150

Раздел 3. Модели управления запасами

Стратегия управления запасами


Проблемы управления запасами возникают на предприятии в самых
различных ситуациях. Это могут быть запасы готовой продукции,
производимой предприятием. Это могут быть запасы исходного сырья и
материалов, инструментов и запчастей. На предприятии возникают и
внутренние запасы полуфабрикатов, производимых данным предприятием и
используемых здесь же. Все эти различные виды запасов, возникающие по
разным причинам в различных многообразных ситуациях, объединяет общая
проблематика. Как организовать процесс принятия управленческих решений
таким образом, чтобы не возникало перебоев в снабжении товарами? Как при
этом добиться минимизации издержек, связанных с запасами? Другими
словами, как управлять запасами?
Возникающие здесь ситуации достаточно многообразны, и мы не получим
единого рецепта, пригодного во всех случаях. Однако мы сформируем общий
подход к решению возникающих здесь проблем. Этот подход позволит
разобраться в сплетении различных факторов, влияющих на ситуацию,
построить ее модель в аналитической или имитационной форме, получить
расчетные материалы для анализа и принятия решений по оптимизации запасов.
V

На рис. 3.1 представлена типичная картина динамики складских запасов,


график изменения их объема во времени. Объем запасов постепенно убывает в
соответствии со спросом. В некоторые моменты времени (на графике это
151

моменты ti, t2, t3) на склад поступают поставки (объема Vi, V2, Уз). Размер
поставки соответствует длине вертикального отрезка. Запас вырастает на
величину поставки.
Поставка в момент ti поступила, когда на складе еще оставались запасы.
Поставка в момент t2 пришла в ситуации дефицита (запасы отрицательны, у
склада имеется задолженность перед спросом, удовлетворяемая из пришедшей
поставки). Поставка в момент t3 застала ситуацию, когда запасы как раз
исчерпались.
Размеры поставок могут быть различными, сами поставки могут поступать
на склад нерегулярно.
Формируя стратегию управления запасами, мы, в общем случае, стремимся
управлять дискретными поставками, стремясь приспособиться к
неуправляемому, но прогнозируемому спросу.
Стратегия управления запасами - это последовательность решений,
определяющих моменты поставок и их объемы. Таким образом, стратегия
отвечает на два вопроса: Когда? и Сколько?
Качество стратегии управления запасами характеризуется издержками.
Стратегия эффективна, когда издержки минимальны.
Издержки связаны с поставками и хранением запасов, а также с дефицитом.
Рассмотрим работу системы в отсутствие дефицита.
Издержки по поставкам подразделяются на постоянную и переменную
составляющую.
Постоянные издержки по поставкам - это издержки, не зависящие от
размеров поставки. К ним относятся организация заказа, телефонные
переговоры, командировочные и частично транспортные расходы и т.д. Такие
издержки, в расчете на единицу времени, будут большими, если поставки
организуются часто (вне зависимости от их объемов), и малыми, если поставки
происходят редко. Эти издержки зависят от принимаемых решений, релевантны
разрабатываемой стратегии. Они должны быть включены в анализ
разрабатываемой стратегии управления запасами.
Обозначим такие затраты посредством а.
Переменные издержки по поставкам - это затраты на закупку товара,
страховые и таможенные сборы, исчисляемые как процент от стоимости товара
и другие издержки такого рода. Рассмотрим длительный промежуток времени.
В условиях бездефицитной работы система должна покрыть весь объем спроса
за это время. Объем спроса не зависит решений по поставкам, от того,
большими или малыми партиями, редко или часто будет пополняться запас. А
переменные издержки по поставкам определяются объемом спроса. Таким
образом, они ирреле- вантны разрабатываемой стратегии управления запасами,
и по этой причине их можно вынести за рамки анализа при разработке решений
152

по поставкам.
Издержки по хранению также подразделяются на постоянную и
переменную составляющую.
Постоянные издержки по хранению - это издержки, не зависящие от
объемов хранимого запаса. Они связаны, в первую очередь, с арендой складских
площадей, оплатой работы персонала, оплатой коммунальных услуг, охраны
помещений. Такие издержки не меняются при изменении решений по
поставкам, не зависят от этих решений. Они иррелевантны разрабатываемой
стратегии управления запасами, и по этой причине их можно устранить из
дальнейшего анализа.
Переменные издержки по хранению - это издержки, зависящие от объемов
хранимого запаса. Они пропорциональны размерам запаса и срокам хранения.
Сюда попадают упущенная выгода от замораживания оборотных средств,
страховка запаса, оплата работ по предпродажной подготовке, перефасовке
товара и т.д. Это релевантные издержки.
Затраты по хранению единицы продукции в течение единицы времени
обозначим посредством Ь. Традиционно эта величина выражается как
определенный процент i от цены (стоимости единицы) запаса с:
b = ic.
Дефицит связан с многообразными потерями - потерей не только текущей
выгоды, но и будущих возможностей, упущенными клиентами, потерей
перспективы. Мы начнем изучение предположения о недопустимости дефицита,
затем перейдем к моделированию более сложных ситуаций, когда дефицит
допускается, но за него приходится платить.
Таким образом, в дальнейшем анализе участвуют две величины: величина а
постоянных затрат по поставкам и величина b - коэффициент переменных
затрат по хранению.
Отметим, что в анализ включаются только затраты, зависящие от решений
по поставкам. Затраты, иррелевантные таким решениям, не зависящие от них, в
анализ не включаются.
Например, размер арендуемых складских площадей обычно не поддается
подгонке под объем хранимого запаса, поэтому арендная плата не войдет в
оптимизационные расчеты. Затраты по стоимости товара определяются спросом
и тоже непосредственно не входят в оптимизационные расчеты. Однако если
размер площадей можно регулировать, то это следует учитывать в составе
переменных затрат. Если стоимость партии не пропорциональна ее размеру
(например, в связи с оптовой скидкой) или если цена изменяется во времени
(например, цена сельскохозяйственной продукции), то это также следует
включить в оптимизационные расчеты.
153

В качестве критерия оптимальности рассматриваются средние издержки за


единицу времени. Эту величину следует минимизировать.
Если за время t возникло п поставок, то общие издержки за это время
составят величину R:
t
R(t) = а х n(t) + b х [ V(x)dx.
о
Средние издержки за единицу времени составят величину M(t):
R(t)
M(t) =
t
Оптимизируемая величина не должна зависеть от выбора того или иного
конкретного отрезка времени t, поэтому в качестве критерия рассматривается
величина L:
L = limM(t).

t—>со

Модели одного товара

Простейшая модель и формулы Уилсона


Начнем с простейшей модели, предполагающей отсутствие неоп-
ределенностей. Мы увидим далее, что эта модель лежит в основе других,
существенно более сложных и развитых моделей управления запасами.
Продукция поступает на склад, хранится там и уходит со склада в
соответствии со спросом. В простейшей модели все полностью прогнозируемо,
интенсивность спроса известна и постоянна. Обозначим ее посредством а. Таким
образом, в единицу времени со склада уходит а единиц продукции.
Запас на складе пополняется периодически и одинаковыми поставками
(партиями). Пусть Т - период времени между поставками (длина цикла), Q -
размер партии. Типичная динамика величины складского запаса V во времени
представлена на рис. 3.2.
Дефицит (неудовлетворенный спрос) в простейшей модели рас-
сматривается как явление недопустимое.
Слишком ранний приход поставки, когда запас еще имеется, не выгоден,
поскольку приходится хранить лишний запас (и раньше времени оплачивать
поставку).
Поскольку неопределенность отсутствует, то все можно спрогнозировать и
154

рассчитать. Очередная партия должна приходить в момент, когда запас на


складе опускается в точности до 0. В момент поставки размер запаса
поднимается вверх на величину поставки Q и затем расходуется с постоянной
интенсивностью а. Величина а определяет угол наклона прямых на графике.
Поскольку интенсивность постоянна, то наклонные прямые параллельны.

Рис. 3.2. Динамика складского запаса в простейшей модели

Размер партии и длина цикла связаны соотношением:


Q = аТ.
Можно пополнять запас большими партиями через длинные промежутки
времени, а можно - малыми партиями и через короткие промежутки. Задача в
том, чтобы определить оптимальный размер партии (и, соответственно,
оптимальную длину цикла).
Рассмотрим средние затраты в единицу времени. Поскольку ситуация
циклически повторяется, то оптимизационные расчеты достаточно провести для
одного цикла. На промежутке времени Т постоянная составляющая затрат равна
а (одна поставка), переменная составляющая затрат равна 0,5xQxTxb (площадь
треугольника, умноженная на коэффициент Ь). Общие затраты на промежутке Т
равны сумме этих двух составляющих, а средние затраты L в единицу времени
определяются формулой:
. a + 0,5QTb a + 0,5baT2 а т
L =------- --------=--------- ---------= — + 0,5ЬаТ.
’ ’

т т т
Полученное выражение содержит сумму двух слагаемых. Первое
слагаемое, а / Т, определяется постоянной составляющей затрат и представляет
собой обратно пропорциональную зависимость от Т. Второе слагаемое, 0,5ЬаТ,
определяется переменной составляющей затрат и представляет собой прямо
пропорциональную зависимость от Т.
155

При коротких циклах Т (частые поставки небольшими партиями) затраты


будут значительными за счет первого слагаемого. При длинных циклах Т
(редкие поставки крупными партиями) - за счет второго. Сумма этих слагаемых
достигает минимума при некоторой промежуточной длине цикла Т* (рис. 3.3).

Рис. 3.3. Графики затрат


Для того чтобы рассчитать оптимальный цикл Т*, достаточно про-
дифференцировать полученное выражение для затрат L и приравнять
производную нулю. Получим:
156

L' = —^- + 0,5boc = 0

Отсюда
Поскольку отрицательное значение Т смысла не имеет, в качестве
оптимальной длины цикла Т* получаем единственную величину:
Т* _ 2а
V ba ‘
Вспомним, что размер партии и длина цикла связаны соотношением Q =
аТ. Отсюда для оптимального размера партии Q* получаем:

Q* = аТ* = а — = — .
VЬ V ba
Оптимальный размер партии в этих условиях называется также
экономичным объемом заказа (economic order quantity - EOQ).
Для получения минимальных средних затрат в единицу времени L* следует
подставить Т* в указанную выше формулу для L. В результате получим:

L* = — + 0,5baT* = -=£== + 0 , 5 Ь а Л = ^2аЬа + ^2аЬа = -v/2aba .


Т* Г2а V Ьа 2 2

Отметим, что два слагаемых, соответствующих постоянной и переменной


составляющей затрат, оказались равны друг другу (это отчетливо проявляется
на предпоследнем шаге преобразований). Таким образом, минимум затрат
соответствует балансу постоянной и переменной составляющей. На рис. 3.3
точка минимума общих затрат лежит прямо над точкой пересечения линий
постоянных и переменных затрат.
Полученные формулы для Т*, Q*, L* называются формулами Уилсона
{Wilson). Они действительны для простейшей модели, соответствующей весьма
жестким предположениям. Однако формулы для других, сложных моделей,
гораздо более приближенных к реальности, обычно оказываются
модификациями формул Уилсона. В этом смысле формулы Уилсона имеют
базовый характер.
Величина L не включает непосредственно затраты, связанные со
стоимостью товара. Для обеспечения спроса в единицу времени требу
157

ется а единиц товара. Пусть товар покупается по цене с. Тогда затраты по


стоимости товара равны са. Обозначим посредством L средние издержки в
единицу времени с учетом стоимости партии. Тогда:
L = L + са.
При реализации оптимальной стратегии получаем:
L* = L* + са.
Поставка партии на склад требует определенного времени. Поэтому заказ
на поставку подается с упреждением. Обозначим срок поставки (<период
упреждения) посредством т. В зависимости от конкретных условий он может
измеряться минутами, часами, днями, неделями.
Для того чтобы заказанная партия поступила точно в требуемый момент,
заказ следует подавать заранее, за время т до этого момента. Предположим, что
срок выполнения заказа т меньше длины цикла Т. В момент поступления объем
запаса должен быть равен 0. Следовательно, в момент подачи заказа объем
запаса на складе должен составлять величину К, определяемую формулой:
К = т х а.
Эта величина К называется критическим объемом (или критическим
уровнем) запаса.
В общем случае, когда срок поставки т может оказаться как меньше, так и
больше длины цикла Т, критический уровень запаса рассчитывается по
формуле:
К = т'ха,
где
т' = т - Т х ЦЕЛОЕ(т / Т).

Пример 3.1. Торговые запасы


Предположим, что магазин продает в среднем 10 ящиков пива в день,
затраты на доставку партии пива в магазин составляют 50 руб., затраты на
хранение пива оцениваются в 10 коп. за ящик в день. Требуется рассчитать
оптимальный размер и периодичность поставки.
Согласно формулам Уилсона оптимальный размер партии Q* будет равен:
158

2-50-
10
ОД

100 (ящиков).
Длина цикла (периодичность поставок) Т* определяется равенством:
159

Впрочем, ее можно сосчитать и по-другому:


Q * 100 _
Т* = — = —- = 10 (дней), а
10
160

Минимальные средние ежедневные затраты по управлению запасами


равны:
L* = V2аЬа = ^2-50-0,1-10 = 10 (руб. в день).
В течение 10-дневного цикла затраты составят 10x10 = 100 руб., из
которых ровно половина уходит на поставку, а другая половина - на
хранение.
Оптимальные затраты L*, учитывающие стоимость пива, определяются
величиной L* и закупочной ценой пива. Например, при закупочной цене 120
руб. за ящик, получим:
L* = L* + са = 10 + 120-10 = 1210 (руб.).
Отметим, что добавочный член са не связан с оптимизацией затрат по
управлению запасами.
Предположим, что срок поставки пива в магазин составляет 2 дня. Тогда
заказ на поставку в наших условиях следует подавать за 2 дня до исчерпания
запасов пива в магазине, то есть тогда, когда текущий уровень запаса
достигнет критической величины К = 20 ящиков.
Следующие три модели управления запасами являются развитием
простейшей модели. Оптимизационные формулы для них выводятся
аналогичным способом.

Пример 3.2. Производственные запасы

Вернемся к рассмотренной выше конкретной ситуации с производством


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

зуемое сырье становится устойчивым. Появляется возможность опти-


мизировать поставки сырья.
Затраты по поставке составляют 1000 руб. независимо от вида сырья и
размера партии. Хранение обходится в 0,35 руб. за 1 кг сырья за период.
Интенсивность производственного потребления в установившемся режиме
работы для различных видов сырья различна и составляет за период:
1500 кг по муке, 700 кг по маслу, 1360 кг по яйцу, 900 кг по сахару.
Оптимальные характеристики поставок могут быть рассчитаны на
основе этой информации по формулам Уилсона. Оптимальные размеры
партии Q* оказываются равны:
2928 кг по муке, 2000 кг по маслу, 2788 кг по яйцу, 2268 кг по сахару.
Оптимальная периодичность закупок Т* составляет:
2,0 нед. по муке, 2,9 нед. по маслу, 2,0 нед. по яйцу, 2,5 нед. по сахару.
Таким образом, периодичность поставок по разным видам ресурсов
различна.
Минимальные средние затраты L* по управлению запасами за неделю
равны:
1025 руб. по муке, 700 руб. по маслу, 976 руб. по яйцу, 794 руб. по
сахару.
Суммарные затраты составляют 3494 руб. в неделю. Это на 1286 руб.
(на 27%) меньше, чем аналогичные затраты при еженедельных поставках,
составляющие 4781 руб.
Задание 3.1. Объединенный цикл управления

Расчеты, проведенные в предыдущем примере, показывают, что


периодичность поставок по разным ресурсам различна и составляет от 2,0 до
2,9 недель. Для организации поставок более удобным является единый цикл.
Предположим, что все поставки осуществляются с единой периодичностью,
раз в две недели. Размеры партий при этом не оптимальны и соответствуют
двухнедельным объемам спроса.
1. Насколько двухнедельный цикл поставок выгоднее еженедель-
ного цикла?
2. Насколько оптимальное управление по различным циклам на
разные виды сырья выгоднее единого двухнедельного цикла?
Модель с растянутой поставкой
Рассмотрим детерминированную модель с растянутой поставкой,
постоянной интенсивностью спроса и отсутствием дефицита. Пополнение
запаса в такой модели происходит не мгновенно и занимает некоторое время,
162

которым нельзя пренебречь и считать его равным 0. График динамики


запасов изображен на рис. 3.4.
Так, например, происходит пополнение внутрипроизводственных
запасов, производимых на самом предприятии.
Некоторый промежуток времени Т' продукция интенсивно производится
и поставляется на склад (но в то же время и потребляется на предприятии).
Далее в течение промежутка Т" на оборудовании производится другая
продукция, запас первой продукции не пополняется, он только потребляется.
Через время Т = Т' + Т" (цикл управления) на предприятии снова приступают
к производству первой продукции и пополнению ее запасов.

Рис. 3.4. Динамика складского запаса в модели с растянутой поставкой

Постоянные затраты в такой ситуации связаны с переналадкой


оборудования для запуска в производство партии изделий. Переменные
затраты, как обычно, связаны с хранением.
Все время продукция потребляется с постоянной интенсивностью а.
Обозначим посредством (3 интенсивность поставки, то есть объем поставки
в единицу времени. Таким образом, реальная скорость пополнения склада в
периоде Т' равна (3 - а. Эта разность определяет угол наклона прямой на
промежутке Т\ На промежутке Т" угол наклона определяется величиной а.
Параметры бездефицитной модели с растянутой поставкой
а - объем спроса в единицу времени (интенсивность спроса);
а - фиксированные издержки, связанные с актом пополнения запаса;
b - издержки по хранению единицы запаса в течение единицы времени;
(3 - объем поставки в единицу времени (интенсивность поставки).
163

Характеристики модели

Т - длина цикла управления запасами;


Т - интервал поставки (время, в течение которого поступает партия);
Т" - интервал отсутствия поставки;
Q - размер партии;
X - максимальный объем запаса на складе;
L - средние издержки в единицу времени без учета стоимости партии;
L - средние издержки в единицу времени с учетом стоимости партии.
Связи между характеристиками модели

Т = Q/oc, Q = осТ, X = (Р - ос)Т',

Т' = Х/(Р - а), X = аТ", Т" = Х/а,

X = т, + т„ = щр - а) + Х/а = Х/(а/(1 - а/р)),

Q = аТ = Х + аТ' = Х/(1 - а/p), X = Q(1 - а/p), X = Та(1 - а/р),


L = (а + ЬХТ/2)/Т = (а + Ьа(1 - а/р)Т 2/2)/Т = а/Т_+ Ьа(1 - а/р)Т/2 = aa/Q + b(l -
a/p)Q/2, L = L + са.

Характеристики оптимальной стратегии


Оптимальная стратегия определяется теми значениями характеристик
Т* , Т'* , Т"* , Q* , X* , L* и L* , при которых издержки L становятся
минимальными. Достаточно найти одну из этих характеристик, остальные
определятся через нее однозначно на основе приведенных выше
соотношений.
Оптимизационные формулы

Т» = (2а/(аЬ(1 -а/р)))0'5,

Т'* = (2аа/(р2Ь(1 - а/p)))0'5, Т"* = (2a (1 - a/p)/<xb)0'5,

Q* = (2aa/(b(l - а/р)))0'5, X» = (2аа(1 - а/р)/Ь)0'5,

L* = (2aab(l - а/p))0'5, L* = L* + са = (2ааЬ(1 - а/р))0’5 +


са.
В оптимизационных формулах присутствует величина
164

1 - а/р.
Отношение а/р сопоставляет интенсивность спроса с интенсивностью
поставки. Рост интенсивности поставки в пределе приводит к ситуации
мгновенной поставки. Оптимизационные формулы для нашей модели в
пределе, при a/р —» 0, переходят в формулы для рассмотренной выше
простейшей модели с мгновенной поставкой. При этом, в частности,
становится:
Q* = х* X"* = Т Т'* = О

Модель с допущением дефицита


Рассмотрим детерминированную модель с мгновенной поставкой,
постоянной интенсивностью спроса и допущением дефицита - допущением
отложенного спроса. График динамики запасов изображен на рис. 3.5.
В течение промежутка времени Т i спрос на продукцию удовлетворяется
за счет имеющегося запаса. Далее в течение промежутка запас отсутствует,
возникает ситуация дефицита, постепенно накапливается долг величины S по
неудовлетворенному спросу. Этот долг удовлетворяется за счет части
поступившей партии Q, после чего на складе остается запас X, и все
возобновляется по циклу. Длина цикла Т = Ti + Т2.
Штраф за дефицит исчисляется на основе коэффициента g - издержек за
единицу объема дефицита в единицу времени.

Рис. 3.5. Динамика складского запаса в модели с допущением дефицита

Параметры модели с мгновенной поставкой и допущением


дефицита
а - объем спроса в единицу времени (интенсивность спроса);
а - фиксированные издержки, связанные с актом пополнения запаса;
165

b - издержки по хранению единицы запаса в течение единицы времени;


g - величина издержек за единицу дефицита в течение единицы времени.
Характеристики модели
Т - длина цикла управления запасами;
Т1 - интервал удовлетворения спроса (интервал наличия запаса и
отсутствия дефицита);
Т2 - интервал учета спроса (интервал отсутствия запаса и наличия
дефицита);
Q - размер партии;
X - максимальный объем запаса на складе;
S - максимальный объем дефицита;
L - средние издержки в единицу времени без учета стоимости партии;
L - средние издержки в единицу времени с учетом стоимости партии.
Связи между характеристиками модели

Т = Ti + т2, Q = x + s, Q = ocT,
Т = Q/a, Ti = X/a, T2 = S/a,
X = аТь S = aT2,

L = (а + bXTi/2 + gST2/2)/T = (а + baTi2/2 + gaT22/2)/(Ti +


L = L + са.

Характеристики оптимальной стратегии

Оптимальная стратегия определяется теми значениями характеристик Т*


, Ti* , Т2* , Q* , X* , S*, при которых издержки L становятся минимальными.
Достаточно найти дополняющую пару этих характеристик, например, Ti* и
Т2*, или, например, X* и S*, остальные определятся через них однозначно на
основе приведенных выше соотношений.
Оптимизационные формулы

Т* = (2а(1 + b/g)/(ab))0,5, Ti» = (2a/(ab(l + b/g)))0'5,


T2* = (2ab/(ag2(l + b/g)))0-5,
Q* = (2aa(l +b/g)/b)05,
X» = (2aa/(b(l + b/g)))05, S* = (2aab/(g2(l + b/g)))0'5,
bX* = gS*,
166

L* = (2aab/(l + b/g))0,5, L* = L* + ca = (2aab/(l + b/g))0,5 + ca.


В оптимизационных формулах присутствует величина 1 + b/g. Обратная
ей величина, 1 / (1 + b/g)), называется плотностью убытков из-за
дефицита.
Отношение b/g сопоставляет затраты по хранению и по дефициту. Рост
штрафа за дефицит в пределе приводит к запрету дефицита ввиду его
абсолютной невыгодности. Оптимизационные формулы для нашей модели в
пределе, при b/g —» 0, переходят в формулы для рассмотренной выше
простейшей модели без дефицита. При этом, в частности, становится:
Q* = X*, S* = 0, Ti* = T, Т2* = 0.
Модель с растянутой поставкой и допущением дефицита
Рассмотрим теперь наиболее общую из детерминированных моделей -
модель с растянутой поставкой, постоянной интенсивностью спроса и
допущением дефицита. Г рафик динамики запаса изображен на рис. 3.6.
Цикл управления Т разделяется на 4 части,
Т = ту + ТГ + Т2' + Т2".
В течение Т' = ТУ + Т2' происходит одновременное пополнение и расход
запаса, в течение Т" = ТУ' + Т2" идет чистый расход запаса.
Часть Ti = ТУ + ТУ' соответствует наличию запаса, часть Т2 = Т2' + Т2"
наличию дефицита.

Рис. 3.6. Динамика запаса в модели с растянутой поставкой


и допущением дефицита

Параметры модели с растянутой поставкой и допущением


дефицита
а - объем спроса в единицу времени (интенсивность спроса);
а - фиксированные издержки, связанные с актом пополнения запаса;
167

b - издержки по хранению единицы запаса в течение единицы времени;


g - величина издержек за единицу дефицита в течение единицы времени;
(3 - объем поставки в единицу времени (интенсивность поставки).
Характеристики модели
Т - длина цикла управления запасами;
ТУ - интервал удовлетворения спроса (интервал наличия запаса и
отсутствия дефицита) в условиях осуществления поставки;
ТУ' - интервал удовлетворения спроса (интервал наличия запаса и
отсутствия дефицита) в условиях отсутствия поставки;
ТУ - интервал учета спроса (наличия дефицита и отсутствия запаса) в
условиях осуществления поставки;
ТУ' - интервал учета спроса (наличия дефицита и отсутствия запаса) в
условиях отсутствия поставки;
Q - размер партии;
X - максимальный объем запаса на складе;
S - максимальный объем дефицита;
L - средние издержки в единицу времени без учета стоимости партии;
L - средние издержки в единицу времени с учетом стоимости партии.
Связи между характеристиками модели

Т = ту + тг + ту + Т2", Q = аТ, Т= Q/a,

X = аТГ = ((3 - а) ТУ, ТУ = Х/((3 - а), ТГ = Х/а,

S = аТ2" = ((3 - а) Т2', Т2' = S/((3 - а), Т2" = S/a,

Т = (X + S)/(a(l - а/(3)), Q = X + S + а(Т:' + Т2'), Q = (30Y + Т2'), L = (а +

bX(Ti' + ТГ )/2 + gS(T2' + Т2" )/2)/Т =

= (а + (bX2/(a(l - a/p)))/2 + (gS2/(a(l - a/p)))/2)/((X + S)/(a(l - a/p))),


L = L + ca.

Характеристики оптимальной стратегии


Оптимальная стратегия определяется теми значениями характеристик
Т* , Ti'* , ТГ* , Т2'* , Т2"* , Q* , X* , S* , при которых издержки L становятся
минимальными. Достаточно найти согласованную дополняющую пару этих
характеристик, например, X* и S*, остальные определятся через них
168

однозначно на основе приведенных выше соотношений.


Оптимизационные формулы

Т* = (2а(1 + b/g)/(ocb(l - а/р)))0’5,

ТУ* = (2аа/(Ь(3(1 - а/р)(1 + b/g)))0’5 ТГ* = (2a(l - a/(3)/(ocb(l + b/g)))0’5,

Т2'* = (2aab/((3g2( 1 - a/p)(l + b/g)))0’5, T2"* = (2ab(l - a/(3)/(ocg2(l + b/g)))°’5,

Q* = (2aa(l + b/g)/(b(l - а/р)))0’5, X* = (2aa(l - oc/(3)/(b(l + b/g)))°’5,

S* = (2aab(l - a/p)/(g2(l + b/g)))0’5, bX* = gS*,

L* = (2aab(l - a/(3)/(l + b/g))0’5, L* = L* + ca = (2aab(l - a/(3)/(l


+ b/g))0,5 + ca.
В оптимизационных формулах присутствуют величины 1 + b/g и 1 - a/p.
Рост штрафа за дефицит приводит в пределе к модели без дефицита, а рост
интенсивности поставки приводит к модели с мгновенной поставкой.
Оптимизационные формулы для нашей модели в пределе, при b/g —» 0
или при a/р —» 0, переходят в формулы для рассмотренных выше моделей.

Модели многих товаров


На складе хранятся запасы продукции различных видов. Если они не
взаимодействуют (не конкурируют) между собой, то запасы каждого вида
можно оптимизировать отдельно, независимо от других.
Однако обычно между запасами возникает взаимодействие. Например,
хранение продукции одного вида может требовать таких условий
освещенности, влажности, температуры, которые не согласуются с
условиями хранения других видов продукции. Продукты конкурируют за
режим хранения. Суммарная стоимость оптимальных партий может не
вписываться в бюджет организации. Возникает конкуренция за ог-
раниченный объем затрат. Одновременно поступившие оптимальные
169

партии разных продуктов могут не помещаться на площади склада.


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

Модель с совмещением поставок


Предположим, что поставки на склад п товаров осуществляются из
одной географической точки и поэтому они могут быть совмещены.
Проанализируем возможность уменьшения затрат путем совмещения
поставки и экономии на транспортировке.
Пусть, как обычно:
а - постоянные затраты (одни и те же по любому виду товара);
bi - коэффициент переменных затрат по i-му товару;
oci - интенсивность спроса по i-му товару.
Мы будем исходить из того, что стратегия управления запасами
является регулярной. Если поставки осуществляются совместно по всем п
продуктам, то периодичность поставок оказывается единой (рис. 3.7).

О Т 2Т ЗТ t
Рис. 3.7. Динамика трех видов запасов при согласованном цикле
Обозначим соответствующий период (цикл управления запасами)
посредством Т. Тогда размер партии i-ro товара Qi определяется формулой:
170

Qi = а,Т •
При таких объемах поставки запасы всех продуктов исчерпываются
одновременно, в конце периода Т, в этот момент поступает новая партия, и
цикл возобновляется.
Затраты в единицу времени определяются формулой:
1
a
+ ^T2-Zbiai
2 i
i=

L=
Т
Минимум затрат, определяемый так же, как и в выводе формул Уилсона,
достигается при величине цикла:

Zbiai
i=l

и при этом размер партии k-го товара равен:


Qk = akT =оск
Zbiai
i=l

а минимальные затраты по управлению запасами в единицу времени равны:

L
* =y2aZbiai •

Если есть возможность совместить транспортировку различных товаров,


то это следует сделать. Грузоподъемность транспортного средства
предполагается ограниченной некоторой величиной Р. Рассчитанные
оптимальные размеры партии товаров, подготовленные к совместной
транспортировке, могут превысить допустимую грузоподъемность Р.
Для корректировки партии следует сравнить сумму оптимальных
величин Qk с грузоподъемностью. Обозначим посредством R сумму
оптимальных размеров партий:
171

R=£Q;.
k=l

Если при этом R < Р, то размер партии товаров следует сохранить равным
найденным выше значениям Qk. Если же это неравенство не
172

выполнено, то есть если R > Р, то значения Qk следует откорректиро- вать до


новых величин Qk.
Эти новые величины должны по-прежнему соответствовать условиям
единого цикла управления запасами. Таким образом, необходимо
откорректировать длину цикла. Обозначим новую длину посредством Т*.
Тогда:
о; = акт*,
и при этом:
п —.
ZQ k = P-
к=1

Отсюда получаем формулу для откорректированной длины цикла Т :

IX
к=1

Новые, откорректированные размеры партии определяются по


формулам:
Р
Q =а
i ГП; •
2>к
к=1

Они полностью вписываются в грузоподъемность Р:


n
~ п
р
ZQ,=Za,- —= Р
н н
2>к
к=1

и соответствуют единому циклу управления запасами Т .


Отметим, что новые размеры партий Qk и новая длина единого
л * * цикла Т пропорциональны прежним оптимальным величинам
Qk и Т
с одним и тем же коэффициентом пропорциональности h, равным:
ьЛ.
R
Действительно, при Р = R сумма оптимальных партий в точности
вмещается в транспортное средство, так что при этом условии мы должны
получить:
173

Т* = R
П
IX
k=i
174
175
Таким образом:
176
177
п

к=1

h-T*
178
179
Аналогично:
Q; а кТ ак •h - Т h • ак • Т h-
180 Q*.
181
Новые размеры партии и длина цикла пропорциональны прежним
оптимальным величинам. Новые издержки L по управлению запасами в
единицу времени тоже пропорциональны прежним оптимальным издержкам
L*, но с другим коэффициентом пропорциональности Н,
L = Н • L*,
где

н Л(ь+1).

Минимальное значение этого коэффициента Н равно 1. Оно достигается


только при h = 1, то есть при условии R = Р. В этом случае от-
корректированные величины длины цикла, размера партии и минимальных
издержек совпадают с оптимальными.
Напомним, что если выполняется неравенство R < Р, то отпадает сама
необходимость в корректировке.
В табл. 3.1 приведены данные по коэффициенту пропорциональности
издержек Н, соответствующих некоторым значениям величины h.

Таблица 3.1
Связь между коэффициентами пропорциональности
h 0,05 0,10 0,25 0,50 0,75 1,00
Н 10,03 5,05 2,13 1,25 1,04 1,00

Предположим, что срок выполнения заказа т меньше длины цикла Т .


Тогда критический уровень IQ запаса i-ro товара, определяющий момент
подачи нового заказа на пополнение запаса данного товара, вычисляется по
формуле:

Аннотация

Данная работа посвящена построению и исследованию модели


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

Написана программа на языке Си++, в которой реализован алгоритм


модифицированного симплекс-метода.

Выполнены определенные расчеты для анализа, которые указывают как


много и какого вида продукции лучше всего производить рассматриваемой
фирме.

Настоящая дипломная работа может стать полезной для предприятия,


планирующего свое производство.

Содержание

Введение………………………………………………………………….

Теоритический обзор……………………………………………………

Методы и организации исследования………………………………….

Основная исследовательская часть…………………………………….


183
Заключение……………………………………………………………….

Приложение………………………………………………………………

Список использованной литературы…………………………………..


184

Введение

Эффективность функционирования любого предприятия определяется


многими обстоятельствами. Среди них: правильность установления "что,
сколько, какого качества и к какому времени производить продукцию или
оказывать услуги" с учетом спроса и предложения; выбор оптимальной
технологии и организации производства; своевременное и рациональное
ресурсное обеспечение; величина основного и оборотного капиталов; формы
и методы реализации продукции и пр. В условиях рыночной экономики
предприятия нацелены на выполнения разных функций. Они занимаются
производством товаров, их реализацией, оказанием разнообразных услуг.
В процессе своей деятельности предприятия стремятся к различным
целям. Это может быть желание выжить при неблагоприятной
экономической конъюнктуре, минимизация убытков, завоевание нового
сегмента рынка или максимизация прибыли и т.д.
Цель предприятия определяет планирование его деятельности.
Планирование может быть долгосрочным, краткосрочным. При
планировании функционирования предприятия учитываются имеющиеся
ресурсы, возможные издержки, природные условия, трудовой фактор и т. д.
При планировании используются следующие основные методы:
- нормативный
- матричный
- балансовый
-экстраполяции
- интерполяции
- факторный
- экономико-математическое моделирование с применением ЭВМ и др.
185
При составлении стратегического плана используется следующая
информация: объем годовых продаж по группам товаров; годовая прибыль и
убытки по структурным подразделениям; годовой объем экспорта и его
удельный вес к общему объему продаж; доля рынка; объем ежегодных
капитальных вложений; баланс на конец последнего года плана; финансовый
план. 
Среднесрочное планирование (от 2 до 3-х лет) учитывает возможности
всех подразделений на основе их собственной оценки. Разрабатывается план
предприятия по маркетингу, план производства, план по труду и финансовый
план. 
В области экономических исследований дальнейший прогресс
связывают с широким использованием математических методов и моделей.
В условиях рыночной экономики постоянно происходит поиск
наиболее выгодного варианта распределения ресурсов между всеми
участниками экономических отношений. Сложные внешние и внутренние
связи предприятия, наличие большого числа показателей, факторов и
ограничений, а также быстрый рост конкуренции не позволяют
сформировать оптимальный план действий в тех или иных условиях без
применения специальных методов.
В связи с этим специалисты в экономической сфере должны уметь
решать коммерческо-организационные, научно-исследовательские, проектно-
аналитические задачи. Успех решения этих задач зависит от качества,
эффективности, правильности формулировки и применения математических
моделей и методов.
Существующие математические методы и модели помогают решать
задачи большей размерности, учитывая большой спектр показателей и
факторов влияния, а время решения задач значительно сокращается с
применением компьютеров. Следует отметить, что в ряде сложных задач не
всегда может быть получено оптимальное решение. При этом ищется
приближенное решение.
186
Постановка задачи
Передо мной была поставлена задача – составить и исследовать модель
планирования деятельности предприятия в условиях рыночной экономики.
Цель предприятия – максимизация прибыли при условии ограниченности
ресурсов и конкуренции.
То есть имеется фирмы А и В. Цель каждой из них – максимизация
прибыли в условиях конкуренции и ограниченности ресурсов. Необходимо
рассчитать план производства одной из фирм на два года. Вследствие того,
что в первый год обе фирмы уже произвели какое-то количество товара, то
нашей фирме при планировании производства на следующий год нужно
учитывать, сколько товара уже было произведено обеими фирмами.
Итак, сформулируем математическую модель в первый год
производства товаров:

, где

– цена i-го вида продукции


- количество произведенной продукции i-го вида
- производственный коэффициент (сырье)
- запас сырья
Данную модель можно решить методом линейного программирования.
Методы линейного программирования позволяют описывать
некоторые разновидности задач экономики, например, планирование
товарооборота. В данной задаче целевая функция и функции в системе
ограничений носят линейный характер.
Существует несколько способов решения задач линейного
программирования. Здесь был использован симплекс-метод. В ограничениях
не нужно учитывать условие неотрицательности, т. к. в задачах линейного
программирования это условие присутствует.
На второй год модель усложняется. Теперь нельзя назначить цену
товара, руководствуясь только затратами на производство данного вида
товара. На цену влияют ряд факторов таких как, спрос, излишки с прошлого
года. Необходимо было подобрать такую формулу нахождения цены, в
которой при производстве большого количества товара, цена на него падает,
в случае выпуска недостающего количества товаров цена на него возрастает.
Цена будет формироваться следующим образом:
, (1) где
- потребность в товаре
187

- количество произведенного товара первой фирмой за первый год


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

, (2)
где
– количество производимого i-го вида продукции за первый год
– количество производимого i-го вида продукции за второй год,
здесь соответствует ; соответствует ; соответствует ; что
означает, что это один вид продукции за первый и второй год
соответственно.
Также необходимо наложить условия неотрицательности на каждый
, т. к. количество произведенного товара не может быть меньше 0. К тому же
ограниченность ресурсов также имеет место. Ограничения будут выглядеть
следующим образом:

Если теперь раскрыть скобки в целевой функции, мы увидим, что


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

Теоретический обзор
В настоящее время ряд экспертов изучают все возможности для построения
эффективной модели функционирования предприятия. Для этого существуют
различные методы, например, проведение экспериментов, изучение
поведения объекта раннее, а также прогноз на его вероятное будущее
поведение. Еще одним методом изучения оптимального производства
является математическое моделирование, составление функций, а также
изучение путей его решения. Преимуществом математического
моделирования являются низкие затраты.
При математическом моделировании находятся характеристики
рассматриваемого объекта.
При решении оптимизационных задач часто используются ЭВМ.
В настоящее время уже разработано ряд программ, которые находят
оптимальный план при решении экономических задач. Эти алгоритмы
являются весьма эффективными. Экономическими экспертами подробно
изучается поведение фирмы, вероятное планирование конкурирующих фирм,
ценообразование, тщательно продумывается план производства.
Надо отметить, что большую роль играет ценовая политика. Так как в
настоящей дипломной работе затрагивается тема ценообразования, то
остановимся на ней поподробнее.
Случаи, когда используется ценовая конкуренция:
1) Низкая цена может служить средством проникновения на рынки
2) Является серьезным приоритетом перед конкурентами
3) Иногда происходит снижение цен как ответ на поведение
конкурирующих предприятий.
Вследствие того, что цена на товар является важнейшим фактором стратегии
предпринимателя, многие компании не разглашают свои методы принятия
цены.
Однако существуют различные известные факторы, влияющие на
ценообразование:
1. Установление цены исходя от издержек производства.
2. Метод безубыточности, который основан на определении объема
производства и реализации по заданной цене, который позволит покрыть
постоянные и переменные издержки производства продукции без получения
прибыли.
189
3. Влияние фактора спроса.
4. Учет конкуренции.
Как видно, на цену влияет большое количество факторов, что делает задачу
достаточно сложной. Для этого создаются различные математические модели
и находятся наиболее эффективные пути их решения.
Так формируется модель определения цены:
C=( )
S=S(
H=H(

P=P(C,S,H,P)
где С — себестоимость изделия;
,… — составляющие себестоимости от 1 до n;
S — спрос на изделие в денежном выражении;
— спрос i-гo покупателя на изделие в денежном выражении;
— спрос j-гo потенциального покупателя на изделие в денежном
выражении;
k — спрос на изделие l-го конкурента в денежном выражении;
е — эластичность спроса на изделие по цене;
H — изменение продажной цены изделия (инфляция);
,… — внешние факторы, влияющие на изменение h;
— справочная цена;
— цены на аналогичную продукцию конкурентов на рынке.
Эта модель не совершенна. При более подробном рассмотрении, изучается
вес каждого параметра, определяются зависимые переменные.
Таким образом, математическая модель будет иметь вид:
C=( )

=
S=S(
H=H(

P=P(C,
190

где , — затраты на ресурсы


nq — количество данных , в перечне;
—другие издержки;
nw — количество данных в перечне расшифровки;
— расход на транспорт:
nr — количество данных в перечне расшифровки.
Таким образом, в левой части каждого уравнения данной математической
модели находятся зависимые переменные управления, а в правой (в скобках)
— независимые.
Такая модель подсчета является правильной и может быть использована при
реальных расчетах.
Построение математической модели в данной методике осуществляется
методом регрессионного анализа, позволяющего установить
функциональную зависимость между зависимой переменной (откликом) и
независимыми переменными (факторами) в каждом из представленных в
математической модели уравнений.
В общем случае подобные задачи весьма эффективно решать различными
методами на ЭВМ. Реализация на ЭВМ позволяет значительно ускорить
процесс решения, а также предупредит ошибки в вычислениях.

Ход исследования
Составление задачи не составило особого труда. Были использованы
различные способы. В начале хода исследования стояла задача сравнить и
исследовать следующие проблемы.
1) Наша фирма А вычисляет оптимальное количество производимой
продукции в случае, если конкурирующая фирма В получила
минимальную прибыль. Таким образом, планирование фирмы
рассчитывается для наилучшего собственного варианта при наихудшем
поведении конкурирующей фирмы.
2) Конкурирующая фирма располагает необходимыми знаниями о
планировании фирмы А и вырабатывает свою наилучшую стратегию.
Проблемы сводятся к вычислению и сравнению результата двух функций
1) 2)
Была специально изучена программа Mathcad, необходимая для выполнения
различных расчетов и решения различных математических задач. Данный
математический пакет содержит в себе различные функции, благодаря чему
можно быстро получить решение, которое вручную имеет большой объем и
отнимает много времени на расчеты. Программа Mathcad умеет находить
191
значения переменных при определенных ограничениях, и максимизировать
(минимизировать) значение целевой функции. Позднее выяснилось, что этого
не достаточно. Разумнее всего заставить программу Mathcad самой задавать
определенные значения y-ам, находя x-ы, далее найденные x-ы подставлять в
целевую функцию и находить y-и. Продолжать это до тех пор, пока ответы,
полученные в одной функции не сойдутся с ответами в другой. Очевидно,
удобно в таком случае использовать бесконечный цикл с условием.
Математический пакет умеет выполнять программные задачи. В нем
предусмотрено программирование. Особенности и возможности
программирования на Mathcad были тщательно изучены, было написано
много программ различной степени сложности в Mathcad. Однако
программистами математического пакета Mathcad не разработано
использование оптимизационных задач в программном коде. Таким образом,
оказалось, что Mathcad ничем не может помочь в данной дипломной работе.
После некоторых рассуждений нашлось другое решение проблемы –
программа на Си. Была поставлена цель написать программу на языке Си,
которая будет находить значения х-ов при фиксированных у-ах, а далее y-и
при фиксированных х-ах.
Был разработан алгоритм данной программы. Алгоритм заключался в том,
чтобы зафиксировав y-и найти x-и. Для этого было заведено 9 вложенных
циклов, в которых сначала задавались у, а менялись х-ы до заданных
ограничений, а потом наоборот – для найденных у-ов находились х-ы. При
этом велся подсчет целевой функции при подстановке соответствующих х-ов
и у-ов, в результате в определенной переменной хранилось максимальное
значение функции.
Однако данная программа обладала рядом недостатков. Во-первых, значения
были не точные, а довольно грубые. Во-вторых, программа работала крайне
долго. Для того чтобы решить одну задачу требовалось около двух дней. Это
нормально для 9 вложенных циклов, которые прорабатывались программой
дважды для каждого примера. Особой оптимизации нельзя было
предусмотреть.
На получение результатов ушло очень много времени. Притом ответы
оказались некорректными так как не удовлетворяли заданным ограничениям.
Была найдена предположительная ошибка. Но времени для решения
примеров не хватало. Вследствие чего появилась острая необходимость
разработать другие методы решения данной задачи для получения
результатов.
Вся суть задачи свелась к тому, чтобы разработать метод решения
планирования производства фирмы А с целью получить максимальную
прибыль за второй год, в условиях конкуренции и ограниченности ресурсов.
Предполагается, что фирма А знает, сколько товаров произвела
конкурирующая фирма В за первый год, спрос также известен.
192

Основная часть
Для того чтобы понять, какой метод для решения лучше всего применить,
была изучена целевая функция и ограничивающие условия.
Проблем при максимизации прибыли в первый год не возникло. Целевая
функция носит характер линейности, ограничения также линейны.
Следовательно, такая задача решается симплекс-методом. Это стандартный
метод линейного программирования для решения оптимизационных задач.
Он уже давно исследован и разработан. Поэтому в настоящей дипломной
работе описываться не будет.
На второй год производства целевая функция, как было сказано выше, не
имеет характер линейности. Однако она является линейной по своим
переменным. Действительно, если раскрыть скобки и сгруппировать
неизвестные x в целевой функции, то получится выражение:
+

-> max
Если теперь взять частные производные по всем (y фиксированные
константы), то частная производная будет иметь вид:

Где начиная с 4-го номера вычисляется по формулам (1). Ограничения


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

Составляем таблицу
Базис θ
0 0 0 1 0 0 0
0 0 0 0 1 0 0
0 0 0 0 1 0
0 0 0 0 0 0 1

Составим вектор

То есть в вектор заносятся значения из столбца на i-ую позицию


соответствующего в строке.
Здесь базисом является они задают направление движения.
Далее необходимо найти интервал, где будет подыскиваться максимальное
значение функции. Для этого последовательно столбец делится на столбец
и получаются определенные значения, из которых выбирается
минимальное это и будет θ (если в знаменателе оказывается 0, то такое θ
пропускается). Рассматривается интервал от 0 до этого значения и
формируется вектор x’.

Где

Далее идет подстановка вектора в целевую функцию и подсчет ее


значения, данное значение запоминается. Ищется следующий вектор и
подсчитывается значение функции от него, если оно больше предыдущего, то
максимальное значение меняется. Таким образом мы ищем максимальное
значение функции на интервале от 0 до с маленьким шагом, каждый раз
дробя интервал и еще более уменьшая шаг (метод золотого сечения). Так
находится максимальное значение функции для каждых .
После рассмотрения всех интервалов, то значение, которое оказывается
максимальным сравнивается с f( , если f( , то максимальное
значение найдено и решение можно не продолжать. В таком случае
194

максимальное значение А x, которые окажутся в и будут


искомыми неизвестными. Если f( , то нужно перестроить таблицу.
Для того чтобы получить новую таблицу, нужно выбрать, так называемый,
ведущий элемент. Ведущим элементом является то пересечение и из
базиса, на котором было найдено , с помощью которого получено
максимальное значение.
Новая таблица находится методом прямоугольника.
Для новой таблицы продолжаются все те же вычисления, что и для
предыдущей. Таблицу будут строится пока не выполнится условие f(
.
Геометрически это означает, что происходит расчет на границе
многогранника. Сначала находится значение функции в любом угле
многогранника, оно сравнивается со значениями в двух соседних точках.
Если они больше, чем значение в самой точке, то идет исследование
соответствующей стороны и находится значения нас троне многогранника.
Граничных точек конечное число, поэтому алгоритм выполняется за
конечное число шагов.
Стоит отметить, что алгоритм не применим, если коэффициенты при
были бы примерно равны коэффициентам при .
Метод золотого сечения
Рассматриваемый интервал делится на части с шагом 0,1. Далее в
полученных точках находятся значения функции и сравниваются между
собой. Если следующее значение больше предыдущего, то рассматривается
следующая пара точек. Если меньше, то интервал, рассматриваемый на
предыдущем шаге делится с шагом 0,01 и проделываются те же вычисления.
Так продолжается до того, пока шаг не станет равным 0,001.
Такое дробление интервала значительно ускоряет работу программы. В
случае задачи из рассматриваемой дипломной работы такой метод является
самым оптимальным, так как функция имеет лишь одну максимальную точку
на отрезке вследствие линейности по переменным.
Данный метод является весьма эффективным при решении задачи данного
типа.
Для исследования необходимо прорешать большое количество задач.
Проделывать это вручную неэффективно, к тому же не гарантирует
отсутствие ошибок в вычислениях.
Поэтому было принято решение написать программу на Си++, которая
автоматически при заданной целевой функции и ограничениях будет
находить верное решение (см приложение).
Обоснование корректности модифицированного симплекс-метода
Модифицированный симплекс метод применим для данной задачи потому
195
как функция линейна по своим переменным, вследствие чего, ее
максимальное значение лежит на границе многогранника, а не внутри него.
Также стоит отметить, что коэффициенты при произведениях на много
меньше чем коэффициенты при линейных переменных. Если найти градиент
функции, то он не будет менять своего знака на множестве из-за небольших
коэффициентов. Это доказывает, что максимум лежит на границе
многогранника.

Рассмотрим ряд примеров.


1) Пусть конкурирующая фирма за первый год имеет следующие данные

Таким образом, известно сколько товаров произвела фирма В за


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

Как было описано выше, задача решается стандартным симплекс-


методом. Таким образом, получены ответы

Имея эти данные, фирма А может рассчитать свой оптимальный план.


Для этого составляется целевая функция (2). Получим:

Пусть фирма А имеет те же ограничения на производство, что и фирма


В, то есть:

Вычисления производятся написанной программой, которая вычисляет,


какие сколько товаров лучше всего производить за второй год фирме
А. Таким образом, получаем ответы:

То есть, выгоднее всего в первом году произвести то же количество


товара вида 1, что и у второй фирмы. На второй год аналогичные
данные.
196
Теперь нужно проверить, есть ли седловая точка (отклонение от
решения, приводящее к ухудшению результата одного из участников) у
данной задачи. Для этого рассмотрим несколько другой вектор у и
соответствующий вектор х. Для этого решим систему уравнений для
ограничений, взяв за 0 сначала потом . Далее получим новые
целевые функции для модифицированного симплекс-метода и разыщем
соответствующие х.

В данном примере получилось, что вектор у=(0,8,0) и у=(0,0, ).

Составив целевые функции и найдя х, получаем те же ответы, что и для


исходного вектора у.
Это значит, что седловая точка есть и данный план подходит.
Рассмотрим другой пример.
2)

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

Получим ответы:

Составим целевую функцию для фирмы А:

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

Это означает, что второй фирме выгодно производить лишь второй вид
продукции в первый год.

Найденные у равны соответственно (0,5,0) и (0,0, )

В данной задаче седловых точек не оказалось, так как векторы х не


равны между собой для каждого из векторов у. Значение функции при
197
разных векторах х отличаются довольно сильно. Это значит, что вектор
х оказывает существенное влияние на принятие решения фирмы.
Следовательно, решение принимается с вероятностной точки зрения.
3)

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

Получим ответы:

Составим целевую функцию для фирмы А:

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

Это означает, что фирме А выгодно производить первый и второй вид


продукции оба года.

В данной задаче векторы у равны соответственно ( .

Значение вектора х не зависит от выбора вектора у. Это значит, что


седловая точка существует.
4)

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

Получим ответы:

Составим целевую функцию для фирмы А:


198

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

Это означает, что второй фирме выгодно производить лишь первый


вид продукции в первый год.
В этом примере также имеется седловая точка. Вектора у равны

соответственно (0, Вектор х всегда одинаковый.

5)

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

Получим ответы:

Составим целевую функцию для фирмы А:

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

Два вида продукции не равны 0. Для поиска седловой точки


необходимо решить систему. При этом вектор х изменился.
Следовательно, седловая точка отсутствует.
6)

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

Получим ответы:

Составим целевую функцию для фирмы А:

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

То есть фирма А будет производить первый вид продукции оба года.


Седловая точка имеется.

7)

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

Получим ответы:

Составим целевую функцию для фирмы А:

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

Фирма А должна производить второй вид продукции первый и второй


год.

Решив систему, получаем (0, и (0,0, . Соответствующие этим у

х получились равными и первому вектору у. Следовательно, седловая


точка имеется.
8)

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

Получим ответы:

Составим целевую функцию для фирмы А:

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

На этот раз получились результаты немного отличные от предыдущих:


фирма А первый год производит третий вид продукции, а на второй год
оптимальнее всего выпустить первый и второй виды продукции.

При решении систем получаем у (0,

Соответствующие вектора х получаются такие же как и впервом случае


вектора у. Значит, седловая точка имеется.
201
9)

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

Получим ответы:

Составим целевую функцию для фирмы А:

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

Это означает, что фирма А произведет только первый вид продукции


оба года.

Векторы у получились (0, и (0,0, . Соответствующие им вектора


х получаются такими же как и в первом случае вектора у. Значит
седловая точка имеется.
10)

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

Получим ответы:

Составим целевую функцию для фирмы А:


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

Так фирма А производит в первый год первый вид продукции. А


второй год первый и второй вид продукции.

Значения векторов у (0,6,0) и (0,0, . Для первого вектора у, значения

вектора х получились ( что не соответствует результатам


при первом рассматриваемом векторе. Седловая точка отсутствует.
Значения функций при двух различных векторах х сильно разнятся.

Заключение

В данной дипломной работе было исследовано планирование


деятельности предприятия в условиях ограниченности ресурсов и
наличия конкуренции со стороны другой фирмы. Была построена
модель, помогающая фирме принять решение на второй год своей
деятельности, при условии, если известно поведение в первом году
конкурирующей фирмы, а также известен спрос на товар.
Для этой цели были написаны специальные программы, с помощью
которых были получены результаты для ряда конкретных случаев.
Результаты были тщательно изучены и получены следующие выводы.
Поведение конкурирующей фирмы оказывает влияние на оптимальный
план рассматриваемой фирмы, вследствие чего в некоторых ситуациях
фирме выгодно в следующий год менять количество производимых
товаров.
В большинстве задач присутствует седловая точка. Следовательно,
если фирма будет отклоняться от этого решения, то это приведет к
ухудшению ее ситуации и получению меньшей прибыли
Однако имеются примеры, где седловая точка отсутствует. Это
означает, что фирма в подобных ситуациях должна принимать решения
с вероятностной точки зрения.
203
Таким образом, мной была проделана работа, при помощи которой
можно спланировать деятельность одного предприятия в зависимости
от производства конкурирующего предприятия.
Так как в некоторых ситуациях каждый год одного вида товара фирме
выгоднее всего производить в разном количестве, то это означает, что
поведение конкурирующей фирмы оказывает влияние на оптимальный
план рассматриваемой фирмы.
В большинстве задач присутствует седловая точка. Следовательно,
если фирма будет отклоняться от этого решения, то это приведет к
ухудшению ее ситуации и получению меньшей прибыли
Однако имеются примеры, где седловая точка отсутствует. Это
означает, что фирма должна принимать решения с вероятностной
точки зрения.
Таким образом, мной была проделана работа, при помощи которой
можно спланировать деятельность одного предприятия в зависимости
от производства конкурирующего предприятия.
204

Приложение
Программная реализация модифицированного симплекс-метода.
Программа принимает на вход коэффициенты целевой функции, а
также коэффициенты при ограничениях. Базис также задается
вручную.
На выходе программа выдает количество товаров, которое оптимальнее
всего производить в течение двух лет фирме А.

Листинг1. (main.cpp)
#include "header.h"
#include "Symplex.h"

#define IN_FILE "in.txt"


#define OUT_FILE "out.txt"

int main()
{

FILE *in, *out;

in = fopen(IN_FILE, "r");
out = fopen(OUT_FILE, "w+");
if (in == NULL || out == NULL)
{
printf("File not exists\n");
return -1;
}
try{
Simplex newSimlex(in);
newSimlex.runSimplex();
205

}
catch (Exception e)
{
cout << "- ERROR!\n--- Code: " << e.errorCode << "\n--- Reasone: "
<< e.message << endl;
}
system("pause");
return 0;

Листинг2. (Fraction.h)
#include "header.h"

#ifndef FRACTION_CLASS
#define FRACTION_CLASS

class Fraction
{
public:
int top;
int bottom;
//---- methods
Fraction();
Fraction(int _top);
Fraction(int _top, int _bottom);
Fraction(Fraction *fraction);
void setData(int _top);
void setData(int _top, int _bottom);
void setData(Fraction *fraction);
void simplification();
void reverse();
string toString();
double toDouble();

void operator=(Fraction fraction);


Fraction operator+(Fraction fraction);
Fraction operator-(Fraction fraction);
Fraction operator*(Fraction fraction);
Fraction operator/(Fraction fraction);

void operator+=(Fraction fraction);


206
void operator-=(Fraction fraction);
void operator*=(Fraction fraction);
void operator/=(Fraction fraction);

bool operator==(Fraction fraction);


bool operator<(Fraction fraction);
bool operator>(Fraction fraction);
bool operator<=(Fraction fraction);
bool operator>=(Fraction fraction);

void operator=(int a);


Fraction operator+(int a);
Fraction operator-(int a);
Fraction operator*(int a);
Fraction operator/(int a);

void operator+=(int a);


void operator-=(int a);
void operator*=(int a);
void operator/=(int a);

bool operator==(int a);


bool operator<(int a);
bool operator>(int a);
bool operator<=(int a);
bool operator>=(int a);

void scanFrom(FILE* in_file);

};

#endif

Листинг3 (Fraction.cpp)
#include "Fraction.h"

Fraction::Fraction()
{
this->setData(0);
}
Fraction::Fraction(int _top)
{
207
this->setData(_top);
}
Fraction::Fraction(int _top, int _bottom)
{
this->setData(_top, _bottom);
}
Fraction::Fraction(Fraction *fraction)
{
this->setData(fraction);
}
void Fraction::simplification()
{
int a, b;
a = this->top;
b = this->bottom;
while (b)
{
int tmp = b;
b = a % b;
a = tmp;
}
int _nod = a;
this->top /= _nod;
this->bottom /= _nod;
if (this->bottom < 0){
this->bottom *= -1;
this->top *= -1;
}
}
void Fraction::setData(int _top)
{
this->setData(_top, 1);
}
void Fraction::setData(Fraction *fraction)
{
this->setData(fraction->top, fraction->bottom);
}
void Fraction::setData(int _top, int _bottom)
{
this->top = _top;
this->bottom = _bottom;
this->simplification();
}
void Fraction::reverse()
208
{
this->setData(this->bottom, this->top);
}
double Fraction::toDouble()
{
double _top = this->top;
double _bottom = this->bottom;
return _top / _bottom;
}
string Fraction::toString()
{
char s[100];
if(bottom!=1) sprintf(s, "%d/%d", top, bottom);
else sprintf(s, "%d", top);
return string(s);
}
void Fraction::scanFrom(FILE *in_file)
{
int tmpScan, tmpScan2;
char tmpChar;
fscanf(in_file, "%d", &tmpScan);
fscanf(in_file, "%c", &tmpChar);
if (tmpChar == '/')
{
fscanf(in_file, "%d", &tmpScan2);
}
else tmpScan2 = 1;
this->setData(tmpScan, tmpScan2);
}

Fraction Fraction::operator+(Fraction fraction)


{
Fraction resultFraction;
resultFraction.setData(this->top * fraction.bottom + fraction.top * this-
>bottom, this->bottom * fraction.bottom);
return resultFraction;
}
Fraction Fraction::operator-(Fraction fraction)
{
Fraction resultFraction;
resultFraction.setData(this->top * fraction.bottom - fraction.top * this-
>bottom, this->bottom * fraction.bottom);
return resultFraction;
}
209
Fraction Fraction::operator*(Fraction fraction)
{
Fraction resultFraction;
resultFraction.setData(this->top * fraction.top, this->bottom *
fraction.bottom);
return resultFraction;
}
Fraction Fraction::operator/(Fraction fraction)
{
Fraction resultFraction;
resultFraction.setData(this->top * fraction.bottom, this->bottom *
fraction.top);
return resultFraction;
}
void Fraction::operator=(Fraction fraction)
{
this->setData(fraction.top, fraction.bottom);
}
void Fraction::operator+=(Fraction fraction)
{
Fraction tmpFraction;
tmpFraction = (*this) + fraction;
this->setData(&tmpFraction);
}
void Fraction::operator-=(Fraction fraction)
{
Fraction tmpFraction;
tmpFraction = (*this) - fraction;
this->setData(&tmpFraction);
}
void Fraction::operator*=(Fraction fraction)
{
Fraction tmpFraction;
tmpFraction = (*this) * fraction;
this->setData(&tmpFraction);
}
void Fraction::operator/=(Fraction fraction)
{
Fraction tmpFraction;
tmpFraction = (*this) / fraction;
this->setData(&tmpFraction);
}
bool Fraction::operator==(Fraction fraction)
{
210
return this->toDouble() == fraction.toDouble();
}
bool Fraction::operator<(Fraction fraction)
{
return this->toDouble() < fraction.toDouble();
}
bool Fraction::operator>(Fraction fraction)
{
return this->toDouble() > fraction.toDouble();
}
bool Fraction::operator<=(Fraction fraction)
{
return this->toDouble() <= fraction.toDouble();
}
bool Fraction::operator>=(Fraction fraction)
{
return this->toDouble() >= fraction.toDouble();
}
void Fraction::operator=(int a)
{
this->setData(a);
}
Fraction Fraction::operator+(int a)
{
Fraction tmpFraction(a);
return (*this) + tmpFraction;
}
Fraction Fraction::operator-(int a)
{
Fraction tmpFraction(a);
return (*this) - tmpFraction;
}
Fraction Fraction::operator*(int a)
{
Fraction tmpFraction(a);
return (*this) * tmpFraction;
}
Fraction Fraction::operator/(int a)
{
Fraction tmpFraction(a);
return (*this) / tmpFraction;
}
void Fraction::operator+=(int a)
{
211
Fraction tmpFraction(a);
return (*this) += tmpFraction;
}
void Fraction::operator-=(int a)
{
Fraction tmpFraction(a);
return (*this) -= tmpFraction;
}
void Fraction::operator*=(int a)
{
Fraction tmpFraction(a);
return (*this) *= tmpFraction;
}
void Fraction::operator/=(int a)
{
Fraction tmpFraction(a);
return (*this) /= tmpFraction;
}
bool Fraction::operator==(int a)
{
Fraction tmpFraction(a);
return (*this) == tmpFraction;
}
bool Fraction::operator<(int a)
{
Fraction tmpFraction(a);
return (*this) < tmpFraction;
}
bool Fraction::operator>(int a)
{
Fraction tmpFraction(a);
return (*this) > tmpFraction;
}
bool Fraction::operator<=(int a)
{
Fraction tmpFraction(a);
return (*this) <= tmpFraction;
}
bool Fraction::operator>=(int a)
{
Fraction tmpFraction(a);
return (*this) >= tmpFraction;
}
212

Листинг4 (Exception.h)
#ifndef EXCEPTION_CLASS
#define EXCEPTION_CLASS

class Exception
{

public:
static const int IN_FILE_IS_NOT_SET = 101;
static const int ROUND_OF_SIMPLEX_ALREADY_SET = 103;
static const int SIMPEX_UPDATE_LONG_TIME = 105;
static const int PERMISION_DANIED_FOR_THIS_SIMPLEX = 107;
static const int INCORRECT_ARGUMENT_OF_METHOD = 110;
string message;
int errorCode;
Exception(const int _errCode)
{
this->errorCode = _errCode;
this->message = "Error";
}
Exception(const int _errCode, string _errorMessage)
{
this->errorCode = _errCode;
this->message = _errorMessage;
}
};
#endif

Листинг6 (Mod_symplex.cpp)
#include "Symplex.h"

Simplex::Simplex(FILE* in_f)
{
this->beforeConstruct(in_f);

this->scanFunction();
this->scanTable();
}
void Simplex::beforeConstruct(FILE* in_f)
{
this->in_file = in_f;
213
if (fscanf(this->in_file, "%d %d", &this->n, &this->m) != 2)
throw Exception(Exception::IN_FILE_IS_NOT_SET, "n and m not
initial. In File no set");
this->varCount = this->n + this->m;
this->f_size = 9;
this->F = (Fraction*)malloc(sizeof(Fraction)*this->f_size);
this->X = (Variables*)malloc(sizeof(Variables)*this->varCount);
this->X_0 = (Fraction*)malloc(sizeof(Variables)*this->varCount);
this->X_cur = (Fraction*)malloc(sizeof(Variables)*this->varCount);
this->baseVariables = (Variables**)malloc(sizeof(Variables*)*this->m);
this->table = (Fraction**)malloc(sizeof(Fraction*)*this->m);
for (int i = 0; i < this->m; i++)
{
this->table[i] = (Fraction*)malloc(sizeof(Fraction)*(this->varCount +
1));
}
this->tetta = (Fraction*)malloc(sizeof(Fraction)*this->m);
}
void Simplex::scanFunction()
{
int j;
for(j=0;j<this->f_size;j++)
{
this->F[j].scanFrom(this->in_file);
}
for (j = 0; j < this->varCount; j++)
{
this->X[j].c =0;
this->X[j].num = j + 1;
}
for (j=this->n; j < this->varCount; j++)
{
this->baseVariables[j - this->n] = &this->X[j]; //ставим указатели
на Cб
}
}

void Simplex::scanTable()
{
for (int i = 0; i < this->m; i++)
{
int j;
for (j = 0; j <= this->varCount; j++)
{
214
this->table[i][j].scanFrom(this->in_file);
}
}
}
void Simplex::setVectorTetta(int _colNum)
{
for (int i = 0; i < this->m; i++)
{
this->tetta[i] = this->table[i][this->varCount] / this->table[i]
[_colNum];
}
}
int Simplex::minTettaKey()
{
int rowOfMin = 0;
for (int i = 1; i < this->m; i++)
{
if (this->tetta[i] < this->tetta[rowOfMin])
rowOfMin = i;
}
return rowOfMin;
}
void Simplex::updateTable()
{
for (int i = 0; i < this->m; i++)
{
for (int j = 0; j <= this->varCount; j++)
{
if ((i != this->mainFractionRowNum) && (j != this-
>mainFractionColNum)){
this->table[i][j] = this->table[i][j] - ((this->table[i][this-
>mainFractionColNum] * table[this->mainFractionRowNum][j]) / (*this-
>mainFraction()));
}
}
}
for (int j = 0; j <= this->varCount; j++)
{
if (j != this->mainFractionColNum)
{
this->table[this->mainFractionRowNum][j] /= (*this-
>mainFraction());
}
}
215
for (int i = 0; i < m; i++)
{
if (i != this->mainFractionRowNum)
{
table[i][this->mainFractionColNum] =0;
}
}
this->mainFraction()->setData(1);
}
Fraction Simplex::valueByVector(Fraction* vector)
{
Fraction result(0);
int half = 3; // this->n/2

for(int i=0;i<this->n;i++){
result += this->F[i]* vector[i];
}
for(int i=0;i<half;i++){
result += this->F[i+this->n]* vector[i]* vector[i+half];
}
return result;
}
void Simplex::setXByX0(Fraction *updVector, Fraction tetta, int _colNum)
{
int _rowNumOfBasis;
for (int j = 0; j < this->varCount; j++)
{
updVector[j] = this->X_0[j];
}
for (int j = 0; j < this->varCount;j++)
{
if ((_rowNumOfBasis = this->colNumInBase(j)) >= 0){
updVector[j] = this->X_0[j] - this->table[_rowNumOfBasis]
[_colNum] * tetta;

}
}
updVector[_colNum] = tetta;
}
void Simplex::updateX0()
{
int _rowNumOfBasis;
for (int j = 0; j < this->varCount; j++)
{
216
if ((_rowNumOfBasis = this->colNumInBase(j)) >= 0)
{
this->X_0[j] = this->table[_rowNumOfBasis][this->varCount];

}
else this->X_0[j] = 0;
}
}
void Simplex::makeInterval(Fraction _intervalEnd, int _colNum){
Fraction runner, prevRunner(0), stepLength(1, 1), epsilon(1, 1000);
Fraction intervalEnd = _intervalEnd;
Fraction *X_end, *X_prev;
X_prev = (Fraction*)malloc(sizeof(Fraction)*this->varCount);

while (1)
{
runner = prevRunner + stepLength;
if (runner>intervalEnd){
runner = intervalEnd;
}
this->setXByX0(X_prev, prevRunner, _colNum);
this->setXByX0(this->X_cur, runner, _colNum);

if ((this->valueByVector(X_prev) > this->valueByVector(this-


>X_cur)) || (runner == intervalEnd)){
if (epsilon >= (runner - prevRunner))
break;
stepLength /= 10;
intervalEnd = runner;
runner = prevRunner;
}
prevRunner = runner;
}
for(int i=0;i<this->varCount;i++)
{
this->X_cur[i] = X_prev[i];
}
}
int Simplex::colNumInBase(int colNum)
{
for (int i = 0; i < this->m; i++)
{
if (this->baseVariables[i]->num == colNum + 1)
return i;
217
}
return -1;
}
void Simplex::runSimplex()
{
int _mainFractionColNum, _mainFractionRowNum, minTettaOnColumn;
int tempIter = 0;
Fraction tmp, valueOfX0, valueOfXCur, maxValOnInterval;
while (1){
this->mainFractionRowNum = this->mainFractionColNum = -1;
this->updateX0();
valueOfX0 = this->valueByVector(this->X_0);
maxValOnInterval = 0;
for (int j = 0; j<this->varCount; j++){
// if (this->colNumInBase(j)>=0) continue;
for (int i = 0; i < this->m; i++){
if ((this->table[i][j] > 0) && (this->table[i][this-
>varCount]>0)) this->tetta[i] = this->table[i][this->varCount] / this->table[i][j];
else this->tetta[i] = 0;
}
tmp = 0;
minTettaOnColumn = -1;
for (int i = 0; i < this->m; i++)
{
if ((this->tetta[i] > 0) && ((tmp==0) || (this-
>tetta[i]<tmp))){
minTettaOnColumn = i;
tmp = this->tetta[i];
}
}
if (minTettaOnColumn == -1) continue;

// cout << "Tetta:("<<j<<")" << tmp.toDouble() << endl;


this->makeInterval(tmp, j);
valueOfXCur = this->valueByVector(this->X_cur);

if (maxValOnInterval < valueOfXCur){


this->mainFractionRowNum = minTettaOnColumn;
this->mainFractionColNum = j;
/*for (int j2 = 0; j2<this->varCount; j2++){
this->X_max[j2] = this->X_cur[j2];
}*/
maxValOnInterval = valueOfXCur;
}
218
}
if (valueOfX0>=maxValOnInterval){
this->finish();
return;
}

this->printTable();
if((this->mainFractionRowNum!=-1)&&(this->mainFractionColNum!
=-1)){
this->updateTable();
this->baseVariables[this->mainFractionRowNum] = (&this-
>X[this->mainFractionColNum]);
}else{
throw Exception(108, "WTF");
}
tempIter++;
if (tempIter > Simplex::MAX_UPDATE_COUNTER)
throw
Exception(Exception::SIMPEX_UPDATE_LONG_TIME, "I'm tired update my
table");
}
// this->setVectorDelta();
}
Fraction* Simplex::mainFraction()
{
return &this->table[this->mainFractionRowNum][this-
>mainFractionColNum];
}
void Simplex::print()
{

cout << "Base:" << endl;


cout << "Delta:" << endl;

}
void Simplex::printTable()
{

cout << "\


n******************************************************" << endl;
cout << "Base:" << endl;
for (int i = 0; i < this->m; i++){
cout << " X" << this->baseVariables[i]->num << ", ";
}
219
cout << "\n------------------------" << endl;
for (int i = 0; i < this->m; i++){
for (int j = 0; j < this->n; j++){
cout << this->table[i][j].toDouble() << "\t";
}
cout << " | ";
for (int j = this->n; j < this->varCount; j++){
cout << this->table[i][j].toDouble() << "\t";
}
cout << " | ";
cout << this->table[i][this->varCount].toDouble() << " | ";
cout << endl;
}
cout << "------------------------" << endl;
cout << "Main(" << this->mainFractionRowNum << "," << this-
>mainFractionColNum << "): " << this->mainFraction()->toDouble() << endl;

cout << endl;


cout << "------------------------" << endl;
cout << "Vector X0: " << endl;
for (int i = 0; i < this->varCount; i++)
{
cout << this->X_0[i].toString() << "\t";
}
cout << endl;
cout <<
"******************************************************" << endl;
FILE* fout;
fout=fopen("out.txt","w");
for (int i=0; i<this->varCount; i++)
{
fprintf(fout, "%d/%d ", this->X_0[i].top,this->X_0[i].bottom);
}
fclose(fout);
}
void Simplex::finish()
{
this->printTable();
cout << "\n END!" << endl;
cout << "----------------------------" << endl << endl;

this->print();
}
220
Листинг7 (Symplex.h)
#include "header.h"
#include "Variables.h"

#ifndef SIMLEX_CLASS
#define SIMLEX_CLASS

class Simplex
{
static const int ROUND_1 = 1;
static const int ROUND_2 = 2;
static const int MAX_UPDATE_COUNTER = 10;

public:
FILE* in_file;
int _roundNum;
int _round;
int n;
int m;
int varCount; //n+m
int f_size; // n + n/2
Variables* X; // это функция F но назвал как вектор X c
коэффициентами C (Ц)
Variables** baseVariables;

Fraction** table;
Fraction* F;
Fraction* tetta;
Fraction* X_0;
Fraction* X_cur;
Fraction* X_max;

int mainFractionRowNum;
int mainFractionColNum;

//--- methods
Simplex(FILE* f_in);
void beforeConstruct(FILE*);

void scanFunction();
void scanTable();
221
int negativeDeltaColumn(); //если нет отрицательных дельта то
возвращ -1 (минус один)
void setVectorTetta(int _colNum);
int minTettaKey();
void updateX0();
void runSimplex();
void updateTable();
void makeInterval(Fraction, int);
Fraction valueByVector(Fraction*);
int colNumInBase(int colNum);
void setXByX0(Fraction *updVector, Fraction, int);
void print();
void printTable();
void finish();

Fraction* mainFraction();

};

#endif // !SIMLEX_CLASS

Листинг8 (header.h)
#ifndef HELPER_FILE
#define HELPER_FILE
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string>
using namespace std;
#pragma warning(disable : 4996)

#endif
#include "Exception.h"

Листинг9 (Variables.h)

#include "Fraction.h"

#ifndef VARIABLES_CLASS
222
#define VARIABLES_CLASS

class Variables
{
public:
Fraction c;
int num;
}; #endif
Список использованной литературы
1
1. Садовская Т.Г., Дроговоз П.А., Дадонов В.А., Мельников В.И.
Применение математических методов и моделей в управлении
организационно-экономическими факторами
конкурентоспособности промышленного предприятия
2. Чернышев С.Л. Моделирование экономических систем и
прогнозирование их развития: учебник.
3. 3. Баркалов С.А., Бурков В.Н., Гилязов Н.М. Методы агрегирования
в управлении проектами.
4. Burkov V.N. Problems of optimum distribution of resources. — Control
and Cybernetics. Vol. 1 (1972), №1/2. http://www.omorrss.ru/index.php?
s=54&m=1051
5. Проблемы современной экономики
6. Бирюков Методы оптимизации в примерах и задачах
7. Глебов Н. И., Кочетов Ю. А., Плясунов А. В. – Методы оптмизации
8. Карманов В. Г. – Математическое программирование
9. Алябьева С. П., Борматова Е. П., М. В. Данилова, Семенова Е. Е. –
Mathcad для студентов. Учебный практикум
10.Курьянов Д. В. – Mathcad 15. Электронная книга
223

Вам также может понравиться