Разработка программного обеспечения отдела работы с поставщиком.
Задача о поставке товаров

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ

НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ УКРАИНЫ

«КИЕВСКИЙ ПОЛИТЕХНИЧЕСКИЙ ИНСТИТУТ»

Кафедра прикладной математики

КУРСОВОЙ ПРОЕКТ

по дисциплине: «Программное обеспечение ЭВМ»

на тему:

Разработка программного обеспечения отдела работы с поставщиком. Задача о поставке товаров

Выполнил: Дубинин П. В.

Группа КМ-21 Факультет ФПМ

N зачетной книжки КМ-2111

Руководитель: Олефир А.С. ()

КИЕВ — 2006

ПЕРЕЧЕНЬ ПРИНЯТЫХ СОКРАЩЕНИЙ

АРМ — автоматизированное рабочее место;

АСОД — автоматизированная система обработки данных;

ОС — операционная система;

ПО — программное обеспечение;

ЗЦЛП — задача целочисленного линейного программирования;

ЗЛП — задача линейного программирования;

ЗДП — задача дискретного программирования;

РЗ — распределительная задача;

СУБД — система управления базами данных.

БД — база данных;

СОДЕРЖАНИЕ

ВВЕДЕНИЕ

1. ПОСТАНОВКА ЗАДАЧИ

2. ОБЗОР ЛИТЕРАТУРЫ

3. Проектирование математического обеспечения

3.1 Анализ исходных данных

3.2 Математические методы решения задачи

3.3 Архитектура разработанных программных средств

3.4 Описание пользовательского интерфейса

4. Программная реализация математического обеспечения

4.1 Описание разработанных алгоритмов

4.2 Описание программ

4.3 Язык управления программами

4.4 Руководство пользователя

5. Испытание математического обеспечения

5.1 Описание контрольных примеров

5.2 Описание экспериментальных расчетов

ЗАКЛЮЧЕНИЕ

ЛИТЕРАТУРА

ПРИЛОЖЕНИЕ

ВВЕДЕНИЕ

В современном мире такая отрасль человеческого деяния, как экономика приобрела очень высокое и важное значения. В связи с этим человек всячески пытается упростить своё участие в этой сфере, разрабатывая автоматические системы управления, переводя все «рычаги» управления на «плечи» машин. Человеку только остаются задачи, которые непосильны для компьютеров, которые решаются на уровне человеческого взаимоотношения и понимания.

Предметной областью, в широком значении этого слова, для которой разрабатывается программный продукт является «экономическая система», очень сложная категория, которая включает в себя разветвленную структуру, целую систему законов её функционирования и развития. Если смотреть на все это в более узком смысле, то можно сказать, что предметной областью является система организованного управления. Под системой организованного управления понимают систему, которая состоит из большого количества подсистем (модулей), которые тем или иным способом взаимодействуют между собой.

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

Данная программа предназначена для повышения точности, быстродействия, надежности, качества выполнения расчетов по поставке товара конкретного предприятия.

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

В данной курсовой работе необходимо создать программное обеспечение для АРМ «Менеджера». Это должность в каком-то смысле приобретает тот вид должностей, которые можно отнести к руководящим на коммерческом предприятии, ведь именно от того на сколько эффективно работает менеджер, на столько и зависит доход и общий экономический рост фирмы.

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

Итак, основные функции менеджера:

— Работа с дилерами (формирование заказов у компаний-поставщиков на определенный тип товаров)

— Робота с клиентами (формирование и предоставление клиентам широкого спектра товаров, которые имеются в наличии и гибкую систему цен)

— Работа с сотрудниками (разработка и реализация новых идей, в связи с постоянно меняющимся положением на финансовом рынке)

— Разработка новой рыночной политики, которая бы сопутствовала финансовому росту предприятия в жестокой конкуренции.

Таким образом, программное обеспечение разрабатывается для создания АСОД, которая позволяет автоматизировать в некоторой степени работу менеджера (коммерческого директора).

1. ПОСТАНОВКА ЗАДАЧИ

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

МЕТОД ДИНАМИЧЕСКОГО ПРОГРАММИРОВАНИЯ

Сущность вычислительного метода

Динамическое программирование — это вычислительный метод для решения задач определенной структуры. Динамическое программирование возникло и сформировалось в 1950 — 1953 гг. благодаря работам Р. Беллмана и его сотрудников. Первые задачи, которые привели к появлению вычислительного метода динамического программирования, являлись динамическими задачами управления запасами.

Сущность вычислительного метода рассмотрим на следующем примере.

Максимизировать

при условиях

aj> 0; xj> =0;

Целевая функция задачи является сумой функций от одной переменной. Такая функция называется аддитивной. Если все fj (xj), i =1,2,…, n — выпуклые (вогнутые), то для решения может быть применен метод множителей Лагранжа. Однако если имеется много локальных максимумов, то этот метод дает лишь одно из таких решений. В случаи если требуется найти глобальный максимум, метод множителей Лагранжа не применим.

Рассмотрим метод, обеспечивающий решение задачи. Считаем все {aj}, j = 1,…, n и b целыми числами. Предположим также, что в задаче все переменные {xj} могут принимать только целочисленные значения.

Введем следующие обозначения. Через z* обозначим абсолютный максимум z при условии. Выбираем значение Xn зафиксировав его, максимизируем z по всем остальным переменным x1, x2, …, xn-1. Предположим, что такая максимизация, проведена для всех возможных значений xn. Тогда z* будет наибольшим из всех возможных значений z. Формально этот процесс записывается так:

Причем

Так как для не отрицательных целых чисел, удовлетворяющих условию зависит от, то обозначим:

Допустим, что мы вычислили для всех допустимых целых значений xn = {0,1,…, []}, где [] обозначает целую часть.

Очевидно, что

z* =

Для вычисления этой формулы определяем значения fn (xn) и для всех допустимых значений xn и выбираем максимальное. Одновременно находим и xn*. Таким образом, если бы была известна функция, то вся задача свилась бы к задаче с одной переменной.

Покажем, как можно вычислять

Очевидно,

;

Рассуждая, как выше получаем:

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

Симплекс-метод

Постановка задачи линейного программирования (ЗЛП).

В общем случае задача ЛП формулируется следующим образом:

Найти вектор X=(x1,x2,…, xn), минимизирующий (максимизирующий) линейную форму

j=1,…, n (n — количество переменных) (1)

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

i=1,…, m (m — количество ограничений) (2)

xj0 j=1,…, n.

Или в матричных обозначениях минимизировать (максимизировать) z=cx при ограничениях Axb (x0).

A (m*n) называется матрицей коэффициентов;

x (n*1) — вектор-столбец — вектор переменных;

b (m*1) — вектор ресурсов или вектор свободных членов;

c (1*n) — вектор-строка — вектор коэффициентов целевой функции или вектор оценок задачи ЛП.

1). Задачу максимизации всегда можно свести к задаче минимизации линейной функции при тех же ограничениях: max (z)=-min (-z)

2). Решение любой линейной системы неравенств и уравнений всегда можно свести к решению некоторой системы линейных уравнений с неотрицательными переменными. Любое действительное число всегда можно представить в виде разности двух неотрицательных чисел: xj= xj (1)-xj (2), где xj (1)0, xj (2)0.

Определение 1. Допустимым решением (планом) ЗЛП называется вектор X=(x1,x2,…, xn), удовлетворяющий всем её ограничениям (2).

