Академический Документы
Профессиональный Документы
Культура Документы
моменты ti, t2, t3) на склад поступают поставки (объема Vi, V2, Уз). Размер
поставки соответствует длине вертикального отрезка. Запас вырастает на
величину поставки.
Поставка в момент ti поступила, когда на складе еще оставались запасы.
Поставка в момент t2 пришла в ситуации дефицита (запасы отрицательны, у
склада имеется задолженность перед спросом, удовлетворяемая из пришедшей
поставки). Поставка в момент t3 застала ситуацию, когда запасы как раз
исчерпались.
Размеры поставок могут быть различными, сами поставки могут поступать
на склад нерегулярно.
Формируя стратегию управления запасами, мы, в общем случае, стремимся
управлять дискретными поставками, стремясь приспособиться к
неуправляемому, но прогнозируемому спросу.
Стратегия управления запасами - это последовательность решений,
определяющих моменты поставок и их объемы. Таким образом, стратегия
отвечает на два вопроса: Когда? и Сколько?
Качество стратегии управления запасами характеризуется издержками.
Стратегия эффективна, когда издержки минимальны.
Издержки связаны с поставками и хранением запасов, а также с дефицитом.
Рассмотрим работу системы в отсутствие дефицита.
Издержки по поставкам подразделяются на постоянную и переменную
составляющую.
Постоянные издержки по поставкам - это издержки, не зависящие от
размеров поставки. К ним относятся организация заказа, телефонные
переговоры, командировочные и частично транспортные расходы и т.д. Такие
издержки, в расчете на единицу времени, будут большими, если поставки
организуются часто (вне зависимости от их объемов), и малыми, если поставки
происходят редко. Эти издержки зависят от принимаемых решений, релевантны
разрабатываемой стратегии. Они должны быть включены в анализ
разрабатываемой стратегии управления запасами.
Обозначим такие затраты посредством а.
Переменные издержки по поставкам - это затраты на закупку товара,
страховые и таможенные сборы, исчисляемые как процент от стоимости товара
и другие издержки такого рода. Рассмотрим длительный промежуток времени.
В условиях бездефицитной работы система должна покрыть весь объем спроса
за это время. Объем спроса не зависит решений по поставкам, от того,
большими или малыми партиями, редко или часто будет пополняться запас. А
переменные издержки по поставкам определяются объемом спроса. Таким
образом, они ирреле- вантны разрабатываемой стратегии управления запасами,
и по этой причине их можно вынести за рамки анализа при разработке решений
152
по поставкам.
Издержки по хранению также подразделяются на постоянную и
переменную составляющую.
Постоянные издержки по хранению - это издержки, не зависящие от
объемов хранимого запаса. Они связаны, в первую очередь, с арендой складских
площадей, оплатой работы персонала, оплатой коммунальных услуг, охраны
помещений. Такие издержки не меняются при изменении решений по
поставкам, не зависят от этих решений. Они иррелевантны разрабатываемой
стратегии управления запасами, и по этой причине их можно устранить из
дальнейшего анализа.
Переменные издержки по хранению - это издержки, зависящие от объемов
хранимого запаса. Они пропорциональны размерам запаса и срокам хранения.
Сюда попадают упущенная выгода от замораживания оборотных средств,
страховка запаса, оплата работ по предпродажной подготовке, перефасовке
товара и т.д. Это релевантные издержки.
Затраты по хранению единицы продукции в течение единицы времени
обозначим посредством Ь. Традиционно эта величина выражается как
определенный процент i от цены (стоимости единицы) запаса с:
b = ic.
Дефицит связан с многообразными потерями - потерей не только текущей
выгоды, но и будущих возможностей, упущенными клиентами, потерей
перспективы. Мы начнем изучение предположения о недопустимости дефицита,
затем перейдем к моделированию более сложных ситуаций, когда дефицит
допускается, но за него приходится платить.
Таким образом, в дальнейшем анализе участвуют две величины: величина а
постоянных затрат по поставкам и величина b - коэффициент переменных
затрат по хранению.
Отметим, что в анализ включаются только затраты, зависящие от решений
по поставкам. Затраты, иррелевантные таким решениям, не зависящие от них, в
анализ не включаются.
Например, размер арендуемых складских площадей обычно не поддается
подгонке под объем хранимого запаса, поэтому арендная плата не войдет в
оптимизационные расчеты. Затраты по стоимости товара определяются спросом
и тоже непосредственно не входят в оптимизационные расчеты. Однако если
размер площадей можно регулировать, то это следует учитывать в составе
переменных затрат. Если стоимость партии не пропорциональна ее размеру
(например, в связи с оптовой скидкой) или если цена изменяется во времени
(например, цена сельскохозяйственной продукции), то это также следует
включить в оптимизационные расчеты.
153
t—>со
т т т
Полученное выражение содержит сумму двух слагаемых. Первое
слагаемое, а / Т, определяется постоянной составляющей затрат и представляет
собой обратно пропорциональную зависимость от Т. Второе слагаемое, 0,5ЬаТ,
определяется переменной составляющей затрат и представляет собой прямо
пропорциональную зависимость от Т.
155
Отсюда
Поскольку отрицательное значение Т смысла не имеет, в качестве
оптимальной длины цикла Т* получаем единственную величину:
Т* _ 2а
V ba ‘
Вспомним, что размер партии и длина цикла связаны соотношением Q =
аТ. Отсюда для оптимального размера партии Q* получаем:
Q* = аТ* = а — = — .
VЬ V ba
Оптимальный размер партии в этих условиях называется также
экономичным объемом заказа (economic order quantity - EOQ).
Для получения минимальных средних затрат в единицу времени L* следует
подставить Т* в указанную выше формулу для L. В результате получим:
2-50-
10
ОД
100 (ящиков).
Длина цикла (периодичность поставок) Т* определяется равенством:
159
Характеристики модели
Т» = (2а/(аЬ(1 -а/р)))0'5,
1 - а/р.
Отношение а/р сопоставляет интенсивность спроса с интенсивностью
поставки. Рост интенсивности поставки в пределе приводит к ситуации
мгновенной поставки. Оптимизационные формулы для нашей модели в
пределе, при a/р —» 0, переходят в формулы для рассмотренной выше
простейшей модели с мгновенной поставкой. При этом, в частности,
становится:
Q* = х* X"* = Т Т'* = О
Т = Ti + т2, Q = x + s, Q = ocT,
Т = Q/a, Ti = X/a, T2 = S/a,
X = аТь S = aT2,
О Т 2Т ЗТ t
Рис. 3.7. Динамика трех видов запасов при согласованном цикле
Обозначим соответствующий период (цикл управления запасами)
посредством Т. Тогда размер партии i-ro товара Qi определяется формулой:
170
Qi = а,Т •
При таких объемах поставки запасы всех продуктов исчерпываются
одновременно, в конце периода Т, в этот момент поступает новая партия, и
цикл возобновляется.
Затраты в единицу времени определяются формулой:
1
a
+ ^T2-Zbiai
2 i
i=
L=
Т
Минимум затрат, определяемый так же, как и в выводе формул Уилсона,
достигается при величине цикла:
2а
Zbiai
i=l
Qk = akT =оск
Zbiai
i=l
L
* =y2aZbiai •
R=£Q;.
k=l
Если при этом R < Р, то размер партии товаров следует сохранить равным
найденным выше значениям Qk. Если же это неравенство не
172
IX
к=1
Т* = R
П
IX
k=i
174
175
Таким образом:
176
177
п
2Х
к=1
h-T*
178
179
Аналогично:
Q; а кТ ак •h - Т h • ак • Т h-
180 Q*.
181
Новые размеры партии и длина цикла пропорциональны прежним
оптимальным величинам. Новые издержки L по управлению запасами в
единицу времени тоже пропорциональны прежним оптимальным издержкам
L*, но с другим коэффициентом пропорциональности Н,
L = Н • L*,
где
н Л(ь+1).
Таблица 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
Аннотация
Содержание
Введение………………………………………………………………….
Теоритический обзор……………………………………………………
Приложение………………………………………………………………
Введение
, где
, (2)
где
– количество производимого i-го вида продукции за первый год
– количество производимого i-го вида продукции за второй год,
здесь соответствует ; соответствует ; соответствует ; что
означает, что это один вид продукции за первый и второй год
соответственно.
Также необходимо наложить условия неотрицательности на каждый
, т. к. количество произведенного товара не может быть меньше 0. К тому же
ограниченность ресурсов также имеет место. Ограничения будут выглядеть
следующим образом:
Теоретический обзор
В настоящее время ряд экспертов изучают все возможности для построения
эффективной модели функционирования предприятия. Для этого существуют
различные методы, например, проведение экспериментов, изучение
поведения объекта раннее, а также прогноз на его вероятное будущее
поведение. Еще одним методом изучения оптимального производства
является математическое моделирование, составление функций, а также
изучение путей его решения. Преимуществом математического
моделирования являются низкие затраты.
При математическом моделировании находятся характеристики
рассматриваемого объекта.
При решении оптимизационных задач часто используются ЭВМ.
В настоящее время уже разработано ряд программ, которые находят
оптимальный план при решении экономических задач. Эти алгоритмы
являются весьма эффективными. Экономическими экспертами подробно
изучается поведение фирмы, вероятное планирование конкурирующих фирм,
ценообразование, тщательно продумывается план производства.
Надо отметить, что большую роль играет ценовая политика. Так как в
настоящей дипломной работе затрагивается тема ценообразования, то
остановимся на ней поподробнее.
Случаи, когда используется ценовая конкуренция:
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
Ход исследования
Составление задачи не составило особого труда. Были использованы
различные способы. В начале хода исследования стояла задача сравнить и
исследовать следующие проблемы.
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 фиксированные
константы), то частная производная будет иметь вид:
Составляем таблицу
Базис θ
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
Составим вектор
Где
При ограничениях
Получим ответы:
При ограничениях:
Это означает, что второй фирме выгодно производить лишь второй вид
продукции в первый год.
При ограничениях
Получим ответы:
При ограничениях:
При ограничениях
Получим ответы:
При ограничениях:
5)
При ограничениях
Получим ответы:
При ограничениях:
При ограничениях
199
Получим ответы:
При ограничениях:
7)
При ограничениях
Получим ответы:
При ограничениях:
200
При ограничениях
Получим ответы:
При ограничениях:
При ограничениях
Получим ответы:
При ограничениях:
При ограничениях
Получим ответы:
Заключение
Приложение
Программная реализация модифицированного симплекс-метода.
Программа принимает на вход коэффициенты целевой функции, а
также коэффициенты при ограничениях. Базис также задается
вручную.
На выходе программа выдает количество товаров, которое оптимальнее
всего производить в течение двух лет фирме А.
Листинг1. (main.cpp)
#include "header.h"
#include "Symplex.h"
int main()
{
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();
};
#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);
}
Листинг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);
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()
{
}
void Simplex::printTable()
{
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