Разработка программного обеспечения отдела работы с поставщиком. Задача о поставке товаров
Создание программы для составления оптимального плана закупки товара у поставщиков, его реализация с помощью простого и модифицированного симплекс-методов. Проектирование математического обеспечения решения задачи. Описание пользовательского интерфейса.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 21.01.2011 |
Размер файла | 1,2 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ
НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ УКРАИНЫ
"КИЕВСКИЙ ПОЛИТЕХНИЧЕСКИЙ ИНСТИТУТ"
Кафедра прикладной математики
КУРСОВОЙ ПРОЕКТ
по дисциплине: "Программное обеспечение ЭВМ"
на тему:
Разработка программного обеспечения отдела работы с поставщиком. Задача о поставке товаров
Выполнил: Дубинин П.В.
Группа КМ-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=90x1+110x2+150x3
-количество закупки продукции j-ог вида.
Канонический вид:
Min(-Z)=0-(90x1+110x2+150x3)
Ниже представлено решение симплекс методом
Свободные члены |
X1 |
X2 |
X3 |
||
X4 |
360 90 |
1 1/4 |
2 1/2 |
4 ? |
|
X5 |
520 340 |
2 3/2 |
4 0 |
2 -1/2 |
|
X6 |
220 40 |
1 1/2 |
1 0 |
2 -1/2 |
|
-Z |
0 -13500 |
90 52.5 |
110 35 |
150 -37,5 |
|
X4 |
90 70 |
? -1/2 |
? ? |
? 1/2 |
|
X5 |
340 220 |
3/2 -3 |
0 3 |
-1/2 1 |
|
X6 |
40 80 |
? 2 |
0 0 |
-1/2 -1 |
|
-Z |
-13500 -17700 |
52.5 -105 |
35 35 |
-37,5 15 |
Свободные члены |
X1 |
X2 |
X3 |
||
X4 |
70 33,33 |
-1/2 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 |
-17700 -20266 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/2 |
1 -1 |
|
X6 |
80 180 |
2 |
0 |
-1 30 |
|
-Z |
-20266 3/2 -20600 |
-70 -70 |
-11 2/3 -10 |
3,333 -10 |
Max(Z)=-(min(Z))
MaxZ=20600 (максимальная прибыль при таком плане).
Основные переменные |
Дополнительные переменные |
|||||
X1=180 |
X2=40 |
X3=0 |
X4=100 |
X5=0 |
X6=0 |
Таблица 4. Значение соответственных переменных.
Экономическая интерпретация
Основные переменные прямой задачи указывают на количество типов компьютеров которых необходимо закупить у соответствующей фирмы .
Следовательно необходимо закупить 40 наборов комплектующих фирмы 2, и 180 наборов комплектующих фирмы 1.
Максимальная прибыль которую можно получить при реализации такого оптимального плана равна 20600 у.ед.
Контрольный пример №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 10000 do
for j:=0 to 100000 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.
Подобные документы
Разработка интерфейса и программного обеспечения виртуальной библиотеки. Проектирование структуры экранов и навигационной системы. Построение прототипа пользовательского интерфейса. Тестирование и модификация прототипа. Экспертная оценка разработки.
курсовая работа [41,2 K], добавлен 19.12.2010Разработка и реализация демонстрационного многопоточного приложения. Выбор основных средств реализации. Описание логики работы приложения и разработка программного обеспечения. Описание пользовательского интерфейса. Реализация потоков в Delphi.
курсовая работа [462,5 K], добавлен 10.08.2014Проектирование структур данных и пользовательского интерфейса. Разработка руководства системного программиста и пользователя. Основные элементы организации работы менеджера по работе с клиентами. Характеристика программного обеспечения ООО "Доминион+".
курсовая работа [1,7 M], добавлен 14.10.2012Общие сведения об исследуемой организации, направления ее хозяйственной деятельности, характеристика используемой вычислительной техники и программного обеспечения. Разработка пользовательского интерфейса, шаблонов, отладка и тестирование программы.
отчет по практике [159,3 K], добавлен 11.04.2016Проектирование программного модуля: сбор исходных материалов; описание входных и выходных данных; выбор программного обеспечения. Описание типов данных и реализация интерфейса программы. Тестирование программного модуля и разработка справочной системы.
курсовая работа [81,7 K], добавлен 18.08.2014Постановка задачи линейного программирования. Решение системы уравнений симплекс-методом. Разработка программы для использования симплекс-метода. Блок-схемы основных алгоритмов. Создание интерфейса, инструкция пользователя по применению программы.
курсовая работа [1,7 M], добавлен 05.01.2015Разработка программы, осуществляющей контроль за своевременностью обновления программного обеспечения с помощью рассылки электронных писем. Анализ требований к системе; выбор метода решения, алгоритма, выбор языка программирования, описание программы.
дипломная работа [5,6 M], добавлен 29.06.2011Методы определения оптимального плана производства (приобретения) продукции с учетом ограниченного обеспечения ресурсами различного вида. Технология поиска оптимального решения задач линейного программирования (ЗЛП) с помощью итоговой симплекс-таблицы.
лабораторная работа [42,8 K], добавлен 11.03.2011Составление математической модели расписания в школе. Назначение и область применения программного продукта. Обоснование выбора инструментальных средств. Описание разработки, алгоритмов и методов решения, форматов данных и пользовательского интерфейса.
курсовая работа [1,6 M], добавлен 18.01.2012Разработка программы создания заметок в любом месте компьютера. Выбор технологии, языка и среды разработки приложения. Описание основных алгоритмов работы программного обеспечения. Проектирование пользовательского интерфейса. Выбор стратегии тестирования.
отчет по практике [700,5 K], добавлен 24.11.2014