Определение 2. Оптимальным решением (планом) ЗЛП является такое допустимое решение, которое оптимизирует (min или max) целевую функцию (1).

Решение ЗЛП основывается на следующих теоремах.

Теорема 1

Множество всех допустимых решений ЗЛП выпукло.

Теорема 2.

Множество допустимых решений ЗЛП с условиями (2) всегда содержит в себе конечное число крайних точек.

Теорема 3.

Целевая функция (1) ЗЛП (1)-(2) достигает своего экстремума в крайней точке выпуклой области, являющейся множеством допустимых решений этой задачи.

Симплекс-метод решения ЗЛП.

ОЗЛП:

i=1,…, m

xj0 j=1,…, n.

Область допустимых решений ЗЛП представляет выпуклый многогранник. Оптимальное решение находится в вершинах многогранника. В основе симплекс-метода лежит целенаправленный перебор вершин области допустимых решений.

При этом движение к оптимальной вершине осуществляется по соседним вершинам области.

Табличный симплекс-метод.

Предположим, что ЗЛП задана в виде КЗЛП. Приводим её к канонической задаче в стандартной форме:

СКЗЛП

и выразим базисные переменные через свободные:

j=1,…, n

x1 xn — свободные переменные;

xn xn+m — базисные переменные;

Если все bj0 — имеем допустимое решение (ДБР).

Основные требования к разрабатываемой системе:

1. Перечень основных функций разрабатываемой системы:

· Ввод информации (считывание данных из БД или из файла)

· Обработка исходных данных, преобразование их к виду, нужному для работы математических методов.

· Вывод результатов выполнения программы в понятной и наглядной форме

· Сохранение данных

· Удаление данных

· Изменение данных

2. Требования к техническим средствам:

· Процессор: Pentium 400 Мгц и выше

· Объем ОЗУ: не менее 64 Мб

· Свободное место на жестком диске: не менее 20 Мб

3. Требование к программным средствам:

ОС Windows NT/2000/XP. Для работы с БД на компьютере должна быть установлена и настроена СУБД: Microsoft SQL Server 2000.

4. Требования к надежности и к обслуживающим программам:

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

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

· Система должна обладать широким спектром инструментальных средств, высокой производительностью и функциональностью.

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

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

2. ОБЗОР ЛИТЕРАТУРЫ

Составим математическую модель поставленной задачи:

Пусть для поставки каждого из n видов продукции используется m видов ресурсов, причём расход i-го вида ресурсов на единицу j-го вида продукции составляет aij единиц. Пусть прибыль от поставки и реализации единицы j-го вида продукции составляет cj гривен. Запасы ресурсов ограничены и составляют соответственно b1, b2,…, bm единиц. xij — планируемый объем заказа продукции j-го вида.

Требуется установить такой план X=(x1, x2,…, xn) поставки продукции, который при импортирующихся объёмах ресурсов обеспечивал наибольшую суммарную прибыль предприятию.

Математическая модель задачи:

Найти такой план X=(x1, x2,…, xn), что бы выполнялись следующие ограничения:

xj0 j=1,…, n (условие неотрицательности переменных).

i=1,…, m (ограничение на использование ресурсов),

и при этом достигался бы максимум функции (суммарная прибыль от поставок и реализации продукции).

Следовательно, математическая модель данной экономической системы представляет собой задачу линейного программирования, которая может быть решена различными методами, наиболее распространенными из которых являются:

Ш Графический метод. Основан на геометрической интерпретации задачи линейного программирования и применяется в основном при решении задач двумерного пространства и только некоторых задач трехмерного пространства, так как довольно трудно построить многогранник решений, который образуется в результате пересечения полупространств. Задачу пространства размерности больше трех изобразить графически вообще невозможно. [3],[4]

Ш Симплекс-метод. Он является универсальным методом для решения линейной системы уравнений или неравенств и линейного функционала. В его основе лежит целенаправленный перевод вершин области допустимых решений задачи линейного программирования. 3]

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

· Симплекс метод.

· Метод динамического программирования.

3. Проектирование математического обеспечения

3. 1 Анализ исходных данных

Для построения математической модели и дальнейшего решения поставленной задачи используются следующие исходные данные:

· А[i, j] -матрица расхода i ресурсов на j вид продукции;

· С[j] — прибыль от поставки и реализации единицы j-го вида продукции;

· b[1,,m] — ограниченные запасы ресурсов

· X[i,j] — планируемый объем заказа продукции j-го вида.

На основе этих данных строится общая, сведенная к задаче линейного программирования, матрица А[i, j], которая представляет собой мат. модель для поставленной задачи.

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

Описание результатов

Результатом работы программы являются:

· X[i, j] — таблица плановой закупки продукции

3. 2 Математические методы решения задачи

Постановка задачи линейного программирования (ЗЛП).

В общем случае задача ЛП формулируется следующим образом:

Найти вектор X=(x1,x2,…, xn), минимизирующий (максимизирующий) линейную форму

j=1,…, n (n — количество переменных) (1)

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

i=1,…, m (m — количество ограничений) (2)

xj0 j=1,…, n.

Или в матричных обозначениях минимизировать (максимизировать) z=cx при ограничениях Axb (x0).

A (m*n) называется матрицей коэффициентов;

x (n*1) — вектор-столбец — вектор переменных;

b (m*1) — вектор ресурсов или вектор свободных членов;

c (1*n) — вектор-строка — вектор коэффициентов целевой функции или вектор оценок задачи ЛП.

1). Задачу максимизации всегда можно свести к задаче минимизации линейной функции при тех же ограничениях: max (z)=-min (-z)

2). Решение любой линейной системы неравенств и уравнений всегда можно свести к решению некоторой системы линейных уравнений с неотрицательными переменными. Любое действительное число всегда можно представить в виде разности двух неотрицательных чисел: xj= xj (1)-xj (2), где xj (1)0, xj (2)0.

Определение 1. Допустимым решением (планом) ЗЛП называется вектор X=(x1,x2,…, xn), удовлетворяющий всем её ограничениям (2).

Определение 2. Оптимальным решением (планом) ЗЛП является такое допустимое решение, которое оптимизирует (min или max) целевую функцию (1).

Решение ЗЛП основывается на следующих теоремах.

Теорема 1

Множество всех допустимых решений ЗЛП выпукло.

Теорема 2.

Множество допустимых решений ЗЛП с условиями (2) всегда содержит в себе конечное число крайних точек.

Теорема 3.

Целевая функция (1) ЗЛП (1)-(2) достигает своего экстремума в крайней точке выпуклой области, являющейся множеством допустимых решений этой задачи.

Симплекс-метод решения ЗЛП.

ОЗЛП:

i=1,…, m

xj0 j=1,…, n.

Область допустимых решений ЗЛП представляет выпуклый многогранник. Оптимальное решение находится в вершинах многогранника. В основе симплекс-метода лежит целенаправленный перебор вершин области допустимых решений. При этом движение к оптимальной вершине осуществляется по соседним вершинам области.

Табличный симплекс-метод.

Предположим, что ЗЛП задана в виде КЗЛП. Приводим её к канонической задаче в стандартной форме:

СКЗЛП

и выразим базисные переменные через свободные:

j=1,…, n

x1 xn — свободные переменные;

xn xn+m — базисные переменные;

Если все bj0 — имеем допустимое решение (ДБР).

Сводим данные в таблицу:

Базисные

переменные

Свободные

Члены

Свободные переменные

x1

x2

xn

xn+1

b1

b1/?12

?11

?11/ ?12

?12

1/?12

?1n

?1n/ ?12

xn+m

bm

bm+(b1/?12)*(-?m2/?12)

?m2

-?m2/?12

Q

c0

j1

j2

-j2/?12

jn

В таблицу записываются старые и новые переменные. Старые переменные — в верхнем левом углу, новые значения (после 1-ой итерации СМ) — в нижнем правом углу.

Количество строк = количество базисных переменных + строка целевой функции.

Количество столбцов = количество свободных переменных + столбец свободных членов.

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

Проверяется оптимальность целевой функции. Условие оптимальности: ?i?0 (коэффициенты при свободных переменных в целевой функции неположительные).

Предположим ?20, тогда столбец с положительным? выбирается в качестве генерального столбца (эту свободную переменную будем вводить в базис). Если имеется несколько столбцов с неотрицательными коэффициентами, то выбирается столбец с максимальным значением, при этом скорость уменьшения целевой функции будет наибольшая.

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

Элемент, стоящий на пересечении генеральной строки и генерального столбца называется генеральным элементом (обведём его кружком, например ?12).

Пересчёт новых значений:

1) В клетке генерального элемента новым значением будет значение, обратное к старому, 1/?12.

2) В генеральной строке новое значение — это старой значение, делённое на генеральный элемент. Обведём старое значение.

3) В генеральном столбце значение новых переменных — это старые значения, делённые на генеральный элемент с обратным знаком. Обведём новое значение элемента.

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

Соответствующие вычисляемому элементу значения — это те, на пересечении которых стоит данный элемент. Пересчет значений в каждой клетке таблицы соответствует одной итерации симплекс-метода.

После заполнения таблицы опять проверяется:

допустимость решения (свободные члены 0);

оптимальность решения (коэффициенты целевой функции ?0).

Если выполняется 1), а 2) не достигнуто, итерации продолжаются. Заполняется новая симплекс-таблица, в которой новые значения записываются на место старых значений — в верхний левый угол каждой клетки и вычисления повторяются до получения оптимального решения. Не нужно забывать записывать новые названия базисных и свободных переменных, которые меняются местами.

Идеи СМ.

— на каждом шаге должно уменьшатся значение целевой функции;

— базисное решение должно оставаться допустимым.

3.3 Архитектура разработанных программных средств

Структура ПО описывается следующей схемой (набором подпрограмм) (рис. 1), где

1. Управляющая программа — предназначена для управления всеми блоками ПО, для обеспечения связей между ними и осуществления контроля за выполнением их функций.

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

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

2. Подпрограмма формирования пользовательского интерфейса — формирование средств ввода исходных данных и вывода результатов программы, наглядное отображение всех возможностей программы.

Входные данные: запросы пользователей в виде нажиманий на пункты пользовательского меню.

Выходные данные: соответствующие запросам действия программы в виде запуска других подпрограмм.

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

Входные данные: выбор соответствующего меню пользователя.

Выходные данные: отображения справки на экране в текстовой форме.

4. Ввод данных пользователем — формирование входящих данных, необходимых для решения задачи и контроль их ввода.

Входные данные: добавление нового рабочего, его производительности для каждой новой работы, себестоимости работ, фондов времени и ожидаемых планов выполнения работ

Выходные данные: сформулированные и проконтролированные соответствующие входным данным массивы и матрицы данных.

5. Загрузка данных и БД -- загрузка начальных данных из БД.

Входные данные: запрос пользователя в БД.

Выходные данные: матрицы и массивы исходные данных.

7. Подпрограмма преобразования исходных данных в требуемый для алгоритмов вид — составление из вышеописанных массивов модели ЗЛП — матрицы Аij.

Входные данные: обработанные исходные данные.

Выходные данные: математическая модель ЗЛП.

3.4 Описание пользовательского интерфейса

Пользовательский интерфейс разработан в виде стандартного окна операционной системы Windows XP.

В пункте главного меню «Файл» присутствуют следующие операции доступные пользователю: загрузить из файла, сохранить в файл, ввести вручную, выход

Данные можно вводить в ручную (пункт меню «ввести вручную»), используя пункты пользовательского меню, либо их можно загрузить из файла или из БД (загрузить из файла, ранее сохраненного).

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

рис. 1 — Главное окно программы. Формирование начальных данных.

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

рис. 2 — Загрузка исходных данных из файла

При вводе данных вручную необходимо выбрать соответствующий пункт главного меню.

рис. 3 Ввод данных «вручную»

4. Программная реализация математического обеспечения

4.1 Описание разработанных алгоритмов

СИМПЛЕКС — МЕТОД

Приведем блок-схему работы программы:

МЕТОД ДИНАМИЧЕСКОГО ПРОГРАММИРОВАНИЯ

4.2 Описание программ

Рассмотрим описание процедур и функций реализованной программы:

procedure ReshenieSM ();

procedure Ochistka ();

procedure VuvodRes ();

procedure ZapisVfail ();

procedure Read_File ();

procedure Preobraz ();

· Процедураm Read_File ();  — загружает пользовательские данные из файла

Входные данные: матрица стоимостей аij, количество строк и столбцов в ней.

· Процедура Dinamisheskij (); - вычисляет задачу методом динамического программирования

· Процедура Ochistka ();  — позволяет очистить форму результатов и входных даных.

· Процедура ReshenieSM ();  — решение задачи поиска оптимального плана поставки в пошаговом режиме.

Входные данные: матрица стоимостей aij поставки, вектор огранений bi, вектор стоимостей Сj

Выходные данные: решение задачи формирование оптимального плана закупок, вектор Xj

· Процедура VuvodRes ();  — вывод результатов в доступной для пользователя форме

Входные данные: результирующая матрица

Выходные данные: отображение результатов

— Процедура ZapisVfail (); - запись в файли данных, веденные пользователем.

Входные данные: матрица стоимостей aij поставки, вектор огранений bi, вектор стоимостей Сj

Процедура Preobraz (); - преобразование результирующей матрицы после определения нового генерального элемента.

4.3 Язык управления программами

Основные элементы управления программой: таблицы, кнопки, элементы меню.

Элементы интерфейса представлены в пункте 3.4. Описание пользовательского интерфейса (рис. 1 — рис. 3)

4. 4 Руководство пользователя

Сама программа инсталляции не требует. Для запуска программы нужно запустить файл Postavwik. exe, далее действовать по пунктам, описанными в 3.4. Описание пользовательского интерфейса (рис. 1 — рис. 3).

5. Испытание математического обеспечения

5.1 Описание контрольных примеров

Постановка задачи планирования:

Необходимо опредилить план закупки N типов товаров X=(x1,x2,., xn) для фирмы по продаже компьютерной техники, при условии наилутшего использования ёё резервных средств (денег) для закупки комплектующих.

Предприятие выделяет резервные средства (деньги) Bi (i=1,., m) на M комплектующих. Также известные затраты ресурсов на поставку і-той детали для j-го типа Aij (i=1,., m, j=1,., n). Прибыль с еденицы реализованой продукции — Cj (j=1,., n); Фирма работает с n фирмами-поставщиками.

Контрольный пример № 1

Фирма по продаже ПК закупает товары у своих поставщиков, которые предоставляют товары непосредственно от производителя. Закупаються следующие типы товаров:

— Комплектующая 1

— Комплектующая 2

— Комплектующая 3

Для поставки товаров определенного типа выделяется следующие ресурсы:

— Ресурс 1 360 y.e.

— Ресурс 2 520 у.е.

— Ресурс 3 220 у.е.

Известна прибыль от реализации типа компьютера

— Фирма 1 90 у.е.

— Фирма 2 110 у.е.

— Фирма 3 150 у.е.

Необходимо определить оптимальный план закупки каждой детали, с расчетом получить при этом максимальную прибыль

Необходимо определить оптимальный план закупки каждого типа компютера.

Комплектующие

Ціни на комплектуючі відповідного типу

Резервные ресурсы

Фирма 1

Фирма 2

Фирма3

Комплектующая 1

1

2

4

360

Комплектующая 2

2

4

2

520

Комплектующая 3

1

1

2

220

Таблиця 3. Умова задачі(приклад N1).

Математическая модель прямой задачи:

Пряма:

maxZ=90×1+110×2+150x3

-количество закупки продукции j-ог вида.

Канонический вид:

Min (-Z)=0-(90×1+110×2+150×3)

Ниже представлено решение симплекс методом

Свободные члены

X1

X2

X3

X4

360

90

1

¼

2

½

4

?

X5

520

340

2

3/2

4

0

2

X6

220

40

1

½

1

0

2

-Z

0

-13 500

90

52. 5

110

35

150

-37,5

X4

90

70

?

?

?

?

½

X5

340

220

3/2

-3

0

3

1

X6

40

80

?

2

0

0

-1

-Z

-13 500

-17 700

52. 5

-105

35

35

-37,5

15

Свободные члены

X1

X2

X3

X4

70

33,33

0

?

1/6

?

1/3

X5

220

73,33

-3

-1

3

1/3

1

-1

X6

80

-80

2

2

0

0

-1

-1

-Z

-17 700

-20 266 3/2

-105

-70

35

-11 2/3

15

3,333

Свободные члены

X1

X2

X3

X4

33,33

100

0

0

1/6

?

1/3

3

X5

73,33

40

-3

2

3

½

1

-1

X6

80

180

2

0

-1

30

-Z

-20 266 3/2

-20 600

-70

-70

-11 2/3

-10

3,333

-10

Max (Z)=-(min (Z))

MaxZ=20 600 (максимальная прибыль при таком плане).

Основные переменные

Дополнительные переменные

X1=180

X2=40

X3=0

X4=100

X5=0

X6=0

Таблица 4. Значение соответственных переменных.

Экономическая интерпретация

Основные переменные прямой задачи указывают на количество типов компьютеров которых необходимо закупить у соответствующей фирмы.

Следовательно необходимо закупить 40 наборов комплектующих фирмы 2, и 180 наборов комплектующих фирмы 1.

Максимальная прибыль которую можно получить при реализации такого оптимального плана равна 20 600 у.е.д.

Контрольный пример № 2

Фирма по продаже ПК закупает товары у своих поставщиков, которые предоставляют товары непосредственно от производителя. Закупаються следующие типы товаров:

— Комплектующая 1

— Комплектующая 2

— Комплектующая 3

Для поставки товаров определенного типа выделяется следующие ресурсы:

— Ресурс 1 360 y.e.

— Ресурс 2 192 у.е.

— Ресурс 3 180 у.е.

Известна прибыль от реализации типа компьютера

— Фирма 1 9 у.е.

— Фирма 2 10 у.е.

— Фирма 3 16 у.е.

Необходимо определить оптимальный план закупки каждой детали, с расчетом получить при этом максимальную прибыль

Необходимо определить оптимальный план закупки каждого типа компютера.

Комплектующие

Ціни на комплектуючі відповідного типу

Резервные ресурсы

Фирма 1

Фирма 2

Фирма3

Комплектующая 1

18

15

12

360

Комплектующая

6

4

8

192

Комплектующая 3

5

3

3

180

Таблиця 5. Умова задачі(приклад N2).

Max (Z)=-(min (Z))

MaxZ=400 (максимальная прибыль при таком плане).

Основные переменные

Дополнительные переменные

X1=0

X2=8

X3=30

X4=0

X5=0

X6=96

Таблица 6. Значение соответственных переменных.

Экономическая интерпретация

Основные переменные прямой задачи указывают на количество типов компьютеров которых необходимо закупить.

Следовательно необходимо закупить 8 наборов комплектующих фирмы 2, и 20 наборов комплектующих фирмы 1.

Максимальная прибыль которую можно получить при реализации такого оптимального плана равна 400 у.е.д.

5.2 Описание экспериментальных расчетов

Выполним все контрольные примеры с помощью программы. Сценарий проведения расчетов на программе описан в пункте 3.4. Описание пользовательского интерфейса (рис. 1 — рис. 3). Контрольный пример№ 1

Рис. 4— Контрольный пример № 1

рис. 5 — решение контрольного примера № 1

Теперь предоставим результаты работы программы с контрольным примером № 2:

рис. 6 входные данные примера № 2

рис. 7 результаты решения контрольного примера № 2

ЗАКЛЮЧЕНИЕ

В данной работе было создано ПО для составления оптимального плана закупки товара у поставщиков Для решения этой задачи мной было выбрано два метода — Симплекс метод и Модифицированный симплекс-метод.

Разработанная программа актуальна в настоящее время и может применяться в любой отрасли производства.

ЛІТЕРАТУРА

1. Олефір.O.C. «Конспект лекцій ПЗ ЕОМ».

2. Наконечний С.І., Савіна С.С., «Математичне програмування», КНЕУ, 2004 (ст. :3−7, 26−180).

3. Зайченко Ю. П. «Дослід операцій», видавничий дім «Слово», 2003 (ст.: 58−134).

4. П. Конюховський «Математичні методи дослідження операцій в економіці», Питер, 2000,(ст. :17−79).

5. Ладогубець Т. С. «Конспект лекцій по методам оптимізації"(1-ий семестр).

ПРИЛОЖЕНИЕ

Листинг программы

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Grids, StdCtrls, Buttons, ComCtrls, Menus, DB, ADODB, ExtCtrls;

type

zapis = record

s: string;

i: integer;

end;

TForm1 = class (TForm)

Label2: TLabel;

MainMenu1: TMainMenu;

File1: TMenuItem;

Load1: TMenuItem;

Save1: TMenuItem;

Exit1: TMenuItem;

OpenDialog1: TOpenDialog;

SaveDialog1: TSaveDialog;

N1: TMenuItem;

StringGrid2: TStringGrid;

StringGrid1: TStringGrid;

Label3: TLabel;

Label4: TLabel;

StringGrid4: TStringGrid;

StringGrid3: TStringGrid;

BitBtn4: TBitBtn;

BitBtn3: TBitBtn;

BitBtn6: TBitBtn;

BitBtn5: TBitBtn;

Button1: TButton;

Label1: TLabel;

Button2: TButton;

StringGrid5: TStringGrid;

Label5: TLabel;

procedure BitBtn1Click (Sender: TObject);

procedure FormCreate (Sender: TObject);

procedure UpDown1Click (Sender: TObject; Button: TUDBtnType);

procedure Load1Click (Sender: TObject);

procedure Save1Click (Sender: TObject);

procedure BitBtn3Click (Sender: TObject);

procedure BitBtn4Click (Sender: TObject);

procedure BitBtn5Click (Sender: TObject);

procedure BitBtn6Click (Sender: TObject);

procedure BitBtn7Click (Sender: TObject);

procedure ReshenieSM ();

procedure Ochistka ();

procedure VuvodRes ();

procedure ZapisVfail ();

procedure Read_File ();

procedure Preobraz ();

procedure N1Click (Sender: TObject);

procedure BitBtn2Click (Sender: TObject);

procedure Button2Click (Sender: TObject);

procedure Dinamisheskij ();

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

shag: integer;

matrix, matrix2: array[0. 6,0. 6] of Real;

baz, dop: array [0. 6] of integer;

implementation

uses Unit2;

{$R *. dfm}

procedure TForm1. BitBtn1Click (Sender: TObject);

var

m, n, i, j, k, f: integer;

begin

m: =StringGrid2. RowCount-1;

n: =StringGrid2. ColCount-1;

f: =0;

for i: =1 to n do

for j: =1 to m do

begin

if StringGrid2. Cells[i, j]='' then

begin

f: =1;

ShowMessage ('Ошибка в элементе ['+IntToStr (i)+','+IntToStr (j)+']'+#10#13+' В матрице расходов ресурсов');

end

else

try

k: =StrToInt (StringGrid2. Cells[i, j]);

if k<1 then

begin

ShowMessage ('Ошибка в элементе ['+IntToStr (i)+','+IntToStr (j)+']'+#10#13+' В матрице расходов ресурсов элементы должны быть положительными и > 0');

f: =1;

end;

except

on EConvertError do

begin

ShowMessage ('Ошибка в элементе ['+IntToStr (i)+','+IntToStr (j)+']'+#10#13+' В матрице расходов ресурсов должно стоять целочисленное значение');

f: =1;

end;

end;

end;

for i: =1 to n do

begin

if StringGrid1. Cells[i, 0]='' then

begin

f: =1;

ShowMessage ('Ошибка в элементе ['+IntToStr (i)+']'+#10#13+' В вектор прибылть не введены данные');

end

else

try

k: =StrToInt (StringGrid1. Cells[i, 0]);

if k<1 then

begin

ShowMessage ('Ошибка в элементе ['+IntToStr (i)+']'+#10#13+' В вектор прибылть элементы должны быть положительными и > 0');

f: =1;

end;

except

on EConvertError do

begin

ShowMessage ('Ошибка в элементе ['+IntToStr (i)+','+IntToStr (j)+']'+#10#13+' В вектор прибылть должно стоять целочисленное значение');

f: =1;

end;

end;

end;

For i:= 1 to m do

begin

if StringGrid4. Cells[i, 0]='' then

begin

f: =1;

ShowMessage ('Ошибка в элементе ['+IntToStr (i)+']'+#10#13+' В векторе ограничений не введены данные');

end

else

try

k: =StrToInt (StringGrid4. Cells[i, 0]);

if k<1 then

begin

ShowMessage ('Ошибка в элементе ['+IntToStr (i)+']'+#10#13+' В векторе ограничений элементы должны быть положительными и > 0');

f: =1;

end;

except

on EConvertError do

begin

ShowMessage ('Ошибка в элементе ['+IntToStr (i)+']'+#10#13+' В векторе ограничений должно стоять целочисленное значение');

f: =1;

end;

end;

end;

if f=0 then

begin

ReshenieSM ();

end;

end;

rocedure Tform1. Dinamisheskij ();

var

kod: Bite;

MinSpis: Yzel;

i, j, k: integer;

Yzel0,Yzel1,Add, Root: YzelPoint;

chOne: Yzel;

begin

if mat1< >0 then

begin

for i: =0 to count do

begin

Spisok[i].r.d. c:=simvoli[i].d. c;

Spisok[i].r.d. col:=simvoli[i].d. col;

Spisok[i]. Point:=Nil;

Spisok[i]. left:=Nil;

Spisok[i]. Right:=Nil;

for j: =0 to 255 do

Spisok[i].r. bit[j]:=-1;

end;

root: =nil;

repeat

for i: =0 to count do

if Spisok[i].r.d. col<>-1 then

begin

MinSpis: =spisok[i];

k: =i;

end;

for i: =0 to count do

if Spisok[i].r.d. col<>-1 then

if MinSpis.r.d. col>Spisok[i].r.d. col then

begin

MinSpis: =Spisok[i];

k: =i;

end;

if MinSpis. Point=nil then

begin

new (Yzel0);

Yzel0^: =MinSpis;

Spisok[k].r.d. col:=-1;

end

else

begin

Yzel0: =MinSpis. Point;

Spisok[k].r.d. col:=-1;

end;

MinSpis.r.d. col:=-1;

for i: =0 to count do

if Spisok[i].r.d. col<>-1 then

begin

MinSpis: =spisok[i];

k: =i;

end;

if MinSpis.r.d. col<> -1 then

begin

for i: =0 to count do

if Spisok[i].r.d. col<>-1 then

if MinSpis.r.d. col>Spisok[i].r.d. col then

begin

MinSpis: =Spisok[i];

k: =i;

end;

if MinSpis. Point=nil then

begin

new (Yzel1);

Yzel1^: =MinSpis;

Spisok[k].r.d. col:=Yzel0^.r.d. col+Yzel1^.r.d. col;

end

else

begin

Yzel1: =MinSpis. Point;

end;

new (Add);

Add. left:=Yzel0;

Add. Right:=Yzel1;

add.r.d. col:=Yzel0^.r.d. col+Yzel1^.r.d. col;

Spisok[k]. Point:=Add;

end

else Root: =Yzel0;

until (root< >nil);

for i: =0 to 255 do kod[i]: =-1;

Count1: =0;

for i: =0 to count do

for j: =0 to count-1 do

begin

if SpisokYzlov[i].r.d. col>=SpisokYzlov[j].r.d. col then

begin

chOne: =SpisokYzlov[i];

SpisokYzlov[i]: =SpisokYzlov[j];

SpisokYzlov[j]: =chOne;

end;

end; end else TablSimplMetod;

end;

procedure TForm1. ReshenieSM (); //Glavnaja procedura

var

ii, jj, i, j, genj, geni, k, n, m: integer;

matrix, matrix2: array[0. 6,0. 6] of Real;

baz, dop: array [0. 6] of integer;

z: array[0. 20] of Real;

maxc: array[0. 1] of real;

c, b: integer;

begin

n: =StringGrid2. ColCount-1;

m: =StringGrid2. RowCount-1;

form2. Memo1. Lines. Add ('');

form2. Memo1. Lines. Add (' СИМПЛЕКС МЕТОД ');

for i: =1 to n do

baz[i]: =i;

for i: =1 to m do

dop[i]: =i+n;

matrix[0,m]: =0;

for i: =1 to n do

begin

matrix[i, m]: =StrToFloat (StringGrid1. Cells[i, 0]);

for j: =0 to m-1 do

matrix[i, j]: =StrToFloat (StringGrid2. Cells[i, j+1]);

end;

for j: =0 to m-1 do

matrix[0,j]: =StrToFloat (StringGrid4. Cells[j+1,0]);

repeat

b: =0;

for j: =0 to m-1 do

if matrix[0,j]<0 then b: =-1;

if b> =0 then

begin // ------------ B >= 0

c: =0;

for i: =1 to n do

begin

if matrix[i, m]>0 then c: =1;

end;

if c>0 then

begin //------Cj > 0

maxc[0]: =0;

maxc[1]: =0;

geni: =0;

for i: =1 to n do

if MaxC[1]< =matrix[i, m] then

begin

maxc[1]: =matrix[i, m];

geni: =i;

end;

maxc[1]: =1000;

genJ: =0;

for j: =0 to m-1 do

if matrix[geni, j]< >0 then

if ((matrix[0,j]/matrix[geni, j])> 0) and

(maxc[1]> (matrix[0,j]/matrix[geni, j])) then

begin

//ShowMessage (IntToStr (genj)+' '+FloatToStr (matrix[geni, genj]));

maxc[1]: =matrix[0,j]/matrix[geni, j];

genj: =j;

end;

// end;

end; //------Cj > 0

end // ------------ B >= 0

else

begin//---------------B< 0

for j: =0 to m-1 do

if matrix[0,j]<0 then

begin

maxc[1]: =matrix[0,j];

genj: =j;

end;

for J: =0 to m-1 do

if (abs (matrix[0,j])> abs (maxc[1]))and (matrix[0,j]<0) then

begin

maxc[1]: =matrix[0,j];

genj: =j;

end;

for i: =1 to n do

if matrix[i, genj]<0 then

begin

maxc[1]: =matrix[0,genj]/matrix[i, genj];

geni: =i;

end;

for i: =1 to n do

if (maxc[1]> matrix[0,genj]/matrix[i, genj])and (matrix[i, genj] < 0) then

begin

maxc[1]: =matrix[0,genj]/matrix[i, genj];

geni: =i;

end;

end; //---------------B< 0

if c=1 then

begin

Application. ProcessMessages;

form2. memo1. Refresh;

form2. Memo1. Lines. Add ('');

form2. Memo1. Lines. Add ('Генеральный элемент: ['+IntToStr (geni+1)+','+IntToStr (genj+1)+']');

form2. Memo1. Lines. Add ('Значение в ген. эл: '+FloatToStr (matrix[geni, genj]));

form2. Memo1. Lines. Add ('max (Z)='+FloatToStr (abs (round (matrix[0,m]))));

form2. Memo1. Lines. Add ('смена X'+IntToStr (baz[geni])+' базисной на X'+IntToStr (dop[genj+1])+' дополнительной переменной');

for i: =0 to n do

for j: =0 to m do

begin

if ((i= geni) and (j=genj)) then

matrix2[i, j]:= 1 / matrix[i, j] else

if (i=geni)and (j< >genj) then

matrix2[i, j]:= - matrix[i, j]/matrix[geni, genj] else

if (j=genj)and (i< >geni) then

begin

matrix2[i, j]: =matrix[i, j]/matrix[geni, genj];

end;

end;

for i: =0 to n do

for j: =0 to m do

begin

if not ((i= geni) and (j=genj)) then

if not (i=geni)and (j< >genj) then

if not (j=genj)and (i< >geni) then

matrix2[i, j]: =matrix[i, j]+matrix[i, genj]*matrix2[geni, j];

if i=0 then StringGrid3. Cells[i+1,j+1]:=FloatToStr (round (matrix2[i, j])) else

StringGrid3. Cells[i+1,j+1]:=FloatToStrF (matrix2[i, j], ffFixed, 4,4);

end;

matrix: =matrix2;

i: =baz[geni];

baz[geni]: =dop[genj+1];

dop[genj+1]: =i;

end;

until c< =0;

form2. Memo1. Lines. Add ('');

form2. Memo1. Lines. Add ('Значение переменных: ');

for i: =0 to m-1 do

begin

form2. Memo1. Lines. Add ('X'+IntToStr (dop[i+1])+' = '+FloatToStrF (matrix[0,i], ffFixed, 4,4));

StringGrid3. Cells[0,i+1]:='X'+IntToStr (dop[i+1]);

end;

for i: =1 to n do

begin

form2. Memo1. Lines. Add ('X'+IntToStr (baz[i])+' = 0');

StringGrid3. Cells[i+1,0]:='X'+IntToStr (baz[i]);

end;

form2. Memo1. Lines. Add ('max (Z)='+FloatToStr (abs (round (matrix[0,m]))));

StringGrid5. Cells[0,0]:='Деталь';

StringGrid5. Cells[1,0]:='количество';

j: =1;

for i: =1 to m do

begin

if dop[i]< =n then

begin

StringGrid5. Cells[0,j]:=StringGrid2. Cells[dop[i], 0];

StringGrid5. Cells[1,j]:=FloatToStr (round (matrix[0,i-1]));

// label2. Caption:=label2. Caption+' компютеров компании: '+StringGrid2. Cells[dop[i], 0]+' '+FloatToStr (round (matrix[0,i-1]))+' шт; ';

StringGrid5. RowCount:=j+1;

inc (j);

end;

end;

ShowMessage ('Ращет проведен');

end;

procedure TForm1. FormCreate (Sender: TObject);

var i, j, k: integer;

f: TextFile;

s: string;

begin

shag: =0;

AssignFile (f,'komplekt. txt');

Reset (f);

Readln (f, s);

StringGrid2. Cells[1,0]:=s;

Readln (f, s);

StringGrid2. Cells[2,0]:=s;

Readln (f, s);

StringGrid2. Cells[3,0]:=s;

Readln (f, s);

StringGrid2. Cells[4,0]:=s;

Readln (f, s);

StringGrid2. Cells[5,0]:=s;

CloseFile (f);

AssignFile (f,'res. txt');

reset (f);

Readln (f, s);

StringGrid2. Cells[0,1]:=s;

Readln (f, s);

StringGrid2. Cells[0,2]:=s;

Readln (f, s);

StringGrid2. Cells[0,3]:=s;

Readln (f, s);

StringGrid2. Cells[0,4]:=s;

Readln (f, s);

StringGrid2. Cells[0,5]:=s;

CloseFile (f);

end;

procedure TForm1. UpDown1Click (Sender: TObject; Button: TUDBtnType);

begin

StringGrid2. RowCount:=StringGrid2. RowCount+1;

end;

procedure TForm1. Read_File (Sender: TObject); //----4tenie iz faila

var

Fname: string;

f: file of ShortString;

s: ShortString;

i, j, rc, cc: integer;

begin

//----

BitBtn3. Visible:=false;

BitBtn4. Visible:=False;

BitBtn5. Visible:=False;

BitBtn6. Visible:=False;

StringGrid1. Enabled:=False;

StringGrid2. Enabled:=False;

StringGrid4. Enabled:=False;

shag: =0;

StringGrid5. RowCount:=2;

StringGrid5. Cells[0,1]:='';

StringGrid5. Cells[1,1]:='';

Button2. Enabled:=true;

//-----

OpenDialog1. Filter:='Матрици (. math)|*. math|все файлы|*. *';

if OpenDialog1. Execute then

begin

s: =OpenDialog1. FileName;

AssignFile (f, s);

reset (f);

Read (f, s);

cc: =StrToInt (s);

read (f, s);

rc: =StrToInt (s);

StringGrid1. ColCount:=cc+1;

StringGrid4. ColCount:=rc+1;

StringGrid2. ColCount:=cc+1;

StringGrid2. FixedCols:=1;

StringGrid2. RowCount:=rc+1;

StringGrid2. FixedRows:=1;

StringGrid3. RowCount:=rc+2;

StringGrid3. ColCount:=cc+2;

for i: =0 to cc do

begin

read (f, s);

StringGrid1. Cells[i, 0]:=s;

end;

for i: =0 to rc do

begin

read (f, s);

StringGrid4. Cells[i, 0]:=s;

end;

for i: =0 to cc do

for j: =0 to rc do

begin

read (f, s);

StringGrid2. Cells[i+1,j+1]:=s;

end;

for i: =1 to cc+1 do

for j: =1 to rc+1 do

StringGrid3. Cells[i, j]:='';

for i: =2 to cc+1 do

StringGrid3. Cells[i, 0]:='X'+IntToStr (i-1);

for i: =1 to rc do

StringGrid3. Cells[0,i]:='X'+IntToStr (cc+i);

StringGrid3. Cells[0,rc+1]:='Z';

StringGrid3. Cells[1,0]:='Св. Чл. ';

CloseFile (f);

end;

end;

procedure TForm1. ZapisvFajl (Sender: TObject); // --------ZAPIS v Fail

var

f: file of ShortString;

s: ShortString;

i, j, rc, cc: integer;

begin

SaveDialog1. Filter:='Матрици (. math)|*. math|все файлы|*. *';

if SaveDialog1. Execute then

begin

assignfile (f, SaveDialog1. FileName+'. math');

rewrite (f);

cc: =StringGrid2. colCount-1;

rc: =StringGrid2. RowCount-1;

s: =inttostr (cc);

Write (f, s);

s: =IntToStr (rc);

Write (f, s);

for i: =0 to cc do

begin

s: =StringGrid1. cells[i, 0];

Write (f, s);

end;

for i: =0 to rc do

begin

s: =StringGrid4. cells[i, 0];

Write (f, s);

end;

for i: =0 to cc do

for j: =0 to rc do

begin

s: =StringGrid2. Cells[i+1,j+1];

Write (f, s);

end;

CloseFile (f);

end;

end;

procedure TForm1. VuvodRes ();//----------------Vuvod rezultatov

begin

Button2. Enabled:=false;

for i: =0 to m-1 do

begin

form2. Memo1. Lines. Add ('X'+IntToStr (dop[i+1])+' = '+FloatToStrF (matrix[0,i], ffFixed, 4,4));

StringGrid3. Cells[0,i+1]:='X'+IntToStr (dop[i+1]);

end;

for i: =1 to n do

begin

form2. Memo1. Lines. Add ('X'+IntToStr (baz[i])+' = 0');

StringGrid3. Cells[i+1,0]:='X'+IntToStr (baz[i]);

end;

form2. Memo1. Lines. Add ('max (Z)='+FloatToStr (abs (round (matrix[0,m]))));

StringGrid5. Cells[0,0]:='Деталь';

StringGrid5. Cells[1,0]:='количество';

Label2. Caption:='';

j: =1;

for i: =1 to m do

begin

if dop[i]< =n then

begin

StringGrid5. Cells[0,j]:=StringGrid2. Cells[dop[i], 0];

StringGrid5. Cells[1,j]:=FloatToStr (round (matrix[0,i-1]));

StringGrid5. RowCount:=j+1;

inc (j);

end;

end;

ShowMessage ('Ращет проведен');

end;

procedure TForm1. Preobraz ();//--------Preobrazovanie matricu

begin

for i: =0 to n do

for j: =0 to m do

begin

if ((i= geni) and (j=genj)) then

matrix2[i, j]:= 1 / matrix[i, j] else

if (i=geni)and (j< >genj) then

matrix2[i, j]:= - matrix[i, j]/matrix[geni, genj] else

if (j=genj)and (i< >geni) then

begin

matrix2[i, j]: =matrix[i, j]/matrix[geni, genj];

end;

end;

for i: =0 to n do

for j: =0 to m do

begin

if not ((i= geni) and (j=genj)) then

if not (i=geni)and (j< >genj) then

if not (j=genj)and (i< >geni) then

matrix2[i, j]: =matrix[i, j]+matrix[i, genj]*matrix2[geni, j];

if i=0 then StringGrid3. Cells[i+1,j+1]:=FloatToStr (round (matrix2[i, j])) else

StringGrid3. Cells[i+1,j+1]:=FloatToStrF (matrix2[i, j], ffFixed, 4,4);

end;

end;

procedure TForm1. BitBtn3Click (Sender: TObject);

begin

StringGrid2. ColCount:=StringGrid2. ColCount+1;

StringGrid1. ColCount:=StringGrid1. ColCount+1;

end;

procedure TForm1. BitBtn4Click (Sender: TObject);

begin

if StringGrid2. ColCount >3 then

begin

StringGrid2. ColCount:=StringGrid2. ColCount-1;

StringGrid1. ColCount:=StringGrid1. ColCount-1;

end;

end;

procedure TForm1. BitBtn5Click (Sender: TObject);

begin

StringGrid2. RowCount:=StringGrid2. RowCount+1;

StringGrid4. ColCount:=StringGrid4. ColCount+1;

end;

procedure TForm1. BitBtn6Click (Sender: TObject);

begin

if StringGrid2. RowCount>3 then

begin

StringGrid2. RowCount:=StringGrid2. RowCount-1;

StringGrid4. ColCount:=StringGrid4. ColCount-1;

end;

end;

procedure TForm1. BitBtn7Click (Sender: TObject);

var

i, j, m, n, f, k: integer;

r: real;

begin

m: =StringGrid2. RowCount-1;

n: =StringGrid2. ColCount-1;

f: =0;

for i: =1 to n do

for j: =1 to m do

begin

if StringGrid2. Cells[i, j]='' then

begin

f: =1;

ShowMessage ('Ошибка в элементе ['+IntToStr (i)+','+IntToStr (j)+']'+#10#13+' В матрице времени пустое поле');

end

else

try

k: =StrToInt (StringGrid2. Cells[i, j]);

if k<1 then

begin

ShowMessage ('Ошибка в элементе ['+IntToStr (i)+','+IntToStr (j)+']'+#10#13+' В матрице времени элементы должны быть положительными и > 0');

f: =1;

end;

except

on EConvertError do

begin

ShowMessage ('Ошибка в элементе ['+IntToStr (i)+','+IntToStr (j)+']'+#10#13+' В матрице времени должно стоять целочисленное значение');

f: =1;

end;

end;

end;

for i: =1 to n do

begin

if StringGrid1. Cells[i, 0]='' then

begin

f: =1;

ShowMessage ('Ошибка в элементе ['+IntToStr (i)+']'+#10#13+' В вектор прибылть не введены данные');

end

else

try

k: =StrToInt (StringGrid1. Cells[i, 0]);

if k<1 then

begin

ShowMessage ('Ошибка в элементе ['+IntToStr (i)+']'+#10#13+' В вектор прибылть элементы должны быть положительными и > 0');

f: =1;

end;

except

on EConvertError do

begin

ShowMessage ('Ошибка в элементе ['+IntToStr (i)+','+IntToStr (j)+']'+#10#13+' В вектор прибылть должно стоять целочисленное значение');

f: =1;

end;

end;

end;

For i:= 1 to m do

begin

if StringGrid4. Cells[i, 0]='' then

begin

f: =1;

ShowMessage ('Ошибка в элементе ['+IntToStr (i)+']'+#10#13+' В векторе ограничений по времени не введены данные');

end

else

try

k: =StrToInt (StringGrid4. Cells[i, 0]);

if k<1 then

begin

ShowMessage ('Ошибка в элементе ['+IntToStr (i)+']'+#10#13+' В векторе ограничений по времени элементы должны быть положительными и > 0');

f: =1;

end;

except

on EConvertError do

begin

ShowMessage ('Ошибка в элементе ['+IntToStr (i)+','+IntToStr (j)+']'+#10#13+' В векторе ограничений по времени должно стоять целочисленное значение');

f: =1;

end;

end;

end;

if f=0 then

begin

// IskustBazis ();

end;

end;

procedure TForm1. N1Click (Sender: TObject);

begin

BitBtn3. Visible:=true;

BitBtn4. Visible:=true;

BitBtn5. Visible:=true;

BitBtn6. Visible:=true;

StringGrid1. Enabled:=true;

StringGrid2. Enabled:=true;

StringGrid4. Enabled:=true;

Save1. Enabled:=true;

end;

procedure TForm1. BitBtn2Click (Sender: TObject);

var

I, j, k: integer;

begin

if MessageDlg ('Загрузить даные с БД?', mtConfirmation,[mbok, mbCancel], 0) = mrOk then

begin

for i: =0 to 10 000 do

for j: =0 to 100 000 do

k: =i*j;

Application. ProcessMessages;

ShowMessage ('Ошибка!'+#10#13+'Нет соиденения с базой данных!');

end;

end;

procedure TForm1. vuvod1Click (Sender: TObject);

begin

Form2. Show;

Form1. Enabled:=true;

end;

procedure TForm1. Button2Click (Sender: TObject);

var

ii, jj, i, j, genj, geni, k, n, m: integer;

z: array[0. 20] of Real;

maxc: array[0. 1] of real;

c, b: integer;

begin

n: =StringGrid2. ColCount-1;

m: =StringGrid2. RowCount-1;

if shag=0 then

begin

for i: =1 to n do

baz[i]: =i;

for i: =1 to m do

dop[i]: =i+n;

matrix[0,m]: =0;

for i: =1 to n do

begin

matrix[i, m]: =StrToFloat (StringGrid1. Cells[i, 0]);

for j: =0 to m-1 do

matrix[i, j]: =StrToFloat (StringGrid2. Cells[i, j+1]);

end;

for j: =0 to m-1 do

matrix[0,j]: =StrToFloat (StringGrid4. Cells[j+1,0]);

inc (shag);

end;

b: =0;

for j: =0 to m-1 do

if matrix[0,j]<0 then b: =-1;

if b> =0 then

begin // ------------ B >= 0

c: =0;

for i: =1 to n do

begin

if matrix[i, m]>0 then c: =1;

end;

if c>0 then

begin //------Cj > 0

maxc[0]: =0;

maxc[1]: =0;

geni: =0;

for i: =1 to n do

if MaxC[1]< =matrix[i, m] then

begin

maxc[1]: =matrix[i, m];

geni: =i;

end;

maxc[1]: =1000;

genJ: =0;

for j: =0 to m-1 do

if matrix[geni, j]< >0 then

if ((matrix[0,j]/matrix[geni, j])> 0) and

(maxc[1]> (matrix[0,j]/matrix[geni, j])) then

begin

//ShowMessage (IntToStr (genj)+' '+FloatToStr (matrix[geni, genj]));

maxc[1]: =matrix[0,j]/matrix[geni, j];

genj: =j;

end;

// end;

end; //------Cj > 0

end // ------------ B >= 0

else

begin//---------------B< 0

for j: =0 to m-1 do

if matrix[0,j]<0 then

begin

maxc[1]: =matrix[0,j];

genj: =j;

end;

for J: =0 to m-1 do

if (abs (matrix[0,j])> abs (maxc[1]))and (matrix[0,j]<0) then

begin

maxc[1]: =matrix[0,j];

genj: =j;

end;

for i: =1 to n do

if matrix[i, genj]<0 then

begin

maxc[1]: =matrix[0,genj]/matrix[i, genj];

geni: =i;

end;

for i: =1 to n do

if (maxc[1]> matrix[0,genj]/matrix[i, genj])and (matrix[i, genj] < 0) then

begin

maxc[1]: =matrix[0,genj]/matrix[i, genj];

geni: =i;

end;

end; //---------------B< 0

if c=1 then

begin

Application. ProcessMessages;

for i: =0 to n do

for j: =0 to m do

begin

if ((i= geni) and (j=genj)) then

matrix2[i, j]:= 1 / matrix[i, j] else

if (i=geni)and (j< >genj) then

matrix2[i, j]:= - matrix[i, j]/matrix[geni, genj] else

if (j=genj)and (i< >geni) then

begin

matrix2[i, j]: =matrix[i, j]/matrix[geni, genj];

end;

end;

for i: =0 to n do

for j: =0 to m do

begin

if not ((i= geni) and (j=genj)) then

if not (i=geni)and (j< >genj) then

if not (j=genj)and (i< >geni) then

matrix2[i, j]: =matrix[i, j]+matrix[i, genj]*matrix2[geni, j];

if i=0 then StringGrid3. Cells[i+1,j+1]:=FloatToStr (round (matrix2[i, j])) else

StringGrid3. Cells[i+1,j+1]:=FloatToStrF (matrix2[i, j], ffFixed, 4,4);

end;

matrix: =matrix2;

i: =baz[geni];

baz[geni]: =dop[genj+1];

dop[genj+1]: =i;

for i: =0 to m-1 do

begin

StringGrid3. Cells[0,i+1]:='X'+IntToStr (dop[i+1]);

end;

for i: =1 to n do

begin

StringGrid3. Cells[i+1,0]:='X'+IntToStr (baz[i]);

end;

Label2. Caption:='Генеральный элемент ['+IntToStr (geni+1)+','+IntToStr (genj+1)+'] значение = '+ FloatToStr (matrix[geni, genj]);

end;

if c< =0 then

begin

Button2. Enabled:=false;

for i: =0 to m-1 do

begin

form2. Memo1. Lines. Add ('X'+IntToStr (dop[i+1])+' = '+FloatToStrF (matrix[0,i], ffFixed, 4,4));

StringGrid3. Cells[0,i+1]:='X'+IntToStr (dop[i+1]);

end;

for i: =1 to n do

begin

form2. Memo1. Lines. Add ('X'+IntToStr (baz[i])+' = 0');

StringGrid3. Cells[i+1,0]:='X'+IntToStr (baz[i]);

end;

form2. Memo1. Lines. Add ('max (Z)='+FloatToStr (abs (round (matrix[0,m]))));

StringGrid5. Cells[0,0]:='Деталь';

StringGrid5. Cells[1,0]:='количество';

Label2. Caption:='';

j: =1;

for i: =1 to m do

begin

if dop[i]< =n then

begin

StringGrid5. Cells[0,j]:=StringGrid2. Cells[dop[i], 0];

StringGrid5. Cells[1,j]:=FloatToStr (round (matrix[0,i-1]));

StringGrid5. RowCount:=j+1;

inc (j);

end;

end;

ShowMessage ('Ращет проведен');

end;

end;

end.

ПоказатьСвернуть
Заполнить форму текущей работой