/
[Введите текст]
1. ТЕХНИЧЕСКОЕ ЗАДАНИЕ
1.1 Введение
В настоящее время возросла актуальность применения компьютерных технологий для решения задач различного типа во всех областях человеческой деятельности.
Данное программное изделие носит название «Программный продукт, реализующий сравнительный анализ методов линейного целочисленного программирования», далее по тексту - «Целочисленные методы».
Программный продукт «Целочисленные методы» реализует сравнительный анализ методов решения частного случая транспортной задачи - задачи о назначениях.
Транспортная модель применяется при рассмотрении ряда практических ситуаций, связанных с управлением запасами, составлением сменных графиков, назначением служащих на рабочие места, оборотом наличного капитала и многими другими. Транспортная задача представляет собой задачу линейного программирования, которую можно решать симплекс методом. Однако специфическая структура условий задачи позволяет применять более эффективные вычислительные методы.
Постановка задачи о назначениях. Предположим, что имеется n различных работ A1,A2,…An и n механизмов B1,B2,…Bn, каждый из которых может выполнять любую работу, но с неодинаковыми затратами. Затраты на работу механизма Bi при выполнении работы Aj обозначим Cij, i = 1,...,n j = 1,...,n. Требуется так распределить механизмы по работам, чтобы суммарные затраты от их использования были минимальны. Такая задача называется задачей выбора или задачей о назначениях.
Формально она записывается так. Необходимо выбрать такую последовательность элементов {C1j1, C2j2,…, Cnjn} из матрицы
чтобы сумма была минимальна и при этом из каждой строки и столбца С был выбран только один элемент.
1.2 Основание для разработки
Основанием для разработки программного продукта является приказ № 310-У от 11.04.05 на дипломное проектирование. Тема дипломной работы: «Программный продукт, реализующий сравнительный анализ методов линейного целочисленного программирования».
1.3 Назначение разработки
Программное изделие разрабатывается с целью сравнительного анализа методов решения частного случая транспортной задачи - задачи о назначениях. Данный программный продукт должен обеспечивать визуальное отображение результатов работы алгоритмов и их скоростные характеристики.
1.3.1 Функциональное и эксплуатационное назначение изделия
Программное изделие «Целочисленные методы» должно обеспечивать функционирование алгоритмов построения опорного плана решения, и алгоритмов улучшения опорного плана решения, вычисление их скоростных характеристик.
В функциональном отношении оно должно представлять собой программу (exe-файл), выполняемую ПК. Должна быть предусмотрена возможность визуального отображения результатов работы.
1.3.2 Рассмотренные альтернативы
При постановке задачи на разработку программного продукта были рассмотрены следующие альтернативы:
1) Программная платформа. Выбрана была система Windows в связи с широчайшим распространением, доступностью и наличием гибких средств разработки программного обеспечения под эту платформу.
2) Аппаратная платформа. Любые аппаратные комплектующие ПК, поддерживаемые ОС Windows.
3) Средства разработки. Любой компилятор для системы Windows пригоден для разработки данного программного изделия. Из наиболее распространенных, таких как Microsoft Visual C++, Borland C++, Borland C++ Builder, Borland Delphi, Symantec C++, был выбран компилятор Borland C++ Builder. Выбор обоснован тем, что программное изделие “Целочисленные методы” должно обеспечивать оценку скоростных характеристик алгоритмов нахождения опорного плана решения, компилятор Borland C++ Builder проводит оптимизацию алгоритмов по скорости.
1.4 Требования к программе или программному изделию
1.4.1 Стандарты
Разработка программной документации и программного продукта должна производится согласно ГОСТ 19.701-90, ГОСТ 2.304-88.
Текстовый материал пояснительной записки должен соответствовать требованиям, предъявляемым к оформлению текстовых документов, которые изложены в методических указаниях по выполнению дипломной работы для студентов, обучающихся по специальности 22.04 «Программное обеспечение ВТ и АС».
1.4.2 Информационная совместимость
Программный продукт должен использовать собственный формат данных, удобный для представления входных и выходных данных.
1.4.3 Программные ограничения, совместимость
Программное изделие должно быть написано на языке высокого уровня и работать под управлением операционных систем Microsoft Windows 2000/NT/XP.
1.4.4 Требования к составу и параметрам технических средств (аппаратные ограничения)
- процессор, аналогичный Intel Celeron 600;
- жесткий диск;
- мышь;
- клавиатура;
- оперативная память 128Мб.
1.4.5 Методические ограничения
Должны быть реализованы следующие методы методы:
1) Метод Северо-Западного угла;
2) Метод Наименьшей стоимости;
3) Метод Фогеля;
4) Метод Не реализованных прибылей (этап 1);
5) Метод Не реализованных прибылей (этап 2);
6) Метод Не реализованных прибылей (этап 3);
7) Метод Потенциалов;
8) Венгерский метод.
1.4.6 Входные данные
Входными данными является вводимая пользователем информация (исходная матрица задачи о назначениях) и выбор пользователем метода решения задачи о назначении.
Исходная матрица задачи о назначениях - матрица С:
В1 |
В2 |
… |
Вn |
|||
A1 |
C11 |
C12 |
… |
C1n |
1 |
|
A2 |
C21 |
C22 |
… |
C2n |
1 |
|
… |
… |
… |
…. |
… |
… |
|
An |
Cn1 |
Cn2 |
… |
Cnn |
1 |
|
1 |
1 |
… |
1 |
1.4.7 Процессы обработки
Программное изделие должно позволять выполнять следующие операции:
- ввод исходных данных для расчетов;
- контроль исходных данных;
- нахождение опорного плана;
- приведение опорного плана к оптимальному;
- предоставление пользователю в виде графиков информации о скорости и точности работы алгоритма.
1.4.8 Выходные данные
Входными данными являются матрица опорного плана решения задачи о назначениях и выводимые на дисплей графики оценки скорости и близости к оптимальному решению.
Матрица опорного плана решения - матрица Х:
Х11 |
Х12 |
… |
Х1n |
|
Х21 |
Х22 |
… |
Х2n |
|
… |
… |
…. |
… |
|
Хn1 |
Хn2 |
… |
Хnn |
1.4.9 Результирующие компоненты изделия
В комплект поставки программного изделия должны входить следующие компоненты:
- исходный текст программы на языке С++Builder,
- программная документация на изделие.
1.4.10 Носители информации
Программный продукт должен размещаться в виде исходных файлов на жестком диске компьютера пользователя или на гибких магнитных дисках.
Программное изделие использует следующие носители информации:
- накопитель на лазерном диске;
- накопитель на гибком магнитном диске.
1.4.11 Безопасность и секретность
Информация, содержащаяся в программном изделии, не является секретной, поэтому ограничение доступа к ней не предусматривается.
1.4.12 Требования к надежности
Правильность входной информации должна визуально контролироваться оператором. В случаях обнаружения потери информации или неправильного ее ввода, пользователь должен иметь возможность ввести корректировку. Синтаксис вводимых данных должен контролироваться программным обеспечением.
1.4.13 Рестарт
В процессе работы с программой оператор не может сохранить промежуточные данные. Поэтому при возобновлении работы программы после аварийного прерывания оператор должен заново ввести все входные данные.
1.4.14 Рабочие характеристики
Так как значительная часть работы происходит в диалоговом режиме, то эффективность разработки также во многом зависит и от навыков пользователя.
Затраты времени на ввод исходной матрицы задачи о назначениях определяются затратами времени оператора при ручном наборе данных и не могут быть регламентированы. Оценка качества по времени, затраченного алгоритмом программного продукта на обработку входной информации, определяется используемыми алгоритмами.
1.4.15 Удобство эксплуатации
Взаимодействие человека с компьютером должно быть выполнено в виде системы меню для выбора режима работы. Должен быть использован диалоговый, интерактивный режим, предупреждающие или подсказывающие сообщения. Программное изделие должно обеспечивать стандартный интерфейс диалога с пользователем. Вся необходимая информация для ввода исходных данных должна отображаться на экране монитора. В случаях возникновения исключительных ситуаций необходимо выводить на экран соответствующие сообщения и предлагать оператору возможные способы их преодоления.
Необходимо выполнение следующих требований:
наличие пользовательского интерфейса;
диалоговый ввод начальных данных;
работа в
1.5 Требования к программной документации
Программная документация должна включать следующие документы:
- техническое задание,
- технический проект,
- рабочий проект.
В приложении к документу 'Рабочий проект' должен быть приведен листинг исходных текстов программного изделия.
1.6 Технико-экономическое обоснование целесообразности разработки
1.6.1 Целесообразность разработки программы или устройства
В настоящее время при проведении исследовательских работ резко возрастает потребность решения задач линейного программирования. Сложность задач линейного программирования характеризуется большим объемом информации. Ручная обработка данных является нецелесообразной, так как занимает большое количество времени, возникает риск потери точности.
Таким образом, эффективно применение современных средств вычислительной техники во всех сферах научной и производственной деятельности для обработки больших массивов данных.
Разрабатываемая программа позволит решить одну из задач линейного программирования - задачу о назначениях, оценивать скорость различных методов решения этой задачи, и давать рекомендации по использованию наиболее приемлемых методов. Участие человека в процессах минимизируется, что позволит увеличить результативность обработки данных и снизит трудозатраты.
Применение программного продукта позволит снизить нагрузку на людей при выполнении рутинных операций, что позволит эффективно использовать имеющийся кадровый потенциал.
1.6.2 Описание предприятия и продукции
Сведения о предприятии
В качестве предприятия рассматривается модель производственной системы, обеспечивающей покрытие издержек и эффективность выпуска предлагаемой продукции.
Описание продукции (услуги)
Наименование продукции: «Программа, реализующая анализ различных методов решения задачи о назначении». («Целочисленные методы»)
Особенности разрабатываемого устройства или программы: Особенностью программного продукта является возможность его использования как в учебных целях для изучения функционирования различных методов решения задачи о назначениях, так и для решения конкретных задач планирования производственного процесса.
Назначение и области применения: Решение задачи о назначениях различными методами в средне специальных и высших учебных заведениях, а также самостоятельно.
Разработанное программное средство может быть использовано как для решения практических задач, так и для проведения теоретических занятий по курсу «Исследование операций».
Перспективы выпуска: Ежегодное увеличение рынка программных продуктов в РФ на 10-15% наряду с тем фактом, что руководство многих предприятий осознало необходимость внедрения систем автоматизации обработки данных, позволяет проявлять определенный оптимизм в отношении перспектив программы «Целочисленные методы». Несомненно, спрос рождает предложение, поэтому многие отечественные и зарубежные фирмы создали в данном секторе рынка весьма сильную конкуренцию. В такой ситуации главными преимуществами программы «Целочисленные методы» будут простота внедрения, дешевизна и учет специфики российского рынка.
Возможность экспорта или импортозамещения: Возможно импортозамещение программных продуктов с аналогичными характеристиками, но отличающихся высокой ценой, что делает их малодоступными для предприятий малого и среднего бизнеса. В перспективе, разработка локализованных версий программы открывает возможности для экспорта.
Конкурентоспособность продукции: Возможно повышение конкурентоспособности продукции путём уменьшение себестоимости продукции и обеспечения дополнительных услуг: установка и обучение работе с программой, предоставление скидок государственным учреждениям, совместная деятельность с вузами (получение заказа департамента образования Курской обл. на создание программы обучения).
1.6.3 Маркетинг и сбыт продукции
Требования к потребительским свойствам
«Целочисленные методы» представляет собой магнитный накопитель 3,5” или CDR с программой, которая легко устанавливается на ПЭВМ, проста в обращении, имеет дружественный интерфейс, предоставляет результаты работы в понятном пользователю виде.
Магнитный накопитель поставляется в индивидуальной упаковке, к которой прилагается подробное описание по установке программы и работе с ней.
Таблица 1.1 - Требования к продукции
Продукт (услуга) |
Потребители (покупатели) и их характеристика |
Требования потребителей к товару (услуге) |
Возможности обеспечения |
|
«Целочисленные методы» |
Средне специальные учебные заведения |
Удобство эксплуатации, возможность обучения персонала учреждения, гарантийное обслуживание. |
Обеспечивает |
|
«Целочисленные методы» |
Высшие учебные заведения |
Удобство эксплуатации, возможность обучения персонала учреждения, гарантийное обслуживание, поставка бесплатной информации о новых разработках фирмы. |
Обеспечивает |
|
Продукт (услуга) |
Потребители (покупатели) и их характеристика |
Требования потребителей к товару (услуге) |
Возможности обеспечения |
|
«Целочисленные методы» |
Предприятия |
Удобство эксплуатации, надёжность получаемого результата, сравнительно невысокая цена, гарантийное обслуживание. |
Обеспечивает |
1.6.4 Конкуренция, конкурентоспособность продукции и позиционирование товара
Продукция и ее производство являются конкурентоспособными на курском рынке. Для повышения конкурентоспособности предусматривается обеспечение дополнительных услуг: гарантийное обслуживание, установка и обучение работе с программой, предоставление скидок государственным учреждениям, совместная деятельность с Комитетом Образования Курской области, предоставление версий различной сложности в зависимости от заказчика.
1.6.5 Оценка конкурентоспособности по качественным характеристикам
Цена товара-конкурента 5100руб. Оценка уровеня качества или потребительского эффекта товара (К) и товара-конкурента (Кк) производится по формулам.
, (1.1)
, (1.2)
где аi - количественная оценка значимости i - го параметра качества;
ni, niК - количественная оценка значимости i - го параметра качества соответственно по своему товару и товару-конкуренту;
i - номер параметра качества;
m - число параметров качества;
niЭ - количественная оценка значимости i - го параметра качества эталона - образца товара с позиции покупателей.
K=0,1*(1/1)+ 0,1*(0,9/1)+ 0,4*(0,9/1)+ 0,2*(0,8/1) +0,2*(0,8/1)=0,87
Kk=0,1*(0,9/1)+ 0,1*(0,7/1)+ 0,4*(0,9/1)+ 0,2*(0,1/1)+ 0,2*(0,8/1) =0,7
Интегральный показатель конкурентоспособности программы «Целочисленные методы» по отношению к товару-конкуренту:
КС = (К/)/(/Ц) = К*Цк/Кк*Ц. (1.3)
KC=0,87*5100/0,7*4500=1,41
Таблица 1.2 - Значение количественных характеристик выбранных экспертами параметров качества
Выбранные экспертами параметры качества |
Количественные характеристики |
||||
ni э |
ni |
ni k |
ai |
||
Дружественный интерфейс |
1 |
1 |
0,9 |
0,1 |
|
Легкость освоения |
1 |
0,9 |
0,7 |
0,1 |
|
Скорость вычислений |
1 |
0,9 |
0,9 |
0,4 |
|
Наличие рекомендаций по использованию методов |
1 |
0,8 |
0,1 |
0,2 |
|
Учет российской специфики рынка |
1 |
0,8 |
0,8 |
0,2 |
Показатель конкурентоспособности для рассматриваемой программы равен 1,41. Следовательно, имеется возможность гарантированного вывода программы на любой новый рынок.
Позиционирование товара на рынке происходит в условиях жесткой конкуренции. Поэтому схема позиционирования направлена на учет стоимости аналогичных программ и деятельности конкурентов. Цена программного продукта не превышает цены конкурентных программ, но в то же время покрывает издержки на производство.
1.6.6 Рынок сбыта продукции
Так как в настоящее время число потенциальных пользователей ПЭВМ растет, то возникает потребность в разработке программного продукта для решения различных задач, используя возможности компьютера. Задачи линейного программирования очень трудоемки в ручных вычислениях, поэтому использование компьютера значительно сократит время на решение подобных задач. Участие человека в процессах минимизируется, что позволит увеличить результативность обработки данных, следовательно, данный программный продукт является актуальным и перспективным и найдет свою нишу на рынке сбыта.
Сегментация рынка нацелена на специфическую группу потребителей (средние и высшие учебные заведения, предприятия занимающиеся планированием производства) через единый специализированный план маркетинга, который основывается на потребностях этого сегмента. Концентрированный маркетинг распространен среди специализированных фирм. Цель фирмы - эффективность, привлечение значительной доли одного рыночного сегмента при управляемых издержках.
Таблица 1.3 - Рынок сбыта продукции
Продукт |
Потребитель (наименование, объем покупки) |
кол-во в год |
Цена |
Подтверждающий документ |
|
«Целочисленные методы» |
Средне специальные учебные заведения |
80 |
4500 |
Заявка |
|
«Целочисленные методы» |
Высшие учебные заведения |
30 |
4500 |
Заявка |
|
«Целочисленные методы» |
Предприятия |
40 |
4500 |
Заявка |
1.6.7 Каналы сбыта продукции
Предусматривается на первом этапе сбыт готовой продукции через кафедры ПОВТ, с последующими прямыми поставками государственным службам по заявке.
Это поможет резко сократить расходы на сбыт (транспорт, реклама, заключение договоров). По мере увеличения объема готовой продукции будет все больше осуществляться переход на прямые связи с потребителями продукции при условии единого товарного знака и согласованных цен. Каналы сбыта продукции приведены в таблице 1.4.
Таблица 1.4 - Каналы сбыта продукции
Наименование канала сбыта |
Характеристика |
Степень готовности |
Условия сбыта |
|
Непосредственно с кафедры ПОВТ |
Наличие товара - 60 шт. готовой продукции |
Кафедра работает согласно расписания Университета |
По заявке |
|
Магазины розничной торговли |
Наличие товара - 60 шт. готовой продукции |
Магазин работает согласно расписания |
По заявке |
1.6.8 Стратегия продвижения на рынок
Главным направлением стратегии продвижения на рынок является освоение рынка стабильных потребителей с дальнейшим расширением числа клиентов.
Основными сегментами рынка потребителей, на которые мы ориентируемся, являются следующие:
средне специальные и высшие учебные учреждения;
предприятия, использующие для организации производственного цикла решение задачи о назначениях;
пользователи ЭВМ.
Рекламная компания проводится путем размещения рекламы в Интернете, на радио, а также печати рекламных объявлений в ряде специализированных печатных изданий.
Таблица 1.5 - Стратегия продвижения на рынок
Пути продвижения |
Характеристика |
Периодичность |
Цена |
Стоимость на срок реализации проекта |
|
Прямые обращения к организациям |
Учебные заведения и предприятия |
1 обращений в квартал (письма) |
10 руб. одно обращение |
80 руб за 2 года |
|
Реклама на радио |
Минутные сообщения |
Еженедельно |
300.руб. 1 минута эфира. |
30000. руб за 2 года |
|
Реклама в специализированных журналах |
Объявления |
Ежемесячно |
1000 руб. 1 месяц |
24000 руб за 2 года |
|
Реклама в интернете |
Объявления на бесплатных досках объявлений и реклама в бесплатных баннерных сетях |
1 раз в 2 недели |
Бесплатно |
0 руб за 2 года |
|
Всего затрат |
54080 руб |
1.6.9 Цена и объем сбыта продукции (услуги)
Ввиду наличия на рынке аналогичного товара за основу принимаются цены конкурентов, а также минимально допустимая цена исходя из издержек производства и реализации продукции. Окончательная цена определяется, исходя из необходимости выхода на новый для себя рынок сбыта и условий некоторой конкуренции, - ниже цены конкурентов.
Таблица 1.6 - Объем сбыта по периодам (в штуках)
Продукт |
1-й год (по месяцам), шт. |
||||||||||||
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
||
«Целочисленные методы» |
0 |
0 |
0 |
0 |
0 |
0 |
11 |
12 |
14 |
15 |
16 |
16 |
|
Продукт |
2-й год (по месяцам), шт. |
||||||||||||
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
||
«Целочисленные методы» |
17 |
17 |
17 |
17 |
18 |
18 |
18 |
18 |
19 |
19 |
19 |
19 |
1.6.10 Производственный план
Месторасположение и производственные площади
Офисное помещение и производственные площади предоставляются фирме администрацией города Курска по договору на аренду. Производственные площади и помещения фирмы удовлетворяют требованиям техники безопасности и нормам СЭС для фирм, производящих схемотехнические устройства или программные продукты.
Таблица 1.7 - Обеспеченность земельными площадями
Источник |
Количество (кв. м.) |
Цена ( за 1 кв. м. в год), руб. |
Стоимость на срок реализации проекта (руб.) |
|
Аренда помещения, в т.ч. офисные помещения, производственные помещения, склады и т.д. |
25 |
1200 |
60000 за 2 года |
Технология, качество и сертификация производства
Таблица 1.8 - Технология, качество и сертификация производства
Технологическая операция (ее характеристика) |
Требования к исполнителю, их обеспечение (соответствие) |
Требования к технологии и оборудованию, их обеспечение |
Другие требования, их обеспечение (соответствие) |
|
Разработка программы «Целочисленные методы». |
Разработка должна вестись в тесном сотрудничестве с заказчиком |
Полностью соответствует |
Нет |
|
Создание программы«Целочисленные методы» |
Устройство должно работать в соответствии с заданными параметрами |
Полностью соответствует |
Нет |
|
Технологическая операция (ее характеристика) |
Требования к исполнителю, их обеспечение (соответствие) |
Требования к технологии и оборудованию, их обеспечение |
Другие требования, их обеспечение (соответствие) |
|
Тестирование программы «Целочисленные методы». |
Устройство должно быть протестировано |
Полностью соответствует |
Нет |
Технологический цикл производства и реализации продукции (услуги)
Таблица 1.9 - Технологический цикл
Наименование продукта и работ |
Исполнитель |
Длительность (мес) |
|
Разработка структуры устройства |
Инженеры фирмы |
1 |
|
Создание устройства |
Инженеры фирмы |
4 |
|
Тестирование устройства и т. д. |
Инженеры фирмы |
1 |
|
Реализация |
Менеджеры фирмы |
18 |
|
Сопровождение и поддержка |
Инженеры фирмы |
18 |
Оборудование
Для разработки и тестирования устройства (программы) предполагается приобрести необходимое оборудование или использовать уже имеющееся оборудование.
Таблица 1.10 - Оборудование
Наименование |
Цена (руб.) |
Затраты на проект (руб.) |
Расходы на транспортировку и монтаж (10%) |
Балансовая стоимость |
|
Компьютер (2 шт.) |
17000 |
34000 |
3400 |
37400 |
|
Принтер |
6000 |
6000 |
600 |
6600 |
|
Модем |
1500 |
1500 |
150 |
1650 |
|
Офисная мебель |
50000 |
50000 |
5000 |
55000 |
|
Всего затрат |
91500 |
9150 |
100650 |
Расчет амортизационных отчислений
Таблица 1.11 - Амортизационные отчисления
Наименование оборудования |
Амортизационный срок службы, год |
Норма амортизации ( %) |
Годовая сумма амортизационных отчислений, руб. |
Сумма амортизационных отчислений на проект, руб. |
|
1. Компьютер (2 шт.) |
5 |
20 |
7480 |
14960 |
|
2. Принтер |
5 |
20 |
1320 |
2640 |
|
3. Модем |
5 |
20 |
330 |
660 |
|
4. Офисная мебель |
10 |
10 |
5500 |
11000 |
|
Итого за 2 года |
14630 |
29260 |
Комплектующие и материалы
Расходные материалы будут приобретаться в мелкооптовых магазинах различных фирм. Учесть отдельно офисные расходы и производственные расходы со стоимостью транспортно-заготовительных издержек.
Таблица 1.12 - Комплектующие и материалы (постоянные)
Наименование |
Цена (руб.) |
Количество на проект (шт.) |
Поставщик |
Затраты на проект (руб.) |
|
1. CD-R диски |
10 |
50 |
ООО «Кентавр» |
500 |
|
2. Бумага писчая |
100 |
8 |
ООО «ФИТ» |
800 |
|
3. Тонер для принтера |
300 |
2 |
ООО «Кентавр» |
600 |
|
Всего затрат |
1900 |
||||
Транспортно-заготовительные расходы (5% от стоимости материалов) |
95 |
||||
Итого затрат |
1995.за 2 года |
Таблица 1.13 - Комплектующие и материалы (переменные)
Наименование |
Цена (руб.) |
Количество на проект (шт.) |
Поставщик |
Затраты на проект (руб.) |
|
1. CD-R диски |
10 |
300 |
ООО «Кентавр» |
4000 |
|
2. Обложка и сопроводительная документация |
20 |
300 |
ООО «Печать» |
6000 |
|
Всего затрат |
9000 |
||||
Транспортно-заготовительные расходы (5% от стоимости материалов) |
450 |
||||
Итого затрат |
9450 за 2 года |
Кадровое обеспечение
Таблица 1.14 - Кадровое обеспечение
Должность |
Количество (чел.) |
Оклад в мес. (руб.) |
Занятость (мес.) |
За два года |
||
Имеется |
Дополнит. |
|||||
Директор |
1 |
- |
5000 |
24 |
120000 |
|
Бухгалтер |
1 |
- |
4000 |
24 |
96000 |
|
Инженер |
2 |
- |
3000 |
24 |
144000 |
|
Менеджер |
1 |
- |
3000 |
18 |
54000 |
|
Всего |
5 |
Итого затрат |
414000 |
Транспорт и связь, энергетическое и инженерное обеспечение
Связь и электроэнергия обеспечивается службами города
Таблица 1.15 - Связь и энергетическое обеспечение
Наименование |
Сроки |
Затраты на проект (руб.) |
||
Начало |
Конец |
|||
Электроэнергия (освещение) |
1 |
24 |
3600 |
|
Электроэнергия (периферийные устройства) |
1 |
24 |
3600 |
|
Городской телефон |
1 |
24 |
3600 |
|
Факс |
1 |
24 |
3600 |
|
Междугородные разговоры |
1 |
24 |
4800 |
|
Интернет |
1 |
24 |
4800 |
|
Всего затрат |
24000 за 2 года |
Экологичность и безопасность производства
Процесс создания и использования устройства или программы на экологию никак не влияет. Вредных факторов также нет. Если возможны вредные воздействия на социум и окружающую среду, необходимо кратко описать их и разработать комплекс мер, позволяющих устранить негативные воздействия.
1.6.11 Организационный план
Команда управления и ведущие специалисты
В фирме работают 5 человек. Сотрудники обеспечивают динамичное развитие и стабильное финансовое положение фирмы.
Правовое обеспечение
Планируется защита программного продукта авторским правом.
Партнеры по реализации проекта
В течение первых двух лет реализации продукции партнерство не предусматривается или рассматриваются другие варианты.
Поддержка и льготы
Проект льгот не имеет.
Организационная структура реализации проекта
Маркетинг, установка, обслуживание и сбыт продукции обеспечивается фирмой.
График реализации проекта
Проект рассчитан на 2 года. Начало реализации устройства (программы) рассчитано на 6-й месяц после начала реализации проекта.
Характеристика активов
Таблица 1.16 - Характеристика активов
Наименование Объекта |
Перечень этапов, входящих в объект |
Характеристики |
||||
Признак актива (отметить “+”) |
||||||
Земля |
Здания |
Оборуд. |
Др. |
|||
Оборудование |
Приобретается |
- |
- |
+ |
- |
|
Помещение |
Заключается договор аренды |
- |
+ |
- |
- |
1.6.12 Финансовый план
Нормативы для финансово-экономических расчетов
Платежи: основная валюта проекта - рубль.
Таблица 1.17 - Налоги
Наименование |
Ст.,% |
Регуляр.выпл |
Облагаемая статья |
||||||||||
Прибыль |
Оборот |
Экспорт |
З/п. |
Активы |
Запасы |
Доб.ст. |
|||||||
баланс |
рас. |
земля |
здания |
обор. |
|||||||||
Налог на прибыль |
24 |
Раз в мес. |
+ |
||||||||||
Налог на добавлен. cстоимость и спец. налоги |
18 |
+ |
|||||||||||
Единый социал. налог |
26,4 |
+ |
Расходы на персонал
Таблица 1.18 - Постоянные расходы на персонал
Должность |
Количество (чел.) |
Оклад в мес.(руб.) |
Занятость (мес.) |
Затраты на проект (руб.) |
||
имеется |
дополнит |
|||||
Директор |
1 |
- |
5000 |
24 |
120000 |
|
Бухгалтер |
1 |
- |
4000 |
24 |
96000 |
|
Всего |
2 |
Всего затрат |
216000 |
Таблица 1.19 - Переменные расходы на персонал
Должность |
Количество (чел.) |
Зарплата в мес.(руб.) |
Занятость (мес.) |
Затраты на проект (руб.) |
||
имеется |
дополнит |
|||||
Инженер |
2 |
- |
3000 |
24 |
144000 |
|
Менеджер |
1 |
- |
3000 |
18 |
54000 |
|
Всего |
3 |
Всего затрат |
198000 |
Постоянные расходы на производство продукции
Таблица 1.20 - Постоянные расходы на производство продукции
Наименование |
Сумма |
Регулярность Выплат |
Период выплат в течение проекта |
|||
руб. |
$US |
с мес. |
По мес. |
|||
Связь |
700 |
Месяц |
1 |
24 |
||
Электроэнергия |
300 |
Месяц |
1 |
24 |
||
Аренда помещения |
2500 |
Месяц |
1 |
24 |
||
Реклама |
2253 |
Месяц |
1 |
24 |
||
Комплектующие и материалы (постоянные) |
83 |
Месяц |
1 |
24 |
||
Амортизация |
1219 |
Месяц |
1 |
24 |
||
Расходы на персонал (АУП) |
9000 |
Месяц |
1 |
24 |
||
Дополнительная зарплата |
900 |
Месяц |
1 |
24 |
||
Единый социальный налог |
2614 |
Месяц |
1 |
24 |
||
Прочие расходы и т.д. |
3143 |
Месяц |
1 |
24 |
Калькуляция себестоимости продукции
Таблица 1.21 - Калькуляция себестоимости
Наименование |
Сумма (руб.) |
Наличие расшифровки затрат |
|
Зарплата сотрудников |
1380 |
Из таблиц 1.14 |
|
Дополнительная зарплата |
138 |
10% от зарплаты сотрудников |
|
Единый социальный налог |
401 |
26,4% |
|
Комплектующие и материалы (постоянные) |
7 |
Из таблицы 1.12 |
|
Комплектующие и материалы (переменные) |
32 |
Из таблицы 1.13 |
|
Электроэнергия |
24 |
Из таблицы 1.15 |
|
Связь |
56 |
Из таблицы 1.15 |
|
Аренда помещения |
200 |
Из таблицы 1.7 |
|
Реклама |
180 |
Из таблицы 1.5 |
|
Амортизация |
98 |
Из таблицы 1.11 |
|
Прочие расходы и т.д. |
251 |
10% от всех предыдущих затрат |
|
Итого себестоимость |
2766 |
Смета затрат на проект
Таблица 1.22 - Смета затрат
Наименование |
Стоимость(руб.) |
Наличие расшифровки затрат |
|||
Всего |
в том числе |
||||
Собств. |
Займ |
||||
Зарплата сотрудников |
414000 |
414000 |
- |
Из таблиц 1.14 |
|
Дополнительная зарплата |
41400 |
41400 |
- |
10% |
|
Единый социальный налог |
120226 |
120226 |
- |
26,4% |
|
Комплектующие и материалы (постоянные) |
1995 |
1995 |
- |
Из таблиц 1.12 |
|
Комплектующие и материалы (переменные) |
9450 |
9450 |
- |
Из таблиц 1.13 |
|
Электроэнергия |
7200 |
7200 |
- |
Из таблиц 1.15 |
|
Связь |
16800 |
16800 |
- |
Из таблиц 1.15 |
|
Аренда помещения |
60000 |
60000 |
- |
Из таблиц 1.7 |
|
Реклама |
54080 |
54080 |
- |
Из таблиц 1.5 |
|
Амортизация |
29260 |
29260 |
- |
Из таблиц 1.11 |
|
Прочие расходы |
75441 |
75441 |
- |
10% |
|
Всего на проект за 2 года |
829852 |
829852 |
Источники финансирования
Финансирование проекта осуществляется заказчиком. В соответствии с договором стоимость устройства (программы) оплачивается после предоставления заказчику готового продукта. Если работы проводились не под заказ, то финансирование проекта осуществляется предприятием за счет собственных или заемных средств.
1.6.13 Эффективность
Показатели эффективности
Основными интегральными показателями эффективности инвестиционных проектов являются:
1) срок окупаемости проекта (PBP) (payback period);
2) индекс прибыльности (PI) (profitability index);
3) чистый приведенный доход (NPV) (net present value);
4) внутренняя норма рентабельности (IRR) (internal rate of return).
Индекс прибыльности PI (индекс доходности (ИД) или коэффициент чистого дисконтированного дохода (КЧДД)). Для эффективных проектов не должен быть меньше единицы. В соответствии с расчетами прибылей и убытков составляется график изменения индекса прибыльности.
Индеек прибыльности PI
Рисунок 1.1
Для данного проекта индекс прибыльности PI = 1,30732
Чистый приведенный доход NPV (чистый дисконтированный доход (ЧДД)) - приведенная стоимость будущих прибылей или денежных потоков, дисконтированных с помощью соответствующей процентной ставки за вычетом приведенной стоимости инвестиционных затрат. Обычно отдается предпочтение проектам, у которых NPV имеет положительное значение. На основании расчета инвестиционных затрат и отчета о прибылях и убытках определяется динамика чистого приведенного дохода.
Чистый приведённый доход NPV
Рисунок 1.2
Чистый приведенный доход NPV = 224303,2 рублей.
Срок окупаемости проекта PBP (период окупаемости) - время, за которое поступления от производственной деятельности предприятия покроют все затраты, связанные с реализацией проекта, включая затраты на инвестиции. Срок окупаемости обычно измеряется в годах или месяцах.
Срок окупаемости определяется по моменту достижения кривой NPV значения NPV=0: PBP = 14,5 месяцев.
Данный показатель быстрой окупаемости затрат, связанных с инвестированием и реализацией проекта, говорит о целесообразности разработки устройства (программы).
Внутренняя норма рентабельности IRR (внутренняя норма доходности (ВНД), предельная эффективность капиталовложений, процентная норма прибыли, дисконтированный поток реальных денег или финансовая норма прибыли) - норма дисконта, для которой дисконтированная стоимость чистых поступлений от проекта равна дисконтированной стоимости инвестиций, то есть NPV равен нулю. В этом проявляется экономический смысл IRR как дисконтированной 'точки безубыточности'. У привлекательного проекта IRR должна превышать действующие ставки банковских кредитов.
Графический метод расчета внутренней нормы рентабельности IRR
Рисунок 1.3
Значение внутренней нормы рентабельности IRR определяется величиной ставки дисконтирования, при которой кривая NPV (синий график) пересекает горизонтальную ось: IRR=50%.
Риски предприятия и форс-мажорные обстоятельства
Таблица 1.23 - Риски предприятия
Содержание риска |
Возможные потери |
Меры предупреждения и снижения риска |
|
Колебания рыночной конъюнктуры, цен |
Уменьшение выручки от снижения цен, а также в связи с инфляцией, изменением курса рубля |
Непрерывное исследование рынка и экономической ситуации |
|
Несоблюдение условий договора по оплате и т.д. |
Материальные потери |
Подбор квалифицированных юристов, грамотно составленный договор |
1.7 Требования к безопасности жизнедеятельности охране окружающей среды
1.7.1 Классификация основных форм деятельности человека. Организация рабочего места и ее особенности при использовании ПЭВМ
Многообразные формы трудовой деятельности делятся на физический и умственный труд.
Физический труд характеризуется, в первую очередь, повышенной нагрузкой на опорно-двигательный аппарат и его функциональные системы (сердечнососудистую, нервно-мышечную, дыхательную и др.), обеспечивающие его деятельность. Физический труд, развивая мышечную систему и стимулируя обменные процессы, имеет ряд отрицательных последствий. Прежде всего, это социальная неэффективность физического труда, связанная с низкой его производительностью, необходимостью высокого напряжения физических сил и потребностью в длительном - до 50% рабочего времени - отдыхе.
Умственный труд объединяет работы, связанные с приемом и переработкой информации, требующей преимущественно напряжения сенсорного аппарата, внимания, памяти, активизации процессов мышления, эмоциональной сферы. Для этого труда характерна гипокинезия, т.е. значительное снижение двигательной активности человека, приводящее к ухудшению реактивности организма и повышению эмоционального напряжения. Гипокинезия является одним из условий формирования сердечнососудистой патологии у лиц умственного труда. Длительная умственная нагрузка оказывает угнетающее влияние на психическую деятельность: ухудшаются функции внимания, памяти и восприятия.
В соответствии с существующей физиологической классификацией трудовой деятельности различают:
1) формы труда, требующие значительной мышечной активности;
2) формы труда, связанные с полуавтоматическим и автоматическим производством;
3) групповые формы труда (конвейеры);
4) формы труда, связанные с дистанционным управлением;
5) формы интеллектуального (умственного) труда.
Формы интеллектуального труда подразделяются на операторский, управленческий, труд медицинских работников, труд преподавателей, учащихся, студентов. Эти виды различаются организацией трудового процесса, равномерностью нагрузки, степенью эмоционального напряжения.
Тяжесть и напряженность труда характеризуется степенью функционального напряжения организма. Оно может быть энергетическим, зависящим от мощности работы - при физическом труде, и эмоциональным - при умственном труде, когда имеет место информационная перегрузка.
Рабочее место - это первичное звено производства, зона трудовой деятельности рабочего или группы рабочих (если рабочее место коллективное), оснащенная необходимыми средствами для выполнения производственного задания. Затраты на рациональную организацию рабочего места с лихвой окупятся. При 'правильной' работе возрастет не только скорость и качество работы, улучшится и общий микроклимат в коллективе.
Во время работы на ПЭВМ оператор подвергается воздействию ряда неблагоприятных для его здоровья факторов. Большинство из них вызваны конструкцией ПЭВМ и определяется в воздействии на организм человека таких вредных условий, как:
- электромагнитное излучение;
- статическое напряжение;
- повышенный уровень шума.
Кроме вышеуказанных опасностей, источниками которых являются технические средства, оператор ЭВМ подвержен опасностям, характерным для этого рода деятельности и связанным с такими факторами, как:
- статическая поза оператора;
- повышенная нагрузка на зрение;
- особенности микроклимата.
Для того, чтобы максимально уменьшить воздействие вредных факторов на необходимо правильно организовать рабочее место оператора в соответствии с СанПиН 2.2.2.542-96.
Требования к помещениям для работы на компьютерах
При подборе помещений для работы на компьютерах необходимо учитывать следующие нормы и правила (ГОСТ 12.2.032-78 и 12.2.033-78.):
1) Помещения должны иметь естественное и искусственное освещение.
2) Естественное освещение должно осуществляться через светопроемы, ориентированные преимущественно на север и северо-восток и обеспечивать коэффициент естественной освещенности (КЕО) не ниже 1.2% в зонах с устойчивым снежным покровом и не ниже 1.5% на остальной территории.
3) Расположение рабочих мест с ПЭВМ для взрослых пользователей в подвальных помещениях не допускается. Размещение рабочих мест с ПЭВМ во всех учебных заведениях и дошкольных учреждениях не допускается в цокольных и подвальных помещениях.
4) Площадь на одно рабочее место с ПЭВМ для взрослых пользователей должна составлять не менее 6,0 м2, а объем не менее 20,0 м3 (в учебных и дошкольных учреждениях - 24 м3).
5) При входе в учебное помещение с ПЭВМ в средних и высших учебных заведениях следует предусмотреть встроенные или пристенные шкафы (полки) для хранения портфелей, сумок учащихся и студентов.
6) Производственные помещения, в которых для работы используются преимущественно ПЭВМ (диспетчерские, операторские, расчетные и др.), и учебные помещения (аудитории вычислительной техники, дисплейные классы, кабинеты и др.), не должны граничить с помещениями, в которых уровни шума и вибрации превышают нормируемые значения (механические цеха, мастерские, гимнастические залы и т.п.).
7) Помещения должны оборудоваться системами отопления, кондиционирования воздуха или эффективной приточно-вытяжной вентиляцией.
8) Для внутренней отделки интерьера помещений с ВДТ и ПЭВМ должны использоваться диффузно-отражающие материалы с коэффициентом отражения для потолка - 0.7 - 0.8; для стен - 0.5 - 0.6; для пола - 0.3 - 0.5. Полимерные материалы, используемые для внутренней отделки интерьера помещений с ПЭВМ, должны быть разрешены для применения органами и учреждениями Государственного санитарно-эпидемиологического надзора.
9) Поверхность пола в помещениях эксплуатации ВДТ и ПЭВМ должна быть ровной, без выбоин, нескользкой, удобной для очистки и влажной уборки, обладать антистатическими свойствами.
Требования к мебели для работы на компьютерах
При выборе мебели для оснащения рабочего места необходимо учесть требования санитарных норм и правил:
1) Конструкция рабочего стула (кресла) должна обеспечивать поддержание рациональной рабочей позы при работе на ПЭВМ, позволять изменять позу с целью снижения статического напряжения мышц шейно-плечевой области и спины для предупреждения развития утомления. Тип рабочего стула (кресла) должен выбираться в зависимости от характера и продолжительности работы с ПЭВМ с учетом роста пользователя.
2) Высота рабочей поверхности стола для взрослых пользователей должна регулироваться в пределах 680 - 800 мм; при отсутствии такой возможности высота рабочей поверхности стола должна составлять 725 мм.
3) Модульными размерами рабочей поверхности стола для ПЭВМ, на основании которых должны рассчитываться конструктивные размеры, следует считать: ширину 800, 1000, 1200 и 1400 мм, глубину 800 и 1000 мм при нерегулируемой его высоте, равной 725 мм.
4) Рабочий стол должен иметь пространство для ног высотой не менее 600 мм, шириной - не менее 500 мм, глубиной на уровне колен - не менее 450 мм и на уровне вытянутых ног - не менее 650 мм.
5) Экран видеомонитора должен находиться от глаз пользователя на оптимальном расстоянии 600 - 700 мм, но не ближе 500 мм с учетом размеров алфавитно-цифровых знаков и символов.
6) Клавиатуру следует располагать на поверхности стола на расстоянии 100 - 300 мм от края, обращенного к пользователю или на специальной, регулируемой по высоте рабочей поверхности, отделенной от основной столешницы.
7) Рабочий стул (кресло) должен быть подъемно-поворотным и регулируемым по высоте и углам наклона сиденья и спинки, а так же - расстоянию спинки от переднего края сиденья.
Конструкция его должна обеспечивать:
- ширину и глубину поверхности сиденья не менее 400 мм;
- поверхность сиденья с закругленным передним краем;
- регулировку высоты поверхности сиденья в пределах 400 - 550 мм и углам наклона вперед до 15 град. и назад до 5 град.;
- высоту опорной поверхности спинки 300 ± 20 мм, ширину - не менее 380 мм и радиус кривизны горизонтальной плоскости - 400 мм;
- угол наклона спинки в вертикальной плоскости в пределах ±30 градусов;
- регулировку расстояния спинки от переднего края сиденья в пределах 260 - 400 мм;
- стационарные или съемные подлокотники длиной не менее 250 мм и шириной - 50 - 70 мм;
- регулировку подлокотников по высоте над сиденьем в пределах 230 ± 30 мм и внутреннего расстояния между подлокотниками в пределах 350 - 500 мм.
8) Поверхность сиденья, спинки и других элементов стула (кресла) должна быть полумягкой, с нескользящим, неэлектризующимся и воздухопроницаемым покрытием, обеспечивающим легкую очистку от загрязнений.
9) Рабочее место должно быть оборудовано подставкой для ног, имеющей ширину не менее 300 мм, глубину не менее 400 мм, регулировку по высоте в пределах до 150 мм и по углу наклона опорной поверхности подставки до 20 градусов. Поверхность подставки должна быть рифленой и иметь по переднему краю бортик высотой 10 мм.
Требования к организации режима работы
При организации режима работы необходимо учитывать следующие требования:
1) Режимы труда и отдыха при работе с ПЭВМ и ВДТ должны организовываться согласно следующим требованиям:
для преподавателей высших и средних специальных учебных заведений, учителей общеобразовательных школ устанавливается длительность работы в дисплейных классах и кабинетах информатики не более 4 часов в день.
для инженеров, обслуживающих рабочий процесс в кабинетах (аудиториях) с ВДТ и ПЭВМ, продолжительность работы не должна превышать 6 часов в день.
Продолжительность непрерывной работы с ВДТ без регламентированного перерыва не должна превышать 2 часов.
2) Для студентов первого курса оптимальное время учебных занятий при работе с ВДТ или ПЭВМ составляет 1 час, для студентов старших курсов - 2 часа, с обязательным соблюдением между двумя академическими часами занятий перерыва длительностью 15 - 20 минут. Допускается время учебных занятий с ВДТ и ПЭВМ увеличивать для студентов первого курса до 2 часов, а для студентов старших курсов до 3 академических часов, при условии что длительность учебных занятий в дисплейном классе (аудитории) не превышает 50% времени непосредственной работы на ВДТ или ПЭВМ и при соблюдении профилактических мероприятий: упражнения для глаз, физкультминутка и физкультпауза.
3) В средних специальных учебных заведениях (ПТУ, техникумы и др.) длительность работы на ВДТ или ПЭВМ во время учебных занятий при соблюдении гигиенических требований к условиям и организации рабочих мест должна составлять:
- для учащихся первого курса не более 30 минут в день;
- для учащихся второго и третьего курсов не более 1 часа в день при сдвоенных уроках: 30 минут на первом уроке и 30 минут на втором с интервалом в работе на ВДТ или ПЭВМ не менее 20 минут, включая перемену, объяснение учебного материала, опрос учащихся и т.п.
- для учащихся третьего курса длительность учебных занятий с ВДТ и ПЭВМ допускается увеличить до 3 академических часов с суммарным временем непосредственной работы на ВДТ или ПЭВМ не более 50% от общего времени учебных занятий.
1.7.2 Профессиональные заболевания при работе с ПЭВМ. Профилактика профессиональных заболеваний
К сожалению, компьютер не только помогает людям, но и наносит большой вред их самочувствию и здоровью. Слишком долгая работа с компьютером влечет за собой нарушения в функционировании организма, что впоследствии сказывается на здоровье. Появляется резь в глазах, головная боль, устают мышцы рук, ощущается нагрузка на позвоночник, снижается четкость зрительного восприятия, снижается работоспособность.
Под влиянием многих вредных для здоровья факторов, связанных с работой на ПК (например, долговременное статичное положение тела) у оператора, не соблюдающего санитарно-гигиенические нормы работы на ПК, может возникнуть целый ряд профессиональных заболеваний, таких как дальнозоркость, близорукость, некоторые заболевания кожи (например, эритема) и опорно-двигательного аппарата, гипподинамия. В результате неправильной осанки может развиться грыжа межпозвоночных дисков шейного или поясничного отделов, перенапряжение мышцы шеи, плеча и грудной клетки. При многочасовой работе с неправильной осанкой также могут быть признаки травмы запястья - ладони и запястья немеют, опухают, возникают боль и покалывание указательного и среднего пальцев. В результате неправильного положения руки при работе за компьютером может возникнуть синдром 'теннисного локтя', который возникает в результате воспаления общего сухожилия мышц-разгибателей, расположенных около локтя. При высоком зрительном напряжении возникают резь в глазах, покалывание, покраснение.
Главными факторами, вызывающими ухудшение здоровья, в связи с работой за компьютером, является долговременное неподвижное положение тела оператора, стрессы, связанные с компьютером, довольно часто не рациональная организация рабочего места, а также совокупность различных физических, умственных и визуальных нагрузок. Основными мерами профилактики заболеваний, связанных с компьютером, являются оптимальная организация рабочего места, то есть использование таких средств, как компьютерный стол с регулируемой платформой для клавиатуры, кресла с возможностью изменения высоты и угла наклона спинки, защитного (противобликового) экрана, вертикальной подставки для бумаг (с которых производится набор текста на компьютере), а также такой подставки монитора, которая позволяет изменять угол его наклона. Кроме этого, немаловажную роль играет правильное освещение рабочего места, расстояние от глаз до экрана, свободное регулярное дыхание.
С целью исключения вредного влияния персонального компьютера (ПК) на организм необходимо соблюдать и выполнять следующие правила и нормы.
Среди мер профилактики мышечных болей и болезней опорно-двигательного аппарата, основными считаются удобство сидений, то есть их высота и соответствие естественным прогибам позвоночника, а также правильная посадка оператора, в это понятие входит то, что сидеть необходимо прямо, не горбясь, уровень запястий должен находиться на уровне рук, ступни ног должны стоять на полу или подставке прямо, не перекрещиваясь.
Профессиональные пользователи ПК должны проходить обязательные (при приеме на работу) и периодические медицинские осмотры. Женщин со времени установления беременности и в период кормления ребенка грудью к выполнению всех видов работ, связанных с использованием видеодисплейных терминалов, не допускают. Снятию локального утомления, улучшению мозгового кровообращения, снятию утомления с плечевого пояса и рук, с туловища и ног, глаз способствует комплекс физкультурных пауз. Режимы труда и отдыха должны организовываться в зависимости от вида и категории трудовой деятельности. На протяжении рабочей смены должны устанавливаться регламентированные перерывы. Продолжительность непрерывной работы с ПЭВМ без регламентированного перерыва не должна превышать двух часов. Во избежание серьезных проблем с позвоночником, согласно санитарным нормам, рекомендуется работать за компьютером не более шести часов в день, при этом через каждые два часа делать тридцатиминутную гимнастику. Людям таких профессий многие ортопеды настойчиво рекомендуют, как минимум два раза в год, проходить десятидневный курс массажа и, по возможности, хотя бы десять минут в день на руках висеть на турнике.
В заключение нужно отметить, что при работе с компьютером необходимо следить за своим здоровьем, а здоровье человека зависит в первую очередь от него самого.
1.7.3 Основные требования к производственному освещению помещений с ЭВМ
СанПиН 2.2.2.542-96 устанавливают следующие основные требования к освещению помещений с ВДТ и ПЭВМ:
1) Естественное освещение должно осуществляться через светопроемы, ориентированные преимущественно на север и северо-восток и обеспечивать коэффициент естественной освещенности (КЕО) не ниже 1.2% в зонах с устойчивым снежным покровом и не ниже 1.5% на остальной территории.
2) Искусственное освещение в помещениях эксплуатации ВДТ и ПЭВМ должно осуществляться системой общего равномерного освещения. В производственных и административно-общественных помещениях, в случаях преимущественной работы с документами, допускается применение системы комбинированного освещения (к общему освещению дополнительно устанавливаются светильники местного освещения, предназначенные для освещения зоны расположения документов).
3) Освещенность на поверхности стола в зоне размещения рабочего документа должна быть 300-500 лк. Допускается установка светильников местного освещения для подсветки документов. Местное освещение не должно создавать бликов на поверхности экрана и увеличивать освещенность экрана более 300 лк.
4) Следует ограничивать прямую блесткость от источников освещения, при этом яркость светящихся поверхностей (окна, светильники и др.), находящихся в поле зрения, должна быть не более 200 кд/м2.
5) Следует ограничивать отраженную блесткость на рабочих поверхностях (экран, стол, клавиатура и др.) за счет правильного выбора типов светильников и расположения рабочих мест по отношению к источникам естественного и искусственного освещения, при этом яркость бликов на экране ВДТ и ПЭВМ не должна превышать 40 кд/м2 и яркость потолка, при применении системы отраженного освещения, не должна превышать 200 кд/ м2.
6) В качестве источников света при искусственном освещении должны применяться преимущественно люминесцентные лампы типа ЛБ. При устройстве отраженного освещения в производственных и административно-общественных помещениях допускается применение металлогалогенных ламп мощностью до 250 Вт. Допускается применение ламп накаливания в светильниках местного освещения.
7) Общее освещение следует выполнять в виде сплошных или прерывистых линий светильников, расположенных сбоку от рабочих мест, параллельно линии зрения пользователя при рядном расположении ПЭВМ. При периметральном расположении компьютеров линии светильников должны располагаться локализованно над рабочим столом ближе к его переднему краю, обращенному к оператору.
8) Для обеспечения нормируемых значений освещенности в помещениях использования ВДТ и ПЭВМ следует проводить чистку стекол оконных рам и светильников не реже двух раз в год и проводить своевременную замену перегоревших ламп.
1.7.4 Влияние электромагнитных полей и излучений
Как и все приборы, потребляющие электроэнергию, компьютер испускает электромагнитное излучение, причём из бытовых приборов, с ПК по силе этого излучения могут сравниться разве что микроволновая печь или телевизор, однако в непосредственной близости с ними мы не проводим очень много времени, а электромагнитное излучение имеет меньшее воздействие с увеличением расстояния от источника до объекта. Стоит отметить, что монитор создает электромагнитное и электростатическое поле не только со стороны экрана. Электромагнитное поле сзади и по бокам от монитора даже сильнее, чем спереди. Поэтому нужно беречься не только излучения от своего компьютера, но и от соседних. Санитарные нормы предписывают, чтобы расстояние до соседнего компьютера было не менее полутора метров. Лучше всего устанавливать компьютеры по периметру стены.
В настоящее время о влиянии электромагнитного излучения на организм человека, практически ни чего не известно, да и за компьютерами мы сидим пока лет 20. Однако некоторые работы и исследования в этой области определяют возможные факторы риска, так, например, считается, что электромагнитное излучение может вызвать расстройства нервной системы, снижение иммунитета, расстройства сердечно-сосудистой системы и аномалии в процессе беременности и соответственно пагубное воздействие на плод.
Для уменьшения вредного воздействия электромагнитных полей и излучений был разработан стандарт TCO-99, который предъявляет следующие требования к свойствам электронно-лучевых устройств:
1) Линейность - при выводе на экран матрицы изображения элементы, образующие ее столбцы и строки, должны быть выстроены по прямым и необрывающимся линиям; в противном случае изображение теряет четкость. Максимальное отклонение от прямой не должно составлять более 1% на половину активного экрана (по ширине или по высоте).
2) Ортогональность - геометрически правильное построение перпендикулярных линий. Нарушения перпендикулярности горизонтальных и вертикальных линий приводит к появлению характерного явления 'подушки'. Среднее отклонение по высоте и ширине не должно быть не более 0, 02, а по диагонали - 0,03.
3) Уровень яркости - количество проецируемого света. Яркость может определяться как для одной точки излучателя света, так и для какой-то части освещаемой поверхности. Для оценки яркости экрана в целом, а также отдельного символа берется вторая методика. Смысл этого требования заключается в обеспечении достаточной яркости экрана (с учетом рассеянного освещения), при котором пользователю не пришлось бы напрягать глаза для того, чтобы понять, что же на экране отображается. Требуемое значение параметра - не менее 100 канделл на квадратный метр, а рекомендуемое - 125.
4) Равномерность освещения - обеспечение одинакового уровня яркости экрана на все активной зоне. Этот параметр вычисляют как отношение максимальной яркости в рассматриваемой зоне к минимальной. Для проведения оценки равномерности освещенности в качестве активной зоны берется вся рабочая площадь монитора. Сильная неоднородность может привести к ошибочному восприятию выводимой на экран информации. Стандарт приписывает этому параметру не выходить за рамки соотношения 1,5:1 и даже рекомендует более узкий диапазон - 1,25:1.
5) Контрастность экрана - достаточная контрастность между отдельным экранным символом и его окружением. Ясно, что символ, не отличающийся по яркости от фона, крайне трудно прочесть. Вычисляется этот параметр по формулам контрастной модуляции; допустимое значение должно составлять не менее 0,5, а рекомендованное - 0,7.
6) Уровень отражения - условный коэффициент между фактической яркостью корпуса и стандартной яркостью для белого цвета. Здесь же учитывается степень отражения от стекла монитора, исчисляемая в глоссах. Чем ближе освещенность к номинальной и чем меньше света отражается стеклом, тем удобней читать с монитора. TCO-99 задает максимальный уровень отражения равным 30 единицам, а освещенность корпуса - не менее 20% от яркости экрана (рекомендован диапазон 20-75%).
7) Варьируемость температуры цвета - насыщенность белого света часто измеряют при помощи так называемой температура цвета. Так, например, свет, излучаемой обычной лампой накаливания, имеет очень низкую температуру, в то время как белые облака на ярком летнем небе - очень высокую. Измеряется цветовая температура в градусах по шкале Кельвина. В зависимости от условий освещенности рабочего места, ТСО-99 устанавливает несколько значений - 9300, 7500, 6500, 5000 оК.
8) Равномерность цвета - визуальная характеристика, описывающая, насколько однородно выглядит дисплей при 100%-ой заливке его белым цветом. При искажении цветовых характеристик монитор нельзя использовать. Стандарт допускает относительное смещение по шкалам RGB не более чем на 0,01, а рекомендует - 0,005.
9) Показатели стабильности изображения описывают, насколько монитору удается сохранять статическое изображение неизменным. Именно в этот раздел внесены требования к скорости вертикальной развертки и рабочему разрешению: 14”, 15”: 800x600, 17”: 1024x768,19”, 21”: 1280x1024. При этом скорость развертки должна составлять не менее 85 Гц, а рекомендовано - 100 Гц.
Также для защиты от электромагнитного излучения следует соблюдать следующие рекомендации:
1) По возможности, стоит приобрести жидкокристаллический монитор, поскольку его излучение значительно меньше, чем у распространённых ЭЛТ мониторов (монитор с электроннолучевой трубкой).
2) При покупке монитора необходимо обратить внимание на наличие сертификата.
3) Системный блок и монитор должен находиться как можно дальше от вас.
4) Не оставляйте компьютер включённым на длительное время если вы его не используете, хотя это и ускорит износ компьютера, но здоровье полезней. Так же, не забудьте использовать 'спящий режим' для монитора.
5) В связи с тем, что электромагнитное излучение от стенок монитора намного больше, постарайтесь поставить монитор в угол, так что бы излучение поглощалось стенами. Особое внимание стоит обратить на расстановку мониторов в офисах.
6) По возможности сократите время работы за компьютером и почаще прерывайте работу.
Электромагнитное поле (ЭМП) создается магнитными катушками отклоняющей системы, находящимися около цокольной части электронно-лучевой трубки монитора. ЭМП обладает способностью биологического, специфического и теплового воздействия на организм человека. Биологическое воздействие ЭМП зависит от длины волны, интенсивности, продолжительности и режимов воздействия, размеров и анатомического строения органа, подвергающегося воздействию ЭМП. ЭМП миллиметрового диапазона поглощаются поверхностными слоями кожи, сантиметрового - кожей и прилегающими к ней тканями, дециметрового - проникают на глубину 8-10 см. Для более длинных волн ткани тела человека являются хорошо проводящей средой.
Механизм нарушений, происходящих в организме под влиянием ЭМП, обусловлен их специфическим (нетепловым) и тепловым действием.
Специфическое воздействие ЭМП обусловлено биохимическими изменениями, происходящими в клетках и тканях. Наиболее чувствительными являются центральная и сердечно-сосудистая системы. Наблюдаются нарушения условно-рефлекторной деятельности, снижение биоэлектрической активности мозга, изменения межнейронных связей. Возможны отклонения со стороны эндокринной системы.
В начальном периоде воздействия может повышаться возбудимость нервной системы, в последующем происходит уменьшение ее функции, что проявляется в астенических состояниях, т.е. физической и нервно-психической слабости. В связи с этим для общей клинической картины хронического воздействия ЭМП характерны: головная боль, утомляемость, ухудшение самочувствия, гипотония, бродикардия, изменение проводимости сердечной мышцы. Указанные явления могут быть слабо, умеренно или явно выражены. Возможны незначительные и, как правило, нестойкие изменения в крови.
Тепловое воздействие ЭМП характеризуется повышением температуры тела, локальным избирательным нагревом тканей, органов, клеток вследствие перехода ЭМП в тепловую энергию. Интенсивность нагрева зависит от количества поглощенной энергии и скорости оттока тепла от облучаемых участков тела. Отток тепла затруднен в органах и тканях с плохим кровоснабжением. К ним в первую очередь относится хрусталик глаза. Под действием облучения в нем могут происходить коагуляция белков или диффузные изменения с последующим развитием катаракты. Подвержены тепловому облучению ЭМП также паренхиматозные органы (печень, поджелудочная железа) и полые органы, содержащие жидкость (мочевой пузырь, желудок). Нагревание их может вызвать обострение хронических заболеваний (язв, кровотечений, перфораций).
Для уменьшения влияния этого фактора на организм человека необходимо сократить общее время работы за ЭВМ до четырех часов в день. При этом необходимо, чтобы расстояние от глаз оператора до монитора составляло не менее 50 сантиметров. В связи с этим в программе все объекты, выводимые на экран, имеют соответствующие размеры. В соответствии с ГОСТ 12.2.018 - 88, мощность дозы рентгеновского излучения видеотерминала не должна превышать 100 мкР/ч на расстоянии 5 см от корпуса аппарата на стороне, обращенной к оператору, поэтому необходимо выбирать видеомонитор, удовлетворяющий этому требованию.
Программа предназначена для работы с цветными мониторами не ниже VGA. Мониторы типа VGA, SVGA полностью соответствуют ГОСТ 23144 - 78 на средства отображения информации типа ЭЛТ:
яркость свечения экрана не менее 0,5 кд/м2;
контрастность экрана не менее 5:1;
ширина линий индикации не более 1 мм;
частота мерцания изображения 75 - 90 Гц;
мощность дозы рентгеновского излучения не более 100 мкР/ч.
Визуальные эргономические параметры ВДТ являются параметрами безопасности и их неправильный выбор приводит к ухудшению здоровья пользователей.
Конструкция ВДТ должна обеспечивать возможность фронтального наблюдения экрана путем поворота корпуса в горизонтальной плоскости вокруг вертикальной оси в пределах ±30 градусов и в вертикальной плоскости вокруг горизонтальной оси в пределах ±30 градусов с фиксацией в заданном положении. Дизайн ВДТ должен предусматривать окраску корпуса в спокойные мягкие тона с диффузным рассеиванием света. Корпус ВДТ и ПЭВМ, клавиатура и другие блоки и устройства ПЭВМ должны иметь матовую поверхность одного цвета с коэффициентом отражения 0,4 0,6 и не иметь блестящих деталей, способных создавать блики. На лицевой стороне корпуса ВДТ не рекомендуется располагать органы управления, маркировку, какие-либо вспомогательные надписи и обозначения. При необходимости расположения органов управления на лицевой панели они должны закрываться крышкой или быть утоплены в корпусе.
Конструкция ВДТ должна предусматривать наличие ручек регулировки яркости и контраста, обеспечивающие возможность регулировки этих параметров от минимальных до максимальных значений.
В целях защиты от электромагнитных и электростатических полей допускается применение приэкранных фильтров, специальных экранов и других средств индивидуальной зашить, прошедших испытания в аккредитованных лабораториях и имеющих, соответствующий гигиенический сертификат.
1.7.5 Защита от шума
При выполнении основной работы на ВДТ и ПЭВМ (диспетчерские, операторские, расчетные кабины и посты управления, залы вычислительной техники и др.), во всех учебных и дошкольных помещениях с ВДТ и ПЭВМ уровень шума на рабочем месте не должен превышать 50 дБА.
В помещениях, где работают инженерно-технические работники, осуществляющие лабораторный, аналитический или измерительный контроль, уровень шума не должен превышать 60 дБА.
В помещениях операторов ЭВМ (без дисплеев) уровень шума не должен превышать 65 дБА.
На рабочих местах в помещениях для размещения шумных агрегатов вычислительных машин (АЦПУ, принтеры и т.п.) уровень шума не должен превышать 75 дБА.
программный изделие модуль требование
Таблица 1.24 - Уровни звука, эквивалентные уровни звука и уровни звукового давления в октавных полосах частот
Уровни звукового давления. дБ |
Уровни звука, эквивалентные уровни звука, дБА |
|
Среднегеометрические частоты октавных полос. Гц |
||
31,5 63 125 250 500 1000 2000 4000 8000 |
||
59 48 40 34 30 27 25 23 |
35 |
|
63 52 45 39 35 32 30 28 |
40 |
|
67 57 49 44 40 37 35 33 |
45 |
|
86 71 61 54 49 45 42 40 38 |
50 |
|
93 79 70 63 58 55 52 50 49 |
60 |
|
96 83 74 68 63 60 57 55 54 |
65 |
|
103 91 83 77 73 70 68 66 64 |
75 |
1.7.6 Микроклимат производственных помещений предприятий информационного обслуживания
Микроклимат помещений с ПЭВМ и ВДТ должен удовлетворять следующим основным правилам и нормам (ГОСТ 12.1.005 - 88):
1) В производственных помещениях, в которых работа на ВДТ и ПЭВМ является вспомогательной или основной (диспетчерские, операторские, расчетные, кабины и посты управления, залы вычислительной техники и др.), температура, относительная влажность и скорость движения воздуха на рабочих местах должны соответствовать действующим санитарным нормам микроклимата производственных помещений:
Таблица 1.25 - Оптимальные нормы микроклимата для помещений с ВДТ и ПЭВМ
Период года |
Категория работ |
Темп. воздуха, гр. С не более |
Относит. влажность воздуха, % |
Скорость движения воздуха, м/с |
|
Холодный |
легкая -1а |
22-24 |
40-60 |
0,1 |
|
легкая -1б |
21-23 |
40-60 |
0,1 |
||
Теплый |
легкая -1а |
23-25 |
40-60 |
0,1 |
|
легкая -1б |
22-24 |
40-60 |
0,2 |
Примечания: к категории 1a относятся работы, производимые сидя и не требующие физического напряжения, при которых расход энергии составляет до 120 ккал/ч; к категории 1б относятся работы, производимые сидя, стоя или связанные с ходьбой и сопровождающиеся некоторым физическим напряжением, при которых расход энергии составляет от 120 до 150 ккал/ч.
2) Для повышения влажности воздуха в помещениях следует применять увлажнители воздуха, заправляемые ежедневно дистиллированной или прокипяченной питьевой водой.
3) Уровни положительных и отрицательных аэроионов в воздухе помещений должны соответствовать нормам, приведенным в таблице №.
Таблица 1.26 - Уровни ионизации воздуха помещений при работе на ВДТ и ПЭВМ
Уровни |
Число ионов в 1 см. куб. воздуха |
||
n+ |
n- |
||
Минимально необходимые |
400 |
600 |
|
Оптимальные |
1500-3000 |
3000-5000 |
|
Максимально допустимые |
50000 |
50000 |
4) Содержание вредных химических веществ в воздухе производственных помещений, в которых работа на ВДТ и ПЭВМ является вспомогательной, не должно превышать 'Предельно допустимых концентраций вредных веществ в воздухе рабочей зоны'. Содержание вредных химических веществ в производственных помещениях, работа на ВДТ и ПЭВМ в которых является основной (диспетчерские, операторские, расчетные, кабины и посты управления, залы вычислительной техники и др.), не должно превышать 'Предельно допустимых концентраций загрязняющих веществ в атмосферном воздухе населенных мест'.
5) Запрещается проводить ремонт ВДТ и ПЭВМ непосредственно в рабочих, учебных и дошкольных помещениях.
1.7.7 Пожароопасные ситуации на предприятиях информационного обслуживания
Пожарная профилактика
Пожарная безопасность обеспечивается системой предотвращения пожара и системой пожарной защиты. Во всех служебных помещениях обязательно должен быть «План эвакуации людей при пожаре», регламентирующий действия персонала в случае возникновения очага возгорания и указывающий места расположения пожарной техники.
Для предотвращения пожаров необходимо строго соблюдать следующие правила:
1) На рабочем месте запрещается иметь огнеопасные вещества.
2) В помещениях запрещается:
а) зажигать огонь;
б) включать электрооборудование, если в помещении пахнет газом;
в) курить;
г) сушить что-либо на отопительных приборах;
д) закрывать вентиляционные отверстия в электроаппаратуре
Источниками воспламенения являются:
а) искра при разряде статического электричества
б) искры от электрооборудования
в) искры от удара и трения
г) открытое пламя
3) При возникновении пожароопасной ситуации или пожара персонал должен немедленно принять необходимые меры для его ликвидации, одновременно оповестить о пожаре администрацию.
4) Помещения с электрооборудованием должны быть оснащены огнетушителями.
Вода и водяной пар непригодна для тушения ЭВМ, находящихся под напряжением. В этом случае применяется тушение углекислым газом вследствие изоляции горящего предмета от кислорода воздуха и сильного охлаждения зоны горения. Первичным средством пожаротушения являются ручные огнетушители типа ОУ-5, ОУ-8, а также углекислотные возимые огнетушители VII-1м и VII-2м (ГОСТ 9230-69). Также для тушения электроустановок, находящихся под напряжением, применяют ручные порошкообразные огнетушители ОПС-6, ОПС-10 и ОП-1.
1.7.8 Электробезопасность. Действие электрического тока на человека. Предотвращение электротравматизма
Во избежание поражения электрическим током необходимо твердо знать и выполнять следующие правила безопасного пользования электроэнергией:
1) Необходимо постоянно следить на своем рабочем месте за исправным состоянием электропроводки, выключателей, штепсельных розеток, при помощи которых оборудование включается в сеть, и заземления. При обнаружении неисправности немедленно обесточить электрооборудование, оповестить администрацию. Продолжение работы возможно только после устранения неисправности.
2) Во избежание повреждения изоляции проводов и возникновения коротких замыканий не разрешается:
а) вешать что-либо на провода;
б) закрашивать и белить шнуры и провода;
в) закладывать провода и шнуры за газовые и водопроводные трубы, за батареи отопительной системы;
г) выдергивать штепсельную вилку из розетки за шнур, усилие должно быть приложено к корпусу вилки.
3) Для исключения поражения электрическим током запрещается:
а) часто включать и выключать компьютер без необходимости;
б) прикасаться к экрану и к тыльной стороне блоков компьютера;
в) работать на средствах вычислительной техники и периферийном оборудовании мокрыми руками;
г) работать на средствах вычислительной техники и периферийном оборудовании, имеющих нарушения целостности корпуса, нарушения изоляции проводов, неисправную индикацию включения питания, с признаками электрического напряжения на корпусе;
д) класть на средства вычислительной техники и периферийное оборудование посторонние предметы.
3) запрещается под напряжением очищать от пыли и загрязнения электрооборудование.
4) Запрещается проверять работоспособность электрооборудования в неприспособленных для эксплуатации помещениях с токопроводящими полами, сырых, не позволяющих заземлить доступные металлические части.
5) Ремонт электроаппаратуры производится только специалистами-техниками с соблюдением необходимых технических требований.
6) Недопустимо под напряжением проводить ремонт средств вычислительной техники и перифейного оборудования.
7) Во избежание поражения электрическим током, при пользовании электроприборами нельзя касаться одновременно каких-либо трубопроводов, батарей отопления, металлических конструкций, соединенных с землей.
8) При пользовании электроэнергии в сырых помещениях соблюдать особую осторожность.
9) При обнаружении оборвавшегося провода необходимо немедленно сообщить об этом администрации, принять меры по исключению контакта с ним людей. Прикосновение к проводу опасно для жизни.
10) Спасение пострадавшего при поражении электрическим током главным образом зависит от быстроты освобождения его от действия током.
Во всех случаях поражения человека электрическим током немедленно вызывают врача. До прибытия врача нужно, не теряя времени, приступить к оказанию первой помощи пострадавшему. Необходимо немедленно начать производить искусственное дыхание, а также наружный массаж сердца. Искусственное дыхание пораженному электрическим током производится вплоть до прибытия врача.
При пользовании средств вычислительной техники и периферийного оборудования каждый работник должен внимательно и осторожно обращаться с электропроводкой, приборами и аппаратами и всегда помнить, что пренебрежение правилами безопасности угрожает и здоровью, и жизни человека.
1.8 Стадии и этапы разработки
Выполнение разработки должно осуществляться в три стадии:
- техническое задание,
- технический проект,
- рабочий проект.
На стадии «Техническое задание» проводится:
- постановка задачи;
- разработка требований к программному изделию;
- изучение литературы по задаче.
На стадии «Технический проект» проводится:
- разбиение программы на модули и согласование передачи данных и управления между различными модулями программы;
- разработка функциональных модулей;
- разработка структуры данных.
На стадии «Рабочий проект» проводится:
- разработка схемы алгоритма;
- физическое проектирование программного изделия;
- тестирование и отладка программных модулей;
- тестирование и отладка готового программного продукта;
- оформление дипломной работы.
1.9 Порядок контроля и приемки
Приемка программного продукта осуществляется при сдаче документально оформленных этапов разработки и проведении испытаний на основе установленных тестов. Тесты должны быть разработаны на этапе рабочего проектирования программного изделия.
2. ТЕХНИЧЕСКИЙ ПРОЕКТ
2.1 Введение
В соответствии с требованиями технического задания основную функцию программного изделия “Целочисленные методы” можно реализовать в виде следующих этапов:
- реализация методов построения опорного плана
- реализация методов улучшения опорного плана
- реализация одноэтапных методов
- учет времени выполнения методов
- построение графиков скорости
- оценка близости методов к оптимальному решению
- построение графиков оценки близости методов к оптимальному решению.
2.2 Функция, реализующая метод «Северо-западного угла»
2.2.1 Методические ограничения
Существует ряд методов построения начального опорного решения, наиболее простым из которых является метод северо-западного угла.
Заполнение таблицы транспортной задачи начинается с левого верхнего угла и состоит из ряда однотипных шагов. На каждом шаге, исходя из запасов очередного поставщика и запросов очередного потребителя, заполняется только одна клетка и соответственно исключается из рассмотрения один поставщик или потребитель. Осуществляется это таким образом:
если , то и исключается поставщик с номером i, , k=1, 2, …, n, kj,
; (2.1)
если , то и исключается потребитель с номером j, , k=1, 2, …, m, ki,
; (2.2)
если , то
(2.3)
и исключается либо i-й поставщик, , k=1, 2, …, n, kj, , либо j-й потребитель, , k=1, 2, …, m, ki, .
Нулевые перевозки принято заносить в таблицу только тогда, когда они попадают в клетку (i,j), подлежащую заполнению. Если в очередную клетку таблицы (i,j) требуется поставить перевозку, а i-й поставщик или j-й потребитель имеет нулевые запасы или запросы, то в клетку ставится перевозка, равная нулю (базисный нуль), и после этого, как обычно, исключается из рассмотрения соответствующий поставщик или потребитель. Таким образом, в таблицу заносят только базисные нули, остальные клетки с нулевыми перевозками остаются пустыми.
2.2.2 Входные данные
Входными данными является вводимая пользователем исходная матрица задачи о назначениях - матрица С в виде одномерного целочисленного массива.
2.2.3 Инициирование работы
Инициирование осуществляется головным модулем при выборе пользователем соответствующего метода.
2.2.4 Процессы обработки
Процесс обработки заключается в поиске опорного плана решения методом «Северо-западного угла».
Выходные данные
Входными данными является матрица опорного плана решения - матрица Х в виде одномерного целочисленного массива.
2.3 Функция, реализующая метод «Наименьшей стоимости»
2.3.1 Методические ограничения
Метод минимальной стоимости прост, он позволяет построить опорное решение, достаточно близкое к оптимальному, так как использует матрицу стоимостей транспортной задачи С=(), i=1,2,,…,m, j=1,2,…,n. Как и метод северо-западного угла, он состоит из ряда однотипных шагов, на каждом из которых заполняется только одна клетка таблицы, соответствующая минимальной стоимости min {}, и исключается из рассмотрения только одна строка (поставщик) или один столбец (потребитель). Очередную клетку, соответствующую min {}, заполняют по тем же правилам, что и в методе северо-западного угла. Поставщик исключается из рассмотрения, если его запасы использованы полностью. Потребитель исключается из рассмотрения, если его запросы удовлетворены полностью. На каждом шаге исключается либо один поставщик, либо один потребитель. При этом если поставщик еще не исключен, но его запасы равны нулю, то на том шаге, когда от данного поставщика требуется поставить груз, в соответствующую клетку таблицы заносится базисный нуль и лишь, затем поставщик исключается из рассмотрения. Аналогично с потребителем.
2.3.2 Входные данные
Входными данными является вводимая исходная матрица задачи о назначениях - матрица С в виде одномерного целочисленного массива.
2.3.3 Инициирование работы
Инициирование осуществляется при запуске пользователем соответствующего модуля.
2.3.4 Процессы обработки
Процесс обработки заключается в поиске опорного плана решения методом «Наименьшей стоимости».
2.3.5 Выходные данные
Входными данными является матрица опорного плана решения - матрица Х в виде одномерного целочисленного массива.
2.4 Функция, реализующая метод «Фогеля»
2.4.1 Методические ограничения
Этот метод является эвристическим и обычно приводит к лучшему начальному решению, чем метод Северо-западного угла и метод наименьшей стоимости. На самом деле ПМФ часто дает близкое к оптимальному начальное решение.
Алгоритм состоит из следующих шагов.
Шаг 1. Вычислить штраф для каждой строки (столбца), вычитая наименьший элемент этой строки (столбца) из следующего за ним величине элемента тон же строки (столбца).
Шаг 2. Отметить строку или столбец с самым большим штрафом, (если таких несколько, выбрать среди них любую строку пли любой столбец). В отмеченной строке или столбце выбрать переменную с самой низкой стоимостью и придать ей наибольшее возможное значение. Скорректировать объем производства и спрос и вычеркнуть строку или столбец, соответствующие выполненному ограничению.Если ограничения по строке и столбцу выполняются одновременно, вычеркнуть либо строку, либо столбец, а оставшемуся столбцу (строке) приписать нулевой спрос (объем производства). Строка (столбец) с нулевым объемом производства (или спросом) не пользуется в дальнейших вычислениях (на шаге 3).
Шаг 3. (а) Если невычеркнутой остается в точности одна строка или один столбец, то закончить вычисления.
(б) Если остается невычеркнутой только одна строка (столбец) с положительным объемом производства (спросом), найти базисные переменные в этой строке (столбце), используя метод наименьшей стоимости.
(в) Если всем невычеркнутым строкам и столбцам соответствуют рулевые объемы производства и величины спроса, найти нулевые базисные переменные, используя метод наименьшей стоимости.
(г) В других случаях вычислить новые значения штрафов для вычеркнутых строк и столбцов и перейти к шагу 2.
2.4.2 Входные данные
Входными данными является вводимая исходная матрица задачи о назначениях - матрица С в виде одномерного целочисленного массива.
2.4.3 Инициирование работы
Инициирование осуществляется головным модулем при выборе пользователем соответствующего метода.
2.4.4 Процессы обработки
Процесс обработки заключается в поиске опорного плана решения методом «Фогеля».
2.4.5 Выходные данные
Входными данными является матрица опорного плана решения - матрица Х в виде одномерного целочисленного массива.
2.5 Функция, реализующая метод «Потенциалов»
2.5.1 Методические ограничения
Алгоритм складывается из предварительного этапа и конечного числа однотипных итераций.
На предварительном этапе строят начальный опорный план и составляют матрицу
(2.4)
где - предварительные потенциалы пунктов
. (2.5)
Предварительный этап. С помощью известного метода (например северо-западного угла или минимального элемента) определяют начальный опорный план Х0 и вычисляют предварительные потенциалы
.
Вычисление предварительных потенциалов производят так. По найденному опорному плану Х0 строят схему перевозок Т-задачи из основных коммуникаций плана. Основные коммуникации плана Х0 = - это те, которым отвечают базисные компоненты плана, т.е. коммуникации для которых . Далее образуют следующие множества: J1 - множество индексов всех пунктов Bj, которые связаны с пунктом А1 основными коммуникациями; І1 - множество индексов тех пунктов Аі, которые связаны основными коммуникациями с множеством J1; J2 - множество пунктов Bj, которые связаны основными коммуникациями с множеством І1 и т.д. Образование таких множеств Ік продолжаем до тех пор, пока не получим пустое множество.
Поскольку на выполнение условий оптимальности оказывают влияние лишь разности , то за начало отсчета (нуль) можно принять потенциал любого из пунктов.
Полагаем для определенности
(2.6)
и вычислим систему потенциалов относительно А1. Тогда
(2.7)
где j J1. Затем по значениям определяем потенциалы пунктов
. (2.8)
Аналогично вычисляем потенциалы
(2.9)
(для и .) и т.д. После того как потенциалы всех пунктов найдены, строим матрицу
(2.10)
Очевидно, позиции матрицы С1, отвечающие базисным элементам плана Х0, будут заняты нулями. Если матрица С1 не содержит отрицательных элементов, то Х0 - оптимальный план. В противном случае Х0 - неоптимальный план, который может быть улучшен. Тогда переходим к выполнению однотипных итераций.
(k+1)-я итерация. Каждая итерация, кроме первой, где отсутствует первый этап, состоит из двух этапов. Предположим, что уже проведено k итераций (k=1,2,.),в результате которых получен план Хk и вспомогательная матрицу Сk. Цель (k+1)-й итерации - построение матрицы Сk+1, а также либо установление оптимальности плана Хk, либо нахождение более экономичного плана Xk+1.
Первый этап. Вычисляют матрицу Сk+1. Преобразвание матрицы Сk в матрицу Сk+1 состоит в следующем. Выбирают наибольший по модулю отрицательный элемент Сk. Пусть это элемент . Тогда вычеркивают (или выделяют) строку , в которой он содержится. Просматривают эту строку и отыскивают множество существенных его элементов. Хk -существенными элементами называют те элементы =0, которые отвечают базисным элементам плана Хk т.е. для которых . Вычеркивают столбцы, которые содержат эти элементы. Далее просматривают вычеркнутые столбцы и ищут в них новые существенные элементы, которые лежат в строках отличных от уже вычеркнутых ранее. Если такие элементы имеются, то вычеркивают строки, в которых они содержатся. Процесс выделения продолжают до тех пор, пока очередное множество новых существенных элементов не окажется пустым. Поскольку каждые строка и столбец не могут быть выделены дважды, то весь процесс заканчивается не более чем за l =m+ n - 1 шагов. Далее строят матрицу Сk+1. Для этого величину прибавляют ко всем элементам выделенных строк и вычитают из элементов всех выделенных столбцов матрицы Сk. При этом все существенные элементы матрицы Сk остаются равными нулю, а кроме того, в нуль превращается и элемент .
Если все элементы матрицы Сk+1 окажутся неотрицательными, то Xk - оптимальный план, и на этом процесс заканчивается. В противном случае переходят ко второму этапу.
Второй этап. Цель этого этапа - построить более экономичный план Хk+1. Выбирают наибольший по модулю отрицательный элемент матрицы Сk+1. Пусть это элемент . Строят цепочку из положительных элементов плана, которая замыкается на . После того, как цепочка построена, в ней находят минимальный нечетный по порядку следования элемент:
(2.11)
Прибавляют ко всем четным элементам (по порядку следования) цепочки и к элементу и вычитают из всех нечетных элементов. Остальные элементы Хk оставляют без изменения.
Новый план Хk+1 построен. Он является базисным, так как число его ненулевых элементов не изменилось.
Пусть Lk - транспортные издержки, отвечающие плану Хk. Тогда новое значение целевой функции, отвечающее плану Xk+1, находят по соотношению
. (***)
Так как и , то . Поэтому Хk+1 - улучшенный опорный план.
Затем производят аналогично (k+2)-ю итерацию.
2.5.2 Входные данные
Входными данными является исходная матрица задачи о назначениях и матрица опорного плана решения - матрицы С и Х в виде одномерных целочисленных массивов.
2.5.3 Инициирование работы
Инициирование осуществляется головным модулем при выборе пользователем соответствующего метода.
2.5.4 Процессы обработки
Процесс обработки заключается в поиске опорного плана решения методом «Потенциалов».
2.5.5 Выходные данные
Входными данными является матрица опорного плана решения - матрица Х в виде одномерного целочисленного массива.
2.6 Функция, реализующая «Венгерский» метод
2.6.1 Методические ограничения
Алгоритм состоит из предварительного этапа и не более чем (n-2) последовательно проводимых итераций. Каждая итерация связана с эквивалентными преобразованиями матрицы, полученной в результате проведения предыдущей итерации, и с выбором максимального числа независимых нулей. Окончательным результатом итерации является увеличение числа независимых нулей на единицу. Как только количество независимых нулей станет равным n, проблему выбора оказывается решенной, а оптимальный вариант назначений определяется позициями независимых нулей в последней матрице.
Предварительный этап. Разыскивают максимальный элемент в j - м столбце и все элементы этого столбца последовательно вычитают из максимального. Эту операцию проделывают над всеми столбцами матрицы С. В результате образуется матрица с неотрицательными элементами, в каждом столбце которой имеется, по крайней мере, один нуль.
Далее рассматривают i - ю строку полученной матрицы, разыскивают ее минимальный элемент и из каждого элемента этой строки вычитают минимальный. Эту процедуру повторяют со всеми строками. В результате получим матрицу С0 (С0 ~ C), в каждой строке и столбце которой имеется, по крайней мере, один нуль. Описанный процесс преобразования С в С0 называется приведением матрицы.
Находим произвольный нуль в первом столбце и отмечаем его звездочкой. Затем просматриваем второй столбец, и если в нем есть нуль, расположенный в строке, где нет нуля со звездочкой, то отмечаем его звездочкой. Аналогично просматриваем один за другим все столбцы матрицы С0 и отмечаем, если возможно, следующие нули знаком '*'. Очевидно, что нули матрицы С0, отмеченные звездочкой, являются независимыми. На этом предварительный этап заканчивается.
(k+1)-ая итерация. Допустим, что k-я итерация уже проведена и в результате получена матрица Сk. Если в ней имеется ровно n нулей со звездочкой, то процесс решения заканчивается. В противном случае переходим к (k+1) - й итерации.
Каждая итерация начинается первым и заканчивается вторым этапом. Между ними может несколько раз проводиться пара этапов: третий - первый. Перед началом итерации знаком '+' выделяют столбцы матрицы Сk, которые содержат нули со звездочками.
Первый этап. Просматривают невыделенные столбцы Сk. Если среди них не окажется нулевых элементов, то переходят к третьему этапу. Если же невыделенный нуль матрицы Сk обнаружен, то возможен один из двух случаев:
1) строка, содержащая невыделенный нуль, содержит также и нуль со звездочкой;
2) эта строка не содержит нуля со звездочкой.
Во втором случае переходим сразу ко второму этапу, отметив этот нуль штрихом.
В первом случае этот невыделенный нуль отмечают штрихом и выделяют строку, в которой он содержится (знаком '+' справа от строки). Просматривают эту строку, находят нуль со звездочкой и уничтожают знак '+' выделения столбца, в котором содержится данный нуль.
Далее просматривают этот столбец (который уже стал невыделенным) и отыскивают в нем невыделенный нуль (или нули), в котором он находится. Этот нуль отмечают штрихом и выделяют строку, содержащую такой нуль (или нули). Затем просматривают эту строку, отыскивая в ней нуль со звездочкой.
Этот процесс за конечное число шагов заканчивается одним из следующих исходов:
1) все нули матрицы Сk выделены, т.е. находятся в выделенных строках или столбцах. При этом переходят к третьему этапу;
2) имеется такой невыделенный нуль в строке, где нет нуля со звездочкой. Тогда переходят ко второму этапу, отметив этот нуль штрихом.
Второй этап. На этом этапе строят следующую цепочку из нулей матрицы Сk: исходный нуль со штрихом, нуль со звездочкой, расположенный в одном столбце с первым нулем со штрихом в одной строке с предшествующим нулем со звездочкой и т.д. Итак, цепочка образуется передвижением от 0' к 0* по столбцу, от 0* к 0' по строке и т.д.
Можно доказать, что описанный алгоритм построения цепочки однозначен и конечен, при этом цепочка всегда начинается и заканчивается нулем со штрихом.
Далее над элементами цепочки, стоящими на нечетных местах ( 0' ) -, ставим звездочки, уничтожая их над четными элементами ( 0* ). Затем уничтожаем все штрихи над элементами Сk и знаки выделения '+'. Количество независимых нулей будет увеличено на единицу. На этом (k+1) -я итерация закончена.
Третий этап. К этому этапу переходят после первого, если все нули матрицы Сk выделены. В таком случае среди невыделенных элементов Сk выбирают минимальный и обозначают его h (h>0). Далее вычитают h из всех элементов матрицы Сk, расположенных в невыделенных строках и прибавляют ко всем элементам, расположенным в выделенных столбцах. В результате получают новую матрицу С'k, эквивалентную Сk. Заметим, что при таком
преобразовании, все нули со звездочкой матрицы Сk остаются нулями и в С'k, кроме того, в ней появляются новые невыделенные нули. Поэтому переходят вновь к первому этапу. Завершив первый этап, в зависимости от его результата либо переходят ко второму этапу, либо вновь возвращаются к третьему этапу.
После конечного числа повторений очередной первый этап обязательно закончится переходом на второй этап. После его выполнения количество независимых нулей увеличится на единицу и (k+1) - я итерация будет закончена.
2.6.2 Входные данные
Входными данными является вводимая исходная матрица задачи о назначениях - матрица С в виде одномерного целочисленного массива.
2.6.3 Инициирование работы
Инициирование осуществляется головным модулем при выборе пользователем соответствующего метода.
2.6.4 Процессы обработки
Процесс обработки заключается в поиске опорного плана решения Венгерским методом.
2.6.5 Выходные данные
Входными данными является матрица опорного плана решения - матрица Х в виде одномерного целочисленного массива.
2.7 Функция, реализующая метод «Не реализованных прибылей (Этап 1)»
2.7.1 Методические ограничения
Алгоритм состоит из следующих шагов.
Шаг 1. Получить новую матрицу А, для этого из каждого элемента матрицы С, Cij вычитается сумма элементов по i строке и j столбцу (исключая сам элемент Cij).
Aij=3*Cij - УCik - УCkj (2.12)
Шаг 2. Включить в базисное решение элемент min{A}. Вычеркнуть соответствующую строку и столбец. Повторить шаг 1 для матрицы С, не учитывая вычеркнутые строки и столбцы.
Метод заканчивает работу когда все строки и столбцы вычеркнуты.
2.7.2 Входные данные
Входными данными является вводимая исходная матрица задачи о назначениях - матрица С в виде одномерного целочисленного массива.
2.7.3 Инициирование работы
Инициирование осуществляется головным модулем при выборе пользователем соответствующего метода.
2.7.4 Процессы обработки
Процесс обработки заключается в поиске опорного плана решения методом «Не реализованных прибылей (Этап 1)»
2.7.5 Выходные данные
Входными данными является матрица опорного плана решения - матрица Х в виде одномерного целочисленного массива.
2.8 Функция, реализующая метод Не реализованных прибылей (Этап 2)
2.8.1 Методические ограничения
Алгоритм состоит из следующих шагов.
Предварительный шаг. Одним из методов рассчитывается опорный план решения.
Шаг 1. Получить новую матрицу А, по формуле
Aij= (Cij + Ckm) - (Cim + Ckj), (2.13)
где Cim и Ckj - элементы, входящие в базис.
Шаг 2. Если элемент Aij=min{A}
а) меньше нуля, то включить в базисное решение элементы Сij, Сkm
и выводим элементы из базиса Сim, Сkj
Затем переходим к шагу 1.
б) больше или равен нулю, то метод заканчивает работу и выводится результат.
2.8.2 Входные данные
Входными данными является исходная матрица задачи о назначениях и матрица опорного плана решения - матрицы С и Х в виде одномерных целочисленных массивов.
2.8.3 Инициирование работы
Инициирование осуществляется головным модулем при выборе пользователем соответствующего метода.
2.8.4 Процессы обработки
Процесс обработки заключается в улучшении опорного плана решения методом «Не реализованных прибылей (Этап 2)»
2.8.5 Выходные данные
Входными данными является матрица опорного плана решения - матрица Х в виде одномерного целочисленного массива.
2.9 Функция, реализующая метод Не реализованных прибылей (Этап 3)
2.9.1 Методические ограничения
Алгоритм состоит из следующих шагов.
Предварительный шаг. Одним из методов рассчитывается опорный план решения. Затем с помощью метода «Не реализованных прибылей (Этап 2)» опорный план решения улучшается.
Шаг 1. Получить новую матрицу А, для этого из всех элементов строки вычитается соответствующий базовый элемент этой строки.
Шаг 2. Ищется элемент Aij=min{A}.
Шаг 3. Начиная с Aij строится цикл, состоящий из базовых элементов в столбце и минимальных элементов в строке. Цикл замыкается на Aij. При этом в цикле рассчитывается значение Н - оценка введения в базис новых элементов.
Н = УCсij, (2.14)
где Cсij - элемент входящий в цикл.
Шаг 4. Если значение Н:
а) меньше нуля, то вводим новые базисные решения и удаляем старые, из тех элементов, что вошли в цикл. Переходим к шагу 1.
б) больше или равно нулю, то метод заканчивает работу и выводится результат.
2.9.2 Входные данные
Входными данными является исходная матрица задачи о назначениях и матрица опорного плана решения - матрицы С и Х в виде одномерных целочисленных массивов.
2.9.3 Инициирование работы
Инициирование осуществляется головным модулем при выборе пользователем соответствующего метода.
2.9.4 Процессы обработки
Процесс обработки заключается в получении оптимального опорного плана решения методом «Не реализованных прибылей (Этап 3)»
2.9.5 Выходные данные
Входными данными является матрица опорного плана решения - матрица Х в виде одномерного целочисленного массива.
2.10 Функция построения графика зависимости скорости работы метода от размерности исходной матрицы
Входные данные
Входными данными являются данные, полученные от функции оценки скорости работы методов.
Инициирование работы
Инициирование осуществляется при запуске функции пользователем.
Процессы обработки
Процесс обработки заключается в построения графика зависимости скорости работы метода от размерности исходной матрицы.
Выходные данные
Выходными данными является график зависимости скорости работы метода от размерности исходной матрицы.
2.11 Функция построения графика зависимости близости опорного плана к оптимальному от размерности исходной матрицы
Входные данные
Входными данными являются данные, полученные от функции оценки оптимальности выбранного метода.
Инициирование работы
Инициирование осуществляется при запуске функции пользователем.
Процессы обработки
Процесс обработки заключается в построения графика зависимости близости опорного плана к оптимальному от размерности исходной матрицы.
Выходные данные
Выходными данными является график зависимости близости опорного плана к оптимальному от размерности исходной матрицы.
2.12 Функция оценки скорости работы метода
Входные данные
Входными данными является выбор пользователем оцениваемого метода.
Инициирование работы
Инициирование осуществляется функцией построения графика оценки скорости работы метода.
Процессы обработки
Процесс обработки заключается в оценке скорости работы метода.
Выходные данные
Выходными данными является время выполнения оцениваемого метода.
2.13 Функция оценки оптимальности результата работы метода
Методические ограничения
Оптимальность полученного результата оценивается следующим образом:
1) рассчитывается опорный план с помощью оцениваемого метода;
2) с помощью метода получения оптимального опорного плана рассчитывается значения целевой функции для тех же исходных данных;
3) с помощью полного перебора ищется оптимальный опорный план наиболее близкий по расположению базисных элементов к оцениваемому.
4) коэффициент оптимальности равен отношению количества совпавших базисных элементов к рангу матрицы.
Входные данные
Входными данными является выбор пользователем оцениваемого метода.
Инициирование работы
Инициирование осуществляется функцией оценки оптимальности работы метода.
Процессы обработки
Процесс обработки заключается в оценке оптимальности полученного при работе метода результата.
Выходные данные
Выходными данными является коэффициент оптимальности полученного результата.
3. РАБОЧИЙ ПРОЕКТ
3.1 Общие сведения
Дипломный проект носит название «Программный продукт, реализующий сравнительный анализ методов линейного целочисленного программирования».
В рамках дипломного проектирования разрабатывается ПО, предназначенное для оценки скорости и точности работы методов решения задачи о назначениях.
Кроме того необходимо указать, что пользователь выдвинул следующие требования к ПО:
1) Реализуемые методы:
а) Метод Северо-Западного угла;
б) Метод Наименьшей стоимости;
в) Метод Фогеля;
г) Метод Не реализованных прибылей (этап 1);
д) Метод Не реализованных прибылей (этап 2);
е) Метод Не реализованных прибылей (этап 3);
ж) Метод Потенциалов;
з) Венгерский метод.
2) Реализация возможности комбинации различных методов.
3) Необходимость организации работы в диалоговом режиме.
4) Обеспечение минимального количества вводимых с клавиатуры символов и знаков.
5) Возможность использования мыши для работы с программой.
6) Возможность получения результатов работы на экране дисплея.
7) Возможность построения графиков зависимости скорости работы методов от размерности исходной матрицы.
8) Возможность построения графиков зависимости точности работы методов от размерности исходной матрицы.
3.2 Описание модулей
Модуль S_z
Предназначен для решения задачи о назначениях методом Северо-Западного угла
Входные данные
Переменная |
Тип |
Назначение |
|
mas2 |
Динамический массив типа int |
Матрица С |
|
n |
Переменная типа int |
Размерность матрицы С |
Процессы обработки
Процессы обработки заключаются в решении задачи о назначениях, заданной матрицей С, методом Северо-Западного угла (См. Приложение. Текст программы стр. 161).
Выходные данные
Переменная |
Тип |
Назначение |
|
mas3 |
Динамический массив типа int |
Матрица Х |
Схема передачи управления
Схема передачи управления представлена на рисунке 3.1
Рисунок 3.1
Модуль N_st
Предназначен для решения задачи о назначениях методом Наименьшей стоимости.
Входные данные
Переменная |
Тип |
Назначение |
|
mas2 |
Динамический массив типа int |
Матрица С |
|
n |
Переменная типа int |
Размерность матрицы С |
Процессы обработки
Процессы обработки заключаются в решении задачи о назначениях, заданной матрицей С, методом Наименьшей стоимости (См. Приложение. Текст программы стр. 153).
Выходные данные
Переменная |
Тип |
Назначение |
|
mas3 |
Динамический массив типа int |
Матрица Х |
Схема передачи управления
Схема передачи управления представлена на рисунке 3.2.
Рисунок 3.2
Модуль Fogel
Предназначен для решения задачи о назначениях методом Фогеля
Входные данные
Переменная |
Тип |
Назначение |
|
mas2 |
Динамический массив типа int |
Матрица С |
|
n |
Переменная типа int |
Размерность матрицы С |
Процессы обработки
Процессы обработки заключаются в решении задачи о назначениях, заданной матрицей С, методом Фогеля (См. Приложение. Текст программы стр. 152).
Выходные данные
Переменная |
Тип |
Назначение |
|
mas3 |
Динамический массив типа int |
Матрица Х |
Схема передачи управления
Схема передачи управления представлена на рисунке 3.3
Рисунок 3.3
Модуль Ner_p1
Предназначен для решения задачи о назначениях методом Не реализованных прибылей (этап 1)
Входные данные
Переменная |
Тип |
Назначение |
|
mas2 |
Динамический массив типа int |
Матрица С |
|
n |
Переменная типа int |
Размерность матрицы С |
Процессы обработки
Процессы обработки заключаются в решении задачи о назначениях, заданной матрицей С, методом Не реализованных прибылей (этап 1) (См. Приложение. Текст программы стр. 154).
Выходные данные
Переменная |
Тип |
Назначение |
|
mas3 |
Динамический массив типа int |
Матрица Х |
Схема передачи управления
Схема передачи управления представлена на рисунке 3.4
Рисунок 3.4
Модуль Ner_p2
Предназначен для решения задачи о назначениях методом Не реализованных прибылей (этап 2).
Входные данные
Переменная |
Тип |
Назначение |
|
mas2 |
Динамический массив типа int |
Матрица С |
|
mas3 |
Динамический массив типа int |
Матрица Х |
|
n |
Переменная типа int |
Размерность матрицы С |
Процессы обработки
Процессы обработки заключаются в решении задачи о назначениях, заданной матрицей С, методом Не реализованных прибылей (этап 2) (См. Приложение. Текст программы стр. 154).
Выходные данные
Переменная |
Тип |
Назначение |
|
mas3 |
Динамический массив типа int |
Матрица Х |
Схема передачи управления
Схема передачи управления представлена на рисунке 3.5
Рисунок 3.5
Модуль Ner_p3
Предназначен для решения задачи о назначениях методом Не реализованных прибылей (этап 3).
Входные данные
Переменная |
Тип |
Назначение |
|
mas2 |
Динамический массив типа int |
Матрица С |
|
mas3 |
Динамический массив типа int |
Матрица Х |
|
n |
Переменная типа int |
Размерность матрицы С |
Процессы обработки
Процессы обработки заключаются в решении задачи о назначениях, заданной матрицей С, методом Не реализованных прибылей (этап 3) (См. Приложение. Текст программы стр. 155).
Выходные данные
Переменная |
Тип |
Назначение |
|
mas3 |
Динамический массив типа int |
Матрица Х |
Схема передачи управления
Схема передачи управления представлена на рисунке 3.6
Рисунок 3.6
Модуль Potenc_m
Предназначен для решения задачи о назначениях методом Потенциалов
Входные данные
Переменная |
Тип |
Назначение |
|
mas2 |
Динамический массив типа int |
Матрица С |
|
mas3 |
Динамический массив типа int |
Матрица Х |
|
n |
Переменная типа int |
Размерность матрицы С |
Процессы обработки
Процессы обработки заключаются в решении задачи о назначениях, заданной матрицей С, методом Потенциалов (См. Приложение. Текст программы стр. 157).
Выходные данные
Переменная |
Тип |
Назначение |
|
mas3 |
Динамический массив типа int |
Матрица Х |
Схема передачи управления
Схема передачи управления представлена на рисунке 3.7
Рисунок 3.7
Модуль Venger_m
Предназначен для решения задачи о назначениях Венгерским методом
Входные данные
Переменная |
Тип |
Назначение |
|
mas2 |
Динамический массив типа int |
Матрица С |
|
n |
Переменная типа int |
Размерность матрицы С |
Процессы обработки
Процессы обработки заключаются в решении задачи о назначениях, заданной матрицей С, Венгерским методом (См. Приложение. Текст программы стр. 161).
Выходные данные
Переменная |
Тип |
Назначение |
|
mas3 |
Динамический массив типа int |
Матрица Х |
Схема передачи управления
Схема передачи управления представлена на рисунке 3.8.
Рисунок 3.8
Модуль M1
Предназначен для обеспечения удобного пользовательского интерфейса при управлении работой программы. Позволяет вводить данные как вручную, так и случайным образом. Модуль также предназначен для графического отображения результатов работы методов решения задачи о назначениях, построения графиков скорости и точности работы методов.
Модуль служит для передачи команд другим модулям. Вызов модуля осуществляется из операционной системы.
Диаграмма передач управления
Схема передачи управления представлена на рисунке 3.9
Рисунок 3.9
Описание формы Form1
Внешний вид формы представлен на рисунке 3.10, 3.11, 3.12.
TabSeet1 - Методы решения задачи о назначениях
Рисунок 3.10
TabSeet2 - Построение графиков скоростей
Рисунок 3.11
TabSeet3 - Построение графиков оптимальности
Рисунок 3.12
Инициирование работы
Инициирование осуществляется запуском из командной строки операционной системы исполняемого файла программного изделия, либо щелчком мыши по пиктограмме изделия в проводнике операционной системы Windows 98/NT/XP и выше.
События, методы, функции модуля
События:
1) событие TForm1::Button1Click(TObject *Sender) - ввод матриц С и Х (SG2, SG3), запуск функции s_zy (метод Северо-Западного угла);
2) событие TForm1::RandomClick(TObject *Sender) - ввод случайной матрицы С (SG2);
3) событие TForm1::Button1Click(TObject *Sender) - ввод матриц С и Х (SG2, SG3), запуск функции s_zy (метод Северо-Западного угла);
4) событие TForm1::Button3Click(TObject *Sender) - ввод матриц С и Х (SG2, SG3), запуск функции fogel_m (метод Фогеля);
5) событие TForm1::Edit1Change(TObject *Sender) - изменение размеров матриц С и Х (SG2, SG3);
6) событие TForm1::FormActivate(TObject *Sender) - активация Form1, ввод случайной матрицы С (SG2);
7) событие TForm1::Button4Click(TObject *Sender) - ввод матриц С и Х (SG2, SG3), запуск функции potenc (метод Потенциалов);
8) событие TForm1::Button5Click(TObject *Sender) - ввод матриц С и Х (SG2, SG3), запуск функции venger (Венгерский метод);
9) событие TForm1::Button6Click(TObject *Sender) - прорисовка нового графика скоростей;
10) событие TForm1::Button7Click(TObject *Sender) - ввод матриц С и Х (SG2, SG3), запуск функции ner_pr1 (метод Не реализованных прибылей (этап 1));
11) событие TForm1::Button8Click(TObject *Sender) - ввод матриц С и Х (SG2, SG3), запуск функции ner_pr2 (метод Не реализованных прибылей (этап 2));
12) событие TForm1::Button10Click(TObject *Sender) - ввод матриц С и Х (SG2, SG3), запуск функции ner_pr3 (метод Не реализованных прибылей (этап 3));
13) событие TForm1::ComboBox1Change(TObject *Sender) - выбор метода для построения графика скоростей на первом этапе;
14) событие TForm1::ComboBox2Change(TObject *Sender) - выбор метода для построения графика скоростей на втором этапе;
15) событие TForm1::ComboBox3Change(TObject *Sender) - выбор метода для построения графика скоростей на третьем этапе;
16) событие TForm1::ComboBox4Change(TObject *Sender) - выбор метода для построения графика оптимальности на первом этапе;
17) событие TForm1::ComboBox5Change(TObject *Sender) - выбор метода для построения графика оптимальности на втором этапе;
18) событие TForm1::Button9Click(TObject *Sender) - добавление графика скоростей;
19) событие TForm1::Button11Click(TObject *Sender) - прорисовка нового графика оптимальности метода;
20) событие TForm1::Button12Click(TObject *Sender) - добавление графика оптимальности метода;
Функции:
1) int s_zy(int *, int *, int nn); - метод Северо-Западного угла (модуль S_z)
2) int nai_st(int *, int *, int nn); - метод Наименьшей стоимости (модуль N_st)
3) int fogel_m(int *, int *, int nn); - метод Фогеля (модуль Fogel)
4) int potenc(int *, int *, int nn); - метод Потенциалов (модуль Potenc_m)
5) int venger(int *, int *, int nn); - Венгерский метод (модуль Venger_m)
6) int ner_pr1(int *, int *, int nn); - метод Не реализованных прибылей (этап 1) (модуль Ner_p1)
7) int ner_pr2(int *, int *, int nn); - метод Не реализованных прибылей (этап 2) (модуль Ner_p2)
8) int ner_pr3(int *, int *, int nn); - метод Не реализованных прибылей (этап 3) (модуль Ner_p3)
Внутренние данные
Описание внутренних данных модуля M1 приводится в таблице 3.1.
Таблица 3.1 - Внутренние данные
Переменная |
Тип |
Назначение |
|
mas2 |
Динамический массив типа int |
Матрица С |
|
mas3 |
Динамический массив типа int |
Матрица Х |
|
n |
Переменная типа int |
Размерность матрицы С |
|
sum |
Переменная типа int |
Значение целевой функции |
|
хn, yn |
Переменная типа int |
Размерность области прорисовки графиков |
|
tc |
Переменная типа int |
Точность построения графика |
|
hh |
Переменная типа int |
Шаг сетки графика |
|
mast |
Переменная типа float |
Масштаб при прорисовке графиков |
|
tim |
TDateTime |
Время выполнения метода |
|
i,j |
Переменная типа int |
Временные счетчики циклов |
Процессы обработки
Процессы обработки:
- Ввод данных в модули, реализующие решение задачи о назначениях;
- вызов модулей, реализующих решение задачи о назначениях;
- вывод результатов работы методов на экран;
- прорисовка графиков оценки скоростей работы методов;
- прорисовка графиков оценки оптимальности результатов работы методов.
Нормальное завершение
Нормальное завершение работы модуля осуществляется при закрытии рабочего окна.
Программа и методика испытаний
Объектом испытаний является программный комплекс «Целочисленные методы». Исполняемый файл Main.exe.
Целью испытаний является комплексное тестирование программы на соответствие условиям требований ТЗ.
Состав предъявляемой документации
Для проведения испытаний необходимы следующие документы по выполненной разработке:
- техническое задание;
- технический проект;
- рабочий проект;
Порядок проведения испытаний включает в себя:
1) проверка межкомпонентного интерфейса;
2) тестирование выполнения функционального назначения отдельными функциональными модулями;
3) комплексное тестирование.
Методы испытаний
Испытания программного продукта были проведены на основе функционального тестирования. Этот метод рассматривает тестируемую программу как черный ящик. При этом внутренняя структура программы не учитывается, тесты строятся на основании функциональных свойств программы, т.е. опираясь на ее функциональные спецификации.
При функциональном тестировании программа рассматривается как некоторая функция. Выбор тестов осуществляется на основе исследования множеств точек области и образа программы и выделение в них особых точек, представляющих наибольший интерес с точки зрения функционирования программы. В этом случае, следует попытаться испытать все точки области, либо использовать какую-то дополнительную информацию о специфике задачи для выбора наиболее характерных точек.
3.3 Функциональное тестирование программы
Таблица 3.2 - Функциональные тесты
№ теста |
Тестируемая ситуация |
Входные данные |
Планируемый результат |
|
1 |
Ввод данных в поле размерность матрицы |
В поле размерность матрицы введен 0 |
Выдача сообщения об ошибке |
|
2 |
Ввод данных в поле размерность матрицы |
В поле размерность матрицы введено не число |
Выдача сообщения об ошибке |
|
3 |
Ввод данных в поле размерность матрицы |
В поле размерность матрицы введено отрицательное число |
Выдача сообщения об ошибке |
|
4 |
Ввод данных в поле размерность матрицы |
В поле размерность матрицы введено нецелое число |
Выдача сообщения об ошибке |
|
5 |
Ввод данных в поле ограничение значений |
В поле ограничение значений введен 0 |
Выдача сообщения об ошибке |
|
6 |
Ввод данных в поле ограничение значений |
Поле ограничение значений пустое |
Выдача сообщения об ошибке |
|
7 |
Ввод данных в поле ограничение значений |
В поле ограничение значений введено не число |
Выдача сообщения об ошибке |
|
8 |
Ввод данных в поле ограничение значений |
В поле ограничение значений введено отрицательное число |
Выдача сообщения об ошибке |
|
9 |
Ввод данных в поле ограничение значений |
В поле ограничение значений введено нецелое число |
Выдача сообщения об ошибке |
|
10 |
Ввод данных в матрицу С |
Заполнение пользователем матрицы С не числами |
Выдача сообщения об ошибке |
|
11 |
Ввод данных в матрицу С |
Заполнение пользователем матрицы С нецелыми числами |
Выдача сообщения об ошибке |
|
12 |
Ввод данных поле выбора методов для построения графиков скоростей |
Методы для построения графиков скоростей не заданы |
Блокирование функции построения графиков скоростей |
|
13 |
Ввод данных поле выбора методов для построения графиков оптимальностей |
Методы для построения графиков оптимальности не заданы |
Блокирование функции построения графиков оптимальности |
|
14 |
Ввод данных поле выбора методов для построения графиков скоростей |
Методы для построения графиков скоростей заданы |
Построения графиков скоростей |
|
15 |
Ввод данных поле выбора методов для построения графиков оптимальностей |
Методы для построения графиков оптимальности заданы |
Построения графиков оптимальности |
|
16 |
Запуск метода Северо-Западного угла (модуль S_z) |
Матрица С 6 1 6 3 5 0 5 0 6 9 5 0 7 8 4 6 |
Матрица Х 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 Целевая функция = 17 |
|
17 |
Запуск метода Наименьшей стоимости (модуль N_st) |
Матрица С 6 1 6 3 5 0 5 0 6 9 5 0 7 8 4 6 |
Матрица Х 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 Целевая функция = 10 |
|
18 |
Запуск метода Фогеля (модуль Fogel) |
Матрица С 6 1 6 3 5 0 5 0 6 9 5 0 7 8 4 6 |
Матрица Х 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 Целевая функция = 10 |
|
19 |
Запуск метода Не реализованных прибылей(этап 1) Ner_p1 |
Матрица С 6 1 6 3 5 0 5 0 6 9 5 0 7 8 4 6 |
Матрица Х 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 Целевая функция = 10 |
|
20 |
Запуск Венгерского метода (модуль Venger_m) |
Матрица С 4 0 9 4 0 7 0 0 6 4 5 9 4 4 0 2 |
Матрица Х 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 Целевая функция = 6 |
|
21 |
Запуск методов Северо-Западного угла и Не реализованных прибылей (этап 2) (модули S_z, Ner_p2) |
Матрица С 4 0 9 4 0 7 0 0 6 4 5 9 4 4 0 2 |
Матрица Х 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1 Целевая функция = 7 |
|
22 |
Запуск методов Наименьшей стоимости и Потенциалов (модули N_st, Potenc_m) |
Матрица С 4 0 9 4 0 7 0 0 6 4 5 9 4 4 0 2 |
Матрица Х 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 Целевая функция = 6 |
|
23 |
Запуск методов Северо-Западного угла, Не реализованных прибылей (этап 2), Не реализованных прибылей (этап 3) (модули S_z, Ner_p2,Ner_p3) |
Матрица С 1 0 4 5 1 9 3 0 3 7 0 4 7 0 5 2 |
Матрица Х 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 Целевая функция = 1 |
|
24 |
Запуск методов Северо-Западного угла, Не реализованных прибылей (этап 2), Потенциалов (модули S_z, Ner_p2,Potenc_m) |
Матрица С 7 6 8 2 0 6 6 9 6 7 4 5 5 0 9 8 |
Матрица Х 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 Целевая функция = 6 |
|
25 |
Запуск методов Северо-Западного угла, Потенциалов (модули S_z, Potenc_m) |
Матрица С 7 6 8 2 0 6 6 9 6 7 4 5 5 0 9 8 |
Матрица Х 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 Целевая функция = 6 |
|
26 |
Запуск методов Наименьшей стоимости, Не реализованных прибылей (этап 2) (модули N_st, Ner_p2) |
Матрица С 6 1 9 9 3 4 7 7 6 4 4 3 8 9 7 4 |
Матрица Х 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1 Целевая функция = 12 |
|
27 |
Запуск методов Фогеля, Потенциалов (модули Fogel, Potenc_m) |
Матрица С 6 1 9 9 3 4 7 7 6 4 4 3 8 9 7 4 |
Матрица Х 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1 Целевая функция = 12 |
|
28 |
Запуск методов Не реализованных прибылей (этап 1), Потенциалов (модули Ner_p1, Potenc_m) |
Матрица С 8 6 9 6 2 4 9 1 5 6 8 8 3 2 3 6 |
Матрица Х 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 Целевая функция = 15 |
|
29 |
Запуск методов Наименьшей стоимости, Не реализованных прибылей (этап 2), Потенциалов (модули N_st, Ner_p2, Potenc_m) |
Матрица С 8 6 9 6 2 4 9 1 5 6 8 8 3 2 3 6 |
Матрица Х 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 Целевая функция = 15 |
|
30 |
Запуск методов Фогеля, Не реализованных прибылей (этап 2) (модули Fogel, Ner_p2) |
Матрица С 3 7 2 5 6 0 7 6 0 7 0 6 8 9 6 7 |
Матрица Х 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 Целевая функция = 9 |
|
31 |
Запуск методов Фогеля, Не реализованных прибылей (этап 2), Потенциалов (модули Fogel, Ner_p2, Potenc_m) |
Матрица С 3 7 2 5 6 0 7 6 0 7 0 6 8 9 6 7 |
Матрица Х 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 Целевая функция = 9 |
|
32 |
Запуск методов Не реализованных прибылей (этап 1), Не реализованных прибылей (этап 2) (модули Ner_p1, Ner_p2) |
Матрица С 6 9 2 6 7 4 9 2 1 1 2 8 5 2 7 7 |
Матрица Х 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 Целевая функция = 7 |
|
33 |
Запуск методов Не реализованных прибылей (этап 1), Не реализованных прибылей (этап 2), Не реализованных прибылей (этап 3) (модули Ner_p1, Ner_p2, Ner_p3) |
Матрица С 6 9 2 6 7 4 9 2 1 1 2 8 5 2 7 7 |
Матрица Х 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 Целевая функция = 7 |
|
34 |
Запуск методов Наименьшей стоимости, Не реализованных прибылей (этап 2), Не реализованных прибылей (этап 3) (модули N_st, Ner_p2, Ner_p3) |
Матрица С 4 5 5 4 7 8 9 7 0 0 4 7 8 7 8 9 |
Матрица Х 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 Целевая функция = 19 |
|
35 |
Запуск методов Фогеля, Не реализованных прибылей (этап 2), Не реализованных прибылей (этап 3) (модули Fogel, Ner_p2, Ner_p3) |
Матрица С 4 5 5 4 7 8 9 7 0 0 4 7 8 7 8 9 |
Матрица Х 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 Целевая функция = 19 |
|
36 |
Запуск методов Не реализованных прибылей (этап 1), Не реализованных прибылей (этап 2), Потенциалов (модули Ner_p1, Ner_p2, Potenc_m) |
Матрица С 7 1 0 9 1 8 7 1 0 9 2 7 7 6 8 9 |
Матрица Х 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 Целевая функция = 1 |
CПИСОК ЛИТЕРАТУРЫ
1. Зайченко Ю.П. Исследование операций. Киев: Вища школа, 1979.
2. Кузнецов А.В., Сакович В.А., Холод Н.И. ”Высшая математика. Математическое программирование ”, Минск, Вышейшая школа, 2001г.
3. Таха Х. Введение в исследование операций. М.: Мир, 1985.
4. Акулич И.Л. Математическое программирование в примерах и задачах. М.: Высшая школа, 1986.
5. Эддоус М., Стенсфилд Р. Методы принятия решений. М.: Аудит, ЮНИТИ, 1997.
6. Боборыкин В.А. Математические методы решения транспортных задач. Л.: СЗПИ, 1986
7. Бурлак Г.Н. Безопасность работы на компьютере: Организация труда на предприятиях информационного обслуживания: Учеб. пособие. - М.: Финансы и статистика, 1998.
8. Лапшин Г.М. Организация и планирование вычислительных центров в машиностроении. М.: Машиностроение, 1990.
9. Охрана труда в вычислительных центрах. - М.: Машиностроение, 1990.
ПРИЛОЖЕНИЕ 1
Текст программы
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include 'M1.h'
#include 'S_z.h'
#include 'N_st.h'
#include 'Fogel.h'
#include 'Potenc_m.h'
#include 'Venger_m.h'
#include 'Ner_p1.h'
#include 'Ner_p2.h'
#include 'Ner_p3.h'
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource '*.dfm'
TForm1 *Form1;
TDateTime tim;
unsigned short h,mi,ss,ms,ss2,ms2;
int tm;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
int s_zy(int *, int *, int nn);
int nai_st(int *, int *, int nn);
int fogel_m(int *, int *, int nn);
int potenc(int *, int *, int nn);
int venger(int *, int *, int nn);
int ner_pr1(int *, int *, int nn);
int ner_pr2(int *, int *, int nn);
int ner_pr3(int *, int *, int nn);
void __fastcall TForm1::Button1Click(TObject *Sender)
{
const n=SG2->ColCount;
int sum;
int *mas2=new int [(n+1)*(n+1)];
int *mas3=new int [n*n];
Button8->Enabled=true;
Button4->Enabled=true;
//очистка матриц
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
{
if((i<n-1)&&(j<n-1))
{
SG3->Cells[i][j]=0;
}
else
SG2->Cells[i][j]=1;
if((i==n-1)&&(j==n-1))
SG2->Cells[i][j]='';
}
//запись в массив
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
{
if((i!=n-1)||(j!=n-1))
mas2[i*n+j]=StrToInt(SG2->Cells[i][j]);
}
//запись в массив
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
mas3[i*n+j]=StrToInt(SG3->Cells[i][j]);
}
//
tim= Time();
DecodeTime(tim,h,mi,ss,ms);
s_zy(mas2,mas3,n);
tim= Time();
DecodeTime(tim,h,mi,ss2,ms2);
if(ss2<ss)
ss2=ss2+60;
tm=ss2-ss;
tm=tm*1000;
tm=tm+ms2-ms;
tm=abs(tm);
Label2->Caption=IntToStr(tm);
Label3->Caption=IntToStr(ss)+' '+IntToStr(ms);
Label4->Caption=IntToStr(ss2)+' '+IntToStr(ms2);
//запись из массива
// for (int i=0; i<n; i++)
// for (int j=0; j<n; j++)
// {
// if((i!=n-1)||(j!=n-1))
// SG2->Cells[i][j]=mas2[i*n+j];
// }
//запись из массива
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
SG3->Cells[i][j]=mas3[i*n+j];
}
//результат
sum=0;
int ex=0;
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
if(SG3->Cells[i][j]=='1')
{
ex++;
sum=sum+StrToInt(SG2->Cells[i][j]);
}
}
Label1->Caption='С-З= '+IntToStr(sum)+' Элем= '+IntToStr(ex);
delete [] mas2;
mas2=NULL;
delete [] mas3;
mas3=NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RandomClick(TObject *Sender)
{
const n=SG2->ColCount;
Button8->Enabled=false;
Button4->Enabled=false;
Button10->Enabled=false;
//randomize();
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
{
if((i<n-1)&&(j<n-1))
{
SG2->Cells[i][j]=IntToStr(random(StrToInt(Edit2->Text)));
SG3->Cells[i][j]=0;
}
else
SG2->Cells[i][j]=1;
if((i==n-1)&&(j==n-1))
SG2->Cells[i][j]='';
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
const n=SG2->ColCount;
int sum;
int *mas2=new int [(n+1)*(n+1)];
int *mas3=new int [n*n];
Button8->Enabled=true;
Button4->Enabled=true;
//очистка матриц
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
{
if((i<n-1)&&(j<n-1))
{
SG3->Cells[i][j]=0;
}
else
SG2->Cells[i][j]=1;
if((i==n-1)&&(j==n-1))
SG2->Cells[i][j]='';
}
//запись в массив
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
{
if((i!=n-1)||(j!=n-1))
mas2[i*n+j]=StrToInt(SG2->Cells[i][j]);
}
//запись в массив
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
mas3[i*n+j]=StrToInt(SG3->Cells[i][j]);
}
//
tim= Time();
DecodeTime(tim,h,mi,ss,ms);
nai_st(mas2,mas3,n);
tim= Time();
DecodeTime(tim,h,mi,ss2,ms2);
if(ss2<ss)
ss2=ss2+60;
tm=ss2-ss;
tm=tm*1000;
tm=tm+ms2-ms;
tm=abs(tm);
Label2->Caption=IntToStr(tm);
Label3->Caption=IntToStr(ss)+' '+IntToStr(ms);
Label4->Caption=IntToStr(ss2)+' '+IntToStr(ms2);
//запись из массива
// for (int i=0; i<n; i++)
// for (int j=0; j<n; j++)
// {
// if((i!=n-1)||(j!=n-1))
// SG2->Cells[i][j]=mas2[i*n+j];
// }
//запись из массива
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
SG3->Cells[i][j]=mas3[i*n+j];
}
//результат
sum=0;
int ex=0;
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
if(SG3->Cells[i][j]=='1')
{
ex++;
sum=sum+StrToInt(SG2->Cells[i][j]);
}
}
Label1->Caption='Наим. ст.= '+IntToStr(sum)+' Элем= '+IntToStr(ex);
delete [] mas2;
mas2=NULL;
delete [] mas3;
mas3=NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
const n=SG2->ColCount;
int sum,t,shtr;
int *mas2=new int [(n+2)*(n+2)];
int *mas3=new int [n*n];
Button8->Enabled=true;
Button4->Enabled=true;
//int tm;
//очистка матриц
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
{
if((i<n-1)&&(j<n-1))
{
SG3->Cells[i][j]=0;
}
else
SG2->Cells[i][j]=1;
if((i==n-1)&&(j==n-1))
SG2->Cells[i][j]='';
}
//SG2->ColCount=n+1;
//SG2->RowCount=n+1;
//запись в массив
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
{
if((i!=n-1)||(j!=n-1))
mas2[i*(n+1)+j]=StrToInt(SG2->Cells[i][j]);
}
//запись в массив
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
mas3[i*n+j]=StrToInt(SG3->Cells[i][j]);
}
//
tim= Time();
DecodeTime(tim,h,mi,ss,ms);
fogel_m(mas2,mas3,n);
tim= Time();
DecodeTime(tim,h,mi,ss2,ms2);
if(ss2<ss)
ss2=ss2+60;
tm=ss2-ss;
tm=tm*1000;
tm=tm+ms2-ms;
tm=abs(tm);
Label2->Caption=IntToStr(tm);
Label3->Caption=IntToStr(ss)+' '+IntToStr(ms);
Label4->Caption=IntToStr(ss2)+' '+IntToStr(ms2);
//запись из массива
// for (int i=0; i<n; i++)
// for (int j=0; j<n; j++)
// {
// if((i!=n-1)||(j!=n-1))
// SG2->Cells[i][j]=mas2[i*(n+1)+j];
// }
//запись из массива
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
SG3->Cells[i][j]=mas3[i*n+j];
}
//результат
sum=0;
int ex=0;
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
if(SG3->Cells[i][j]=='1')
{
ex++;
sum=sum+StrToInt(SG2->Cells[i][j]);
}
}
Label1->Caption='Фогель= '+IntToStr(sum)+' Элем= '+IntToStr(ex);
//SG2->ColCount=n;
//SG2->RowCount=n;
delete [] mas2;
mas2=NULL;
delete [] mas3;
mas3=NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
SG2->ColCount=StrToInt(Edit1->Text)+1;
SG2->RowCount=StrToInt(Edit1->Text)+1;
SG3->ColCount=StrToInt(Edit1->Text);
SG3->RowCount=StrToInt(Edit1->Text);
Form1->RandomClick(Sender);
//SG2->DefaultColWidth=63-StrToInt(Edit1->Text);
//SG2->DefaultRowHeight=63-StrToInt(Edit1->Text);
//SG3->DefaultColWidth=63-StrToInt(Edit1->Text);
//SG3->DefaultRowHeight=63-StrToInt(Edit1->Text);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormActivate(TObject *Sender)
{
Form1->RandomClick(Sender);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
const n=SG2->ColCount;
int sum;
int *mas2=new int [(n+1)*(n+1)];
int *mas3=new int [n*n];
//очистка матриц
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
{
if((i<n-1)&&(j<n-1))
{
}
else
SG2->Cells[i][j]=1;
if((i==n-1)&&(j==n-1))
SG2->Cells[i][j]='';
}
//запись в массив
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
{
if((i!=n-1)||(j!=n-1))
mas2[i*n+j]=StrToInt(SG2->Cells[i][j]);
}
//запись в массив
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
mas3[i*n+j]=StrToInt(SG3->Cells[i][j]);
if((i==n-2)&&(mas3[i*n+j]!=1))
mas3[i*n+j]=2;
}
//
tim= Time();
DecodeTime(tim,h,mi,ss,ms);
potenc(mas2,mas3,n);
tim= Time();
DecodeTime(tim,h,mi,ss2,ms2);
if(ss2<ss)
ss2=ss2+60;
tm=ss2-ss;
tm=tm*1000;
tm=tm+ms2-ms;
tm=abs(tm);
Label2->Caption=IntToStr(tm);
Label3->Caption=IntToStr(ss)+' '+IntToStr(ms);
Label4->Caption=IntToStr(ss2)+' '+IntToStr(ms2);
//запись из массива
// for (int i=0; i<n; i++)
// for (int j=0; j<n; j++)
// {
// if((i!=n-1)||(j!=n-1))
// SG2->Cells[i][j]=mas2[i*n+j];
// }
//запись из массива
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
SG3->Cells[i][j]=mas3[i*n+j];
if(mas3[i*n+j]==2)
SG3->Cells[i][j]=0;
}//результат
sum=0;
int ex=0;
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
if(SG3->Cells[i][j]=='1')
{
ex++;
sum=sum+StrToInt(SG2->Cells[i][j]);
}
}
Label1->Caption='Потенц= '+IntToStr(sum)+' Элем= '+IntToStr(ex);
delete [] mas2;
mas2=NULL;
delete [] mas3;
mas3=NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
const n=SG2->ColCount;
int sum;
int *mas2=new int [(n+1)*(n+1)];
int *mas3=new int [n*n];
Button8->Enabled=true;
Button4->Enabled=true;
//очистка матриц
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
{
if((i<n-1)&&(j<n-1))
{
SG3->Cells[i][j]=0;
}
else
SG2->Cells[i][j]=1;
if((i==n-1)&&(j==n-1))
SG2->Cells[i][j]='';
}
//запись в массив
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
{
if((i!=n-1)||(j!=n-1))
mas2[i*n+j]=StrToInt(SG2->Cells[i][j]);
}
//запись в массив
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
mas3[i*n+j]=StrToInt(SG3->Cells[i][j]);
}
//
tim= Time();
DecodeTime(tim,h,mi,ss,ms);
venger(mas2,mas3,n);
tim= Time();
DecodeTime(tim,h,mi,ss2,ms2);
if(ss2<ss)
ss2=ss2+60;
tm=ss2-ss;
tm=tm*1000;
tm=tm+ms2-ms;
tm=abs(tm);
Label2->Caption=IntToStr(tm);
Label3->Caption=IntToStr(ss)+' '+IntToStr(ms);
Label4->Caption=IntToStr(ss2)+' '+IntToStr(ms2);
//запись из массива
// for (int i=0; i<n; i++)
// for (int j=0; j<n; j++)
// {
// if((i!=n-1)||(j!=n-1))
// SG2->Cells[i][j]=mas2[i*n+j];
// }
//запись из массива
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
SG3->Cells[i][j]=mas3[i*n+j];
}
//результат
sum=0;
int ex=0;
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
if(SG3->Cells[i][j]=='1')
{
ex++;
sum=sum+StrToInt(SG2->Cells[i][j]);
}
}
Label1->Caption='Венгерский= '+IntToStr(sum)+' Элем= '+IntToStr(ex);
delete [] mas2;
mas2=NULL;
delete [] mas3;
mas3=NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
int xn,yn,n,hh,xh,yh,tc;
float mast;
tc=StrToInt(Edit11->Text);
mast=StrToFloat(Edit5->Text);
n=StrToInt(Edit3->Text)-3;
hh=StrToInt(Edit4->Text);
xh=0;
xn=Image1->Width;
yn=Image1->Height;
Image1->Canvas->Pen->Width=1;
Image1->Canvas->Pen->Color=clBlue;
Image1->Canvas->Rectangle(0,0,xn,yn);
for(int i=1;i<=xn/hh;i++)
{
Image1->Canvas->MoveTo(hh*i,yn);
Image1->Canvas->LineTo(hh*i,0);
}
for(int i=1;i<=yn/hh;i++)
{
Image1->Canvas->MoveTo(0,hh*i);
Image1->Canvas->LineTo(xn,hh*i);
}
for(int i=1;i<=10;i++)
{
int ms;
ms=((i*(n+3)/10)); // /(mast/100)
Image1->Canvas->TextOut(i*xn/10,yn/2,ms);
}
for(int i=1;i<=10;i++)
{
int ms;
ms=((i*yn/10)/(mast/100));
if(i!=5)
Image1->Canvas->TextOut(hh,yn-i*yn/10,ms);
}
//Label26->Caption=ms;
Image1->Canvas->Pen->Width=2;
Image1->Canvas->Pen->Color=clGreen;
Image1->Canvas->MoveTo(0,yn/2);
Image1->Canvas->LineTo(xn,yn/2);
Image1->Canvas->Pen->Width=3;
Image1->Canvas->Pen->Color=clGray;
Image1->Canvas->MoveTo(xh,yn);
Label12->Caption=1;
int d;
d=(n+3)%10;
if (d>4) d=(n+3)/10;
else d=0;
for(int i=0;i<=(n+3)-d;i=i+(n+3)/10)
{
Label5->Caption=StrToInt(i);
Form1->Edit1->Text=i;
Form1->Edit1Change(Sender);
int tmm=0;
if((CheckBox1->Checked==true)&&(CheckBox6->Checked==false)&&(CheckBox7->Checked==false)) //С-З
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button1Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox2->Checked==true)&&(CheckBox6->Checked==false)&&(CheckBox7->Checked==false)) //Наимен
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button2Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox3->Checked==true)&&(CheckBox6->Checked==false)&&(CheckBox7->Checked==false)) //Фогель
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button3Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox4->Checked==true)&&(CheckBox6->Checked==false)&&(CheckBox7->Checked==false)) //Нерез(1)
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button7Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox5->Checked==true)&&(CheckBox6->Checked==false)&&(CheckBox7->Checked==false)) //Венгерск
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button5Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm/tc+i/2+tmm/tc;
//tm=tmm;
}
if((CheckBox1->Checked==true)&&(CheckBox6->Checked==true)) //С-З - Патенц
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button1Click(Sender);
tmm=tmm+tm;
Form1->Button4Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox2->Checked==true)&&(CheckBox6->Checked==true)) //Наимен - Патенц
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button2Click(Sender);
tmm=tmm+tm;
Form1->Button4Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox3->Checked==true)&&(CheckBox6->Checked==true)) //Фогель - Патенц
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button3Click(Sender);
tmm=tmm+tm;
Form1->Button4Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox4->Checked==true)&&(CheckBox6->Checked==true)) //Нерез(1) - Патенц
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button7Click(Sender);
tmm=tmm+tm;
Form1->Button4Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox1->Checked==true)&&(CheckBox7->Checked==true)&&(CheckBox8->Checked==false)) //С-З - Нер(2)
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button1Click(Sender);
tmm=tmm+tm;
Form1->Button8Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox2->Checked==true)&&(CheckBox7->Checked==true)&&(CheckBox8->Checked==false)) //Наимен - Нер(2)
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button2Click(Sender);
tmm=tmm+tm;
Form1->Button8Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox3->Checked==true)&&(CheckBox7->Checked==true)&&(CheckBox8->Checked==false)) //Фогель - Нер(2)
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button3Click(Sender);
tmm=tmm+tm;
Form1->Button8Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox4->Checked==true)&&(CheckBox7->Checked==true)&&(CheckBox8->Checked==false)) //Нер(1) - Нер(2)
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button7Click(Sender);
tmm=tmm+tm;
Form1->Button8Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox4->Checked==true)&&(CheckBox7->Checked==true)&&(CheckBox8->Checked==true)) //Нер(1) - Нер(2) - Патенц
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button7Click(Sender);
tmm=tmm+tm;
Form1->Button8Click(Sender);
tmm=tmm+tm;
Form1->Button4Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox1->Checked==true)&&(CheckBox7->Checked==true)&&(CheckBox8->Checked==true)) //С-З - Нер(2) - Патенц
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button1Click(Sender);
tmm=tmm+tm;
Form1->Button8Click(Sender);
tmm=tmm+tm;
Form1->Button4Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox2->Checked==true)&&(CheckBox7->Checked==true)&&(CheckBox8->Checked==true)) //Наимен - Нер(2) - Патенц
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button2Click(Sender);
tmm=tmm+tm;
Form1->Button8Click(Sender);
tmm=tmm+tm;
Form1->Button4Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox3->Checked==true)&&(CheckBox7->Checked==true)&&(CheckBox8->Checked==true)) //Фогель - Нер(2) - Патенц
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button3Click(Sender);
tmm=tmm+tm;
Form1->Button8Click(Sender);
tmm=tmm+tm;
Form1->Button4Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
//
if((CheckBox4->Checked==true)&&(CheckBox7->Checked==true)&&(CheckBox9->Checked==true)) //Нер(1) - Нер(2) - Нер(3)
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button7Click(Sender);
tmm=tmm+tm;
Form1->Button8Click(Sender);
tmm=tmm+tm;
Form1->Button10Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox1->Checked==true)&&(CheckBox7->Checked==true)&&(CheckBox9->Checked==true)) //С-З - Нер(2) - Нер(3)
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button1Click(Sender);
tmm=tmm+tm;
Form1->Button8Click(Sender);
tmm=tmm+tm;
Form1->Button10Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox2->Checked==true)&&(CheckBox7->Checked==true)&&(CheckBox9->Checked==true)) //Наимен - Нер(2) - Нер(3)
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button2Click(Sender);
tmm=tmm+tm;
Form1->Button8Click(Sender);
tmm=tmm+tm;
Form1->Button10Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox3->Checked==true)&&(CheckBox7->Checked==true)&&(CheckBox9->Checked==true)) //Фогель - Нер(2) - Нер(3)
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button3Click(Sender);
tmm=tmm+tm;
Form1->Button8Click(Sender);
tmm=tmm+tm;
Form1->Button10Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
Image1->Canvas->LineTo(xh,yn-(tm*(mast/100))); //*(mast/100)
xh=xh+xn/10;
if((yn-(tm*(mast/100)))<0)
i=n+3;
Refresh();
}
Image1->Canvas->TextOut((xh-xn/10+hh),yn-hh-(tm*(mast/100)),IntToStr(tm));//*(mast/100)
Label5->Caption='OK';
Button9->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button7Click(TObject *Sender)
{
const n=SG2->ColCount;
int sum;
int *mas2=new int [(n+1)*(n+1)];
int *mas3=new int [n*n];
Button8->Enabled=true;
Button4->Enabled=true;
//очистка матриц
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
{
if((i<n-1)&&(j<n-1))
{
SG3->Cells[i][j]=0;
}
else
SG2->Cells[i][j]=1;
if((i==n-1)&&(j==n-1))
SG2->Cells[i][j]='';
}
//запись в массив
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
{
if((i!=n-1)||(j!=n-1))
mas2[i*n+j]=StrToInt(SG2->Cells[i][j]);
}
//запись в массив
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
mas3[i*n+j]=StrToInt(SG3->Cells[i][j]);
}
//
tim= Time();
DecodeTime(tim,h,mi,ss,ms);
ner_pr1(mas2,mas3,n);
tim= Time();
DecodeTime(tim,h,mi,ss2,ms2);
if(ss2<ss)
ss2=ss2+60;
tm=ss2-ss;
tm=tm*1000;
tm=tm+ms2-ms;
tm=abs(tm);
Label2->Caption=IntToStr(tm);
Label3->Caption=IntToStr(ss)+' '+IntToStr(ms);
Label4->Caption=IntToStr(ss2)+' '+IntToStr(ms2);
//запись из массива
// for (int i=0; i<n; i++)
// for (int j=0; j<n; j++)
// {
// if((i!=n-1)||(j!=n-1))
// SG2->Cells[i][j]=mas2[i*n+j];
// }
//запись из массива
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
SG3->Cells[i][j]=mas3[i*n+j];
}
//результат
sum=0;
int ex=0;
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
if(SG3->Cells[i][j]=='1')
{
ex++;
sum=sum+StrToInt(SG2->Cells[i][j]);
}
}
Label1->Caption='Нере. приб.(1)= '+IntToStr(sum)+' Элем= '+IntToStr(ex);
delete [] mas2;
mas2=NULL;
delete [] mas3;
mas3=NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button8Click(TObject *Sender)
{
const n=SG2->ColCount;
int sum;
int *mas2=new int [(n+1)*(n+1)];
int *mas3=new int [n*n];
Button10->Enabled=true;
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
{
if((i<n-1)&&(j<n-1))
{
}
else
SG2->Cells[i][j]=1;
if((i==n-1)&&(j==n-1))
SG2->Cells[i][j]='';
}
//запись в массив
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
{
if((i!=n-1)||(j!=n-1))
mas2[i*n+j]=StrToInt(SG2->Cells[i][j]);
}
//запись в массив
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
mas3[i*n+j]=StrToInt(SG3->Cells[i][j]);
if((i==n-2)&&(mas3[i*n+j]!=1))
mas3[i*n+j]=2;
}
//
tim= Time();
DecodeTime(tim,h,mi,ss,ms);
ner_pr2(mas2,mas3,n);
tim= Time();
DecodeTime(tim,h,mi,ss2,ms2);
if(ss2<ss)
ss2=ss2+60;
tm=ss2-ss;
tm=tm*1000;
tm=tm+ms2-ms;
tm=abs(tm);
Label2->Caption=IntToStr(tm);
Label3->Caption=IntToStr(ss)+' '+IntToStr(ms);
Label4->Caption=IntToStr(ss2)+' '+IntToStr(ms2);
//запись из массива
// for (int i=0; i<n; i++)
// for (int j=0; j<n; j++)
// {
// if((i!=n-1)||(j!=n-1))
// SG2->Cells[i][j]=mas2[i*n+j];
// }
//запись из массива
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
SG3->Cells[i][j]=mas3[i*n+j];
if(mas3[i*n+j]==2)
SG3->Cells[i][j]=0;
}
//результат
sum=0;
int ex=0;
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
if(SG3->Cells[i][j]=='1')
{
ex++;
sum=sum+StrToInt(SG2->Cells[i][j]);
}
}
Label1->Caption='Нрп2= '+IntToStr(sum)+' Элем= '+IntToStr(ex);
delete [] mas2;
mas2=NULL;
delete [] mas3;
mas3=NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckBox1Click(TObject *Sender)
{
if(CheckBox1->Checked==true)
{
ComboBox2->Clear();
ComboBox3->Clear();
ComboBox2->AddItem('Метод Потенциалов',ComboBox2);
ComboBox2->AddItem('Метод Нереальз приб(2)',ComboBox2);
}
if(CheckBox1->Checked==true)
{
CheckBox2->Checked=false;
CheckBox3->Checked=false;
CheckBox4->Checked=false;
CheckBox5->Checked=false;
CheckBox6->Checked=false;
CheckBox7->Checked=false;
CheckBox8->Checked=false;
CheckBox9->Checked=false;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckBox2Click(TObject *Sender)
{
if(CheckBox2->Checked==true)
{
ComboBox2->Clear();
ComboBox3->Clear();
ComboBox2->AddItem('Метод Потенциалов',ComboBox2);
ComboBox2->AddItem('Метод Нереальз приб(2)',ComboBox2);
}
if(CheckBox2->Checked==true)
{
CheckBox1->Checked=false;
CheckBox3->Checked=false;
CheckBox4->Checked=false;
CheckBox5->Checked=false;
CheckBox6->Checked=false;
CheckBox7->Checked=false;
CheckBox8->Checked=false;
CheckBox9->Checked=false;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckBox3Click(TObject *Sender)
{
if(CheckBox3->Checked==true)
{
ComboBox2->Clear();
ComboBox3->Clear();
ComboBox2->AddItem('Метод Потенциалов',ComboBox2);
ComboBox2->AddItem('Метод Нереальз приб(2)',ComboBox2);
}
if(CheckBox3->Checked==true)
{
CheckBox2->Checked=false;
CheckBox1->Checked=false;
CheckBox4->Checked=false;
CheckBox5->Checked=false;
CheckBox6->Checked=false;
CheckBox7->Checked=false;
CheckBox8->Checked=false;
CheckBox9->Checked=false;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckBox4Click(TObject *Sender)
{
if(CheckBox4->Checked==true)
{
ComboBox2->Clear();
ComboBox3->Clear();
ComboBox2->AddItem('Метод Потенциалов',ComboBox2);
ComboBox2->AddItem('Метод Нереальз приб(2)',ComboBox2);
}
if(CheckBox4->Checked==true)
{
CheckBox2->Checked=false;
CheckBox3->Checked=false;
CheckBox1->Checked=false;
CheckBox5->Checked=false;
CheckBox6->Checked=false;
CheckBox7->Checked=false;
CheckBox8->Checked=false;
CheckBox9->Checked=false;
}
}
//--------------------------------------------------------------------------
void __fastcall TForm1::CheckBox5Click(TObject *Sender)
{
ComboBox2->Clear();
ComboBox3->Clear();
if(CheckBox5->Checked==false)
{
ComboBox2->Clear();
ComboBox3->Clear();
ComboBox2->AddItem('Метод Потенциалов',ComboBox2);
ComboBox2->AddItem('Метод Нереальз приб(2)',ComboBox2);
}
if(CheckBox5->Checked==true)
{
CheckBox2->Checked=false;
CheckBox3->Checked=false;
CheckBox4->Checked=false;
CheckBox1->Checked=false;
CheckBox6->Checked=false;
CheckBox7->Checked=false;
CheckBox8->Checked=false;
CheckBox9->Checked=false;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
if(ComboBox1->ItemIndex==0)
CheckBox1->Checked=true;
if(ComboBox1->ItemIndex==1)
CheckBox2->Checked=true;
if(ComboBox1->ItemIndex==2)
CheckBox3->Checked=true;
if(ComboBox1->ItemIndex==3)
CheckBox4->Checked=true;
if(ComboBox1->ItemIndex==4)
CheckBox5->Checked=true;
Button6->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox2Change(TObject *Sender)
{
if(ComboBox2->ItemIndex==0)
CheckBox6->Checked=true;
if(ComboBox2->ItemIndex==1)
CheckBox7->Checked=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckBox6Click(TObject *Sender)
{
//ComboBox3->Clear();
//CheckBox8->Checked=false;
if(CheckBox6->Checked==true)
{
CheckBox7->Checked=false;
CheckBox8->Checked=false;
CheckBox9->Checked=false;
ComboBox3->Clear();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckBox7Click(TObject *Sender)
{
ComboBox3->Clear();
ComboBox3->AddItem('Метод Потенциалов',ComboBox2);
ComboBox3->AddItem('Метод Не реализ приб(3)',ComboBox2);
if(CheckBox7->Checked==true)
{
CheckBox6->Checked=false;
CheckBox8->Checked=false;
CheckBox9->Checked=false;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox3Change(TObject *Sender)
{
if(ComboBox3->ItemIndex==0)
CheckBox8->Checked=true;
if(ComboBox3->ItemIndex==1)
CheckBox9->Checked=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckBox8Click(TObject *Sender)
{
if(CheckBox8->Checked==true)
{
CheckBox9->Checked=false;
//ComboBox3->Clear();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button9Click(TObject *Sender)
{
int xn,yn,n,hh,xh,yh,tc;
float mast;
tc=StrToInt(Edit11->Text);
mast=StrToFloat(Edit5->Text);
n=StrToInt(Edit3->Text)-3;
hh=StrToInt(Edit4->Text);
xh=0;
xn=Image1->Width;
yn=Image1->Height;
Image1->Canvas->Pen->Width=3;
Image1->Canvas->MoveTo(xh,yn);
switch(StrToInt(Label12->Caption))
{
case 1: {Image1->Canvas->Pen->Color=clBlack;Label12->Caption=2;}break;
case 2: {Image1->Canvas->Pen->Color=clGreen;Label12->Caption=3;}break;
case 3: {Image1->Canvas->Pen->Color=clWhite;Label12->Caption=4;}break;
case 4: {Image1->Canvas->Pen->Color=clRed;Label12->Caption=5;}break;
case 5: {Image1->Canvas->Pen->Color=clBlue;Label12->Caption=6;}break;
case 6: {Image1->Canvas->Pen->Color=clMoneyGreen;Label12->Caption=7;}break;
case 7: {Image1->Canvas->Pen->Color=clYellow;Label12->Caption=8;}break;
case 8: {Image1->Canvas->Pen->Color=clGray;Label12->Caption=1;}break;
}
int d;
d=(n+3)%10;
if (d>4) d=(n+3)/10;
else d=0;
for(int i=0;i<=(n+3)-d;i=i+(n+3)/10)
{
Label5->Caption=StrToInt(i);
Form1->Edit1->Text=i;
Form1->Edit1Change(Sender);
int tmm=0;
if((CheckBox1->Checked==true)&&(CheckBox6->Checked==false)&&(CheckBox7->Checked==false)) //С-З
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button1Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox2->Checked==true)&&(CheckBox6->Checked==false)&&(CheckBox7->Checked==false)) //Наимен
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button2Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox3->Checked==true)&&(CheckBox6->Checked==false)&&(CheckBox7->Checked==false)) //Фогель
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button3Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox4->Checked==true)&&(CheckBox6->Checked==false)&&(CheckBox7->Checked==false)) //Нерез(1)
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button7Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox5->Checked==true)&&(CheckBox6->Checked==false)&&(CheckBox7->Checked==false)) //Венгерск
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button5Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox1->Checked==true)&&(CheckBox6->Checked==true)) //С-З - Патенц
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button1Click(Sender);
tmm=tmm+tm;
Form1->Button4Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox2->Checked==true)&&(CheckBox6->Checked==true)) //Наимен - Патенц
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button2Click(Sender);
tmm=tmm+tm;
Form1->Button4Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox3->Checked==true)&&(CheckBox6->Checked==true)) //Фогель - Патенц
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button3Click(Sender);
tmm=tmm+tm;
Form1->Button4Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox4->Checked==true)&&(CheckBox6->Checked==true)) //Нерез(1) - Патенц
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button7Click(Sender);
tmm=tmm+tm;
Form1->Button4Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox1->Checked==true)&&(CheckBox7->Checked==true)&&(CheckBox8->Checked==false)) //С-З - Нер(2)
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button1Click(Sender);
tmm=tmm+tm;
Form1->Button8Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox2->Checked==true)&&(CheckBox7->Checked==true)&&(CheckBox8->Checked==false)) //Наимен - Нер(2)
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button2Click(Sender);
tmm=tmm+tm;
Form1->Button8Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox3->Checked==true)&&(CheckBox7->Checked==true)&&(CheckBox8->Checked==false)) //Фогель - Нер(2)
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button3Click(Sender);
tmm=tmm+tm;
Form1->Button8Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox4->Checked==true)&&(CheckBox7->Checked==true)&&(CheckBox8->Checked==false)) //Нер(1) - Нер(2)
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button7Click(Sender);
tmm=tmm+tm;
Form1->Button8Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox4->Checked==true)&&(CheckBox7->Checked==true)&&(CheckBox8->Checked==true)) //Нер(1) - Нер(2) - Патенц
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button7Click(Sender);
tmm=tmm+tm;
Form1->Button8Click(Sender);
tmm=tmm+tm;
Form1->Button4Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox1->Checked==true)&&(CheckBox7->Checked==true)&&(CheckBox8->Checked==true)) //С-З - Нер(2) - Патенц
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button1Click(Sender);
tmm=tmm+tm;
Form1->Button8Click(Sender);
tmm=tmm+tm;
Form1->Button4Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox2->Checked==true)&&(CheckBox7->Checked==true)&&(CheckBox8->Checked==true)) //Наимен - Нер(2) - Патенц
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button2Click(Sender);
tmm=tmm+tm;
Form1->Button8Click(Sender);
tmm=tmm+tm;
Form1->Button4Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox3->Checked==true)&&(CheckBox7->Checked==true)&&(CheckBox8->Checked==true)) //Фогель - Нер(2) - Патенц
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button3Click(Sender);
tmm=tmm+tm;
Form1->Button8Click(Sender);
tmm=tmm+tm;
Form1->Button4Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
//
if((CheckBox4->Checked==true)&&(CheckBox7->Checked==true)&&(CheckBox9->Checked==true)) //Нер(1) - Нер(2) - Нер(3)
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button7Click(Sender);
tmm=tmm+tm;
Form1->Button8Click(Sender);
tmm=tmm+tm;
Form1->Button10Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox1->Checked==true)&&(CheckBox7->Checked==true)&&(CheckBox9->Checked==true)) //С-З - Нер(2) - Нер(3)
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button1Click(Sender);
tmm=tmm+tm;
Form1->Button8Click(Sender);
tmm=tmm+tm;
Form1->Button10Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox2->Checked==true)&&(CheckBox7->Checked==true)&&(CheckBox9->Checked==true)) //Наимен - Нер(2) - Нер(3)
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button2Click(Sender);
tmm=tmm+tm;
Form1->Button8Click(Sender);
tmm=tmm+tm;
Form1->Button10Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
if((CheckBox3->Checked==true)&&(CheckBox7->Checked==true)&&(CheckBox9->Checked==true)) //Фогель - Нер(2) - Нер(3)
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button3Click(Sender);
tmm=tmm+tm;
Form1->Button8Click(Sender);
tmm=tmm+tm;
Form1->Button10Click(Sender);
tmm=tmm+tm;
}
tm=tmm/tc;
//tm=tmm;
}
Image1->Canvas->LineTo(xh,yn-(tm*(mast/100))); //*(mast/100)
xh=xh+xn/10;
if((yn-(tm*(mast/100)))<0)
i=n+3;
Refresh();
}
Image1->Canvas->TextOut((xh-xn/10+hh),yn-hh-(tm*(mast/100)),IntToStr(tm)); //*(mast/100)
Label5->Caption='OK';
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit5Change(TObject *Sender)
{
Button12->Enabled=false;
Button9->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit3Change(TObject *Sender)
{
Button12->Enabled=false;
Button9->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit6Change(TObject *Sender)
{
SG2->DefaultColWidth=StrToInt(Edit6->Text);
//SG2->DefaultRowHeight=StrToInt(Edit6->Text);
//SG3->DefaultColWidth=StrToInt(Edit6->Text);
//SG3->DefaultRowHeight=StrToInt(Edit6->Text);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit4Change(TObject *Sender)
{
Button12->Enabled=false;
Button9->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button10Click(TObject *Sender)
{
const n=SG2->ColCount;
int sum;
int *mas2=new int [(n+1)*(n+1)];
int *mas3=new int [n*n];
//TDateTime tim;
//unsigned short h,mi,ss,ms,ss2,ms2;
//int tm;
//очистка матриц
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
{
if((i<n-1)&&(j<n-1))
{
}
else
SG2->Cells[i][j]=1;
if((i==n-1)&&(j==n-1))
SG2->Cells[i][j]='';
}
//запись в массив
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
{
if((i!=n-1)||(j!=n-1))
mas2[i*n+j]=StrToInt(SG2->Cells[i][j]);
}
//запись в массив
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
mas3[i*n+j]=StrToInt(SG3->Cells[i][j]);
if((i==n-2)&&(mas3[i*n+j]!=1))
mas3[i*n+j]=0;
}
//
tim= Time();
DecodeTime(tim,h,mi,ss,ms);
ner_pr3(mas2,mas3,n);
tim= Time();
DecodeTime(tim,h,mi,ss2,ms2);
if(ss2<ss)
ss2=ss2+60;
tm=ss2-ss;
tm=tm*1000;
tm=tm+ms2-ms;
tm=abs(tm);
Label2->Caption=IntToStr(tm);
Label3->Caption=IntToStr(ss)+' '+IntToStr(ms);
Label4->Caption=IntToStr(ss2)+' '+IntToStr(ms2);
//запись из массива
// for (int i=0; i<n; i++)
// for (int j=0; j<n; j++)
// {
// if((i!=n-1)||(j!=n-1))
// SG2->Cells[i][j]=mas2[i*n+j];
// }
//запись из массива
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
SG3->Cells[i][j]=mas3[i*n+j];
if(mas3[i*n+j]==2)
SG3->Cells[i][j]=0;
}
//результат
sum=0;
int ex=0;
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
if(SG3->Cells[i][j]=='1')
{
ex++;
sum=sum+StrToInt(SG2->Cells[i][j]);
}
}
Label1->Caption='Нрп3= '+IntToStr(sum)+' Элем= '+IntToStr(ex);
delete [] mas2;
mas2=NULL;
delete [] mas3;
mas3=NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckBox9Click(TObject *Sender)
{
if(CheckBox9->Checked==true)
{
CheckBox8->Checked=false;
//ComboBox3->Clear();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button11Click(TObject *Sender)
{
int xn,yn,n,hh,xh,yh,opt,tc;
float mast,opt_f;
mast=StrToFloat(Edit8->Text);
n=StrToInt(Edit9->Text)-3;
hh=StrToInt(Edit7->Text);
xh=0;
xn=Image2->Width;
yn=Image2->Height;
tc=StrToInt(Edit10->Text);
Image2->Canvas->Pen->Width=1;
Image2->Canvas->Pen->Color=clBlue;
Image2->Canvas->Rectangle(0,0,xn,yn);
for(int i=1;i<=xn/hh;i++)
{
Image2->Canvas->MoveTo(hh*i,yn);
Image2->Canvas->LineTo(hh*i,0);
}
for(int i=1;i<=yn/hh;i++)
{
Image2->Canvas->MoveTo(0,hh*i);
Image2->Canvas->LineTo(xn,hh*i);
}
for(int i=1;i<=10;i++)
{
int ms;
ms=((i*(n+3)/10)/(mast/100));
Image2->Canvas->TextOut(i*xn/10,yn/2,ms);
}
for(int i=1;i<=10;i++)
{
float ms;
ms=i; ///(mast/100)
if(i!=5)
Image2->Canvas->TextOut(hh,yn-i*yn/10,ms/10);
}
Image2->Canvas->Pen->Width=2;
Image2->Canvas->Pen->Color=clGreen;
Image2->Canvas->MoveTo(0,yn/2);
Image2->Canvas->LineTo(xn,yn/2);
Image2->Canvas->Pen->Width=3;
Image2->Canvas->Pen->Color=clGray;
Image2->Canvas->MoveTo(xh,yn);
Label19->Caption=1;
int d;
d=(n+3)%10;
if (d>4) d=(n+3)/10;
else d=0;
for(int i=0;i<=(n+3)-d;i=i+(n+3)/10)
{
Label18->Caption=StrToInt(i);
Form1->Edit1->Text=i;
Form1->Edit1Change(Sender);
//int tmm=0;
int *mas3_1=new int [i*i];
int *mas3_2=new int [i*i];
opt=0;
if((CheckBox10->Checked==true)&& (CheckBox14->Checked==false)) //С-З
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button1Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_1[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
Form1->Button4Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_2[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
//сравнение
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
if((mas3_1[ii*i+j]==mas3_2[ii*i+j])&&(mas3_1[ii*i+j]==1))
opt++;
}
}
if((CheckBox11->Checked==true)&& (CheckBox14->Checked==false)) //Наимен
{
//opt=0;
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button2Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_1[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
Form1->Button4Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_2[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
//сравнение
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
if((mas3_1[ii*i+j]==mas3_2[ii*i+j])&&(mas3_1[ii*i+j]==1))
opt++;
}
}
if((CheckBox12->Checked==true)&& (CheckBox14->Checked==false)) //Фогель
{
// opt=0;
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button3Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_1[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
Form1->Button4Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_2[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
//сравнение
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
if((mas3_1[ii*i+j]==mas3_2[ii*i+j])&&(mas3_1[ii*i+j]==1))
opt++;
}
}
if((CheckBox13->Checked==true)&& (CheckBox14->Checked==false)) //Нер(1)
{
// opt=0;
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button7Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_1[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
Form1->Button4Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_2[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
//сравнение
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
if((mas3_1[ii*i+j]==mas3_2[ii*i+j])&&(mas3_1[ii*i+j]==1))
opt++;
}
}if((CheckBox10->Checked==true)&& (CheckBox14->Checked==true)) //С-З - Нер(2)
{
//opt=0;
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button1Click(Sender);
Form1->Button8Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_1[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
Form1->Button4Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_2[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
//сравнение
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
if((mas3_1[ii*i+j]==mas3_2[ii*i+j])&&(mas3_1[ii*i+j]==1))
opt++;
}
}
if((CheckBox11->Checked==true)&& (CheckBox14->Checked==true)) //Наимен - Нер(2)
{
// opt=0;
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button2Click(Sender);
Form1->Button8Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_1[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
Form1->Button4Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_2[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
//сравнение
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
if((mas3_1[ii*i+j]==mas3_2[ii*i+j])&&(mas3_1[ii*i+j]==1))
opt++;
}
}
if((CheckBox12->Checked==true)&& (CheckBox14->Checked==true)) //Фогель - Нер(2)
{
// opt=0;
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button3Click(Sender);
Form1->Button8Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_1[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
Form1->Button4Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_2[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
//сравнение
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
if((mas3_1[ii*i+j]==mas3_2[ii*i+j])&&(mas3_1[ii*i+j]==1))
opt++;
}
}
if((CheckBox13->Checked==true)&& (CheckBox14->Checked==true)) //Нер(1) - Нер(2)
{
// opt=0;
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button7Click(Sender);
Form1->Button8Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_1[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
Form1->Button4Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_2[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
//сравнение
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
if((mas3_1[ii*i+j]==mas3_2[ii*i+j])&&(mas3_1[ii*i+j]==1))
opt++;
}
}
opt=opt/tc;
opt_f=opt;
opt_f=opt_f/i ;
delete [] mas3_1;
mas3_1=NULL;
delete [] mas3_2;
mas3_2=NULL;
if(i==0)
Image2->Canvas->MoveTo(0,yn);
else
Image2->Canvas->LineTo(xh*(mast/100),yn-(opt_f*yn)); //*(mast/100)
xh=xh+xn/10;
Refresh();
}
//int t;
//t=opt_f*1000;
Image2->Canvas->TextOut((xh-xn/10+hh)*(mast/100),yn-hh-(opt_f*yn),FloatToStr(opt_f));//*(mast/100)
Label18->Caption='OK';
Button12->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckBox10Click(TObject *Sender)
{
if(CheckBox10->Checked==true)
{
ComboBox5->Clear();
ComboBox5->AddItem('Метод Нереализ. приб(2)',ComboBox5);
}
if(CheckBox10->Checked==true)
{
CheckBox11->Checked=false;
CheckBox12->Checked=false;
CheckBox13->Checked=false;
CheckBox14->Checked=false;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox4Change(TObject *Sender)
{
if(ComboBox4->ItemIndex==0)
CheckBox10->Checked=true;
if(ComboBox4->ItemIndex==1)
CheckBox11->Checked=true;
if(ComboBox4->ItemIndex==2)
CheckBox12->Checked=true;
if(ComboBox4->ItemIndex==3)
CheckBox13->Checked=true;
Button11->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckBox11Click(TObject *Sender)
{
if(CheckBox11->Checked==true)
{
ComboBox5->Clear();
ComboBox5->AddItem('Метод Нереализ. приб(2)',ComboBox5);
}
if(CheckBox11->Checked==true)
{
CheckBox10->Checked=false;
CheckBox12->Checked=false;
CheckBox13->Checked=false;
CheckBox14->Checked=false;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckBox12Click(TObject *Sender)
{
if(CheckBox12->Checked==true)
{
ComboBox5->Clear();
ComboBox5->AddItem('Метод Нереализ. приб(2)',ComboBox5);
}
if(CheckBox12->Checked==true)
{
CheckBox11->Checked=false;
CheckBox10->Checked=false;
CheckBox13->Checked=false;
CheckBox14->Checked=false;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckBox13Click(TObject *Sender)
{
if(CheckBox13->Checked==true)
{
ComboBox5->Clear();
ComboBox5->AddItem('Метод Нереализ. приб(2)',ComboBox5);
}
if(CheckBox13->Checked==true)
{
CheckBox11->Checked=false;
CheckBox12->Checked=false;
CheckBox10->Checked=false;
CheckBox14->Checked=false;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox5Change(TObject *Sender)
{
if(ComboBox5->ItemIndex==0)
CheckBox14->Checked=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button12Click(TObject *Sender)
{
int xn,yn,n,hh,xh,yh,opt,tc;
float mast,opt_f;
mast=StrToFloat(Edit8->Text);
n=StrToInt(Edit9->Text)-3;
hh=StrToInt(Edit7->Text);
xh=0;
xn=Image2->Width;
yn=Image2->Height;
tc=StrToInt(Edit10->Text);
Image2->Canvas->Pen->Width=2;
Image2->Canvas->Pen->Color=clGreen;
Image2->Canvas->Pen->Width=3;
Image2->Canvas->Pen->Color=clRed;
Image2->Canvas->MoveTo(xh,yn);
switch(StrToInt(Label19->Caption))
{
case 1: {Image2->Canvas->Pen->Color=clBlack;Label19->Caption=2;}break;
case 2: {Image2->Canvas->Pen->Color=clGreen;Label19->Caption=3;}break;
case 3: {Image2->Canvas->Pen->Color=clWhite;Label19->Caption=4;}break;
case 4: {Image2->Canvas->Pen->Color=clYellow;Label19->Caption=5;}break;
case 5: {Image2->Canvas->Pen->Color=clBlue;Label19->Caption=6;}break;
case 6: {Image2->Canvas->Pen->Color=clMoneyGreen;Label19->Caption=7;}break;
case 7: {Image2->Canvas->Pen->Color=clRed;Label19->Caption=8;}break;
case 8: {Image2->Canvas->Pen->Color=clGray;Label19->Caption=1;}break;
}
int d;
d=(n+3)%10;
if (d>4) d=(n+3)/10;
else d=0;
for(int i=0;i<=(n+3)-d;i=i+(n+3)/10)
{
Label18->Caption=StrToInt(i);
Form1->Edit1->Text=i;
Form1->Edit1Change(Sender);
//int tmm=0;
int *mas3_1=new int [i*i];
int *mas3_2=new int [i*i];
opt=0;
if((CheckBox10->Checked==true)&& (CheckBox14->Checked==false)) //С-З
{
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button1Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_1[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
Form1->Button4Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_2[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
//сравнение
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
if((mas3_1[ii*i+j]==mas3_2[ii*i+j])&&(mas3_1[ii*i+j]==1))
opt++;
}
}
if((CheckBox11->Checked==true)&& (CheckBox14->Checked==false)) //Наимен
{
//opt=0;
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button2Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_1[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
Form1->Button4Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_2[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
//сравнение
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
if((mas3_1[ii*i+j]==mas3_2[ii*i+j])&&(mas3_1[ii*i+j]==1))
opt++;
}
}
if((CheckBox12->Checked==true)&& (CheckBox14->Checked==false)) //Фогель
{
// opt=0;
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button3Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_1[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
Form1->Button4Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_2[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
//сравнение
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
if((mas3_1[ii*i+j]==mas3_2[ii*i+j])&&(mas3_1[ii*i+j]==1))
opt++;
}
}
if((CheckBox13->Checked==true)&& (CheckBox14->Checked==false)) //Нер(1)
{
// opt=0;
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button7Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_1[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
Form1->Button4Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_2[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
//сравнение
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
if((mas3_1[ii*i+j]==mas3_2[ii*i+j])&&(mas3_1[ii*i+j]==1))
opt++;
}
}
if((CheckBox10->Checked==true)&& (CheckBox14->Checked==true)) //С-З - Нер(2)
{
//opt=0;
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button1Click(Sender);
Form1->Button8Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_1[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
Form1->Button4Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_2[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
//сравнение
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
if((mas3_1[ii*i+j]==mas3_2[ii*i+j])&&(mas3_1[ii*i+j]==1))
opt++;
}
if((CheckBox11->Checked==true)&& (CheckBox14->Checked==true)) //Наимен - Нер(2)
{
// opt=0;
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button2Click(Sender);
Form1->Button8Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_1[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
Form1->Button4Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_2[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
//сравнение
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
if((mas3_1[ii*i+j]==mas3_2[ii*i+j])&&(mas3_1[ii*i+j]==1))
opt++;
}
}
if((CheckBox12->Checked==true)&& (CheckBox14->Checked==true)) //Фогель - Нер(2)
{
// opt=0;
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button3Click(Sender);
Form1->Button8Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_1[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
Form1->Button4Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_2[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
//сравнение
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
if((mas3_1[ii*i+j]==mas3_2[ii*i+j])&&(mas3_1[ii*i+j]==1))
opt++;
}
if((CheckBox13->Checked==true)&& (CheckBox14->Checked==true)) //Нер(1) - Нер(2)
{
// opt=0;
for(int s=1;s<=tc;s++)
{
Form1->RandomClick(Sender);
Form1->Button7Click(Sender);
Form1->Button8Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_1[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
Form1->Button4Click(Sender);
//запись в массив
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
{
mas3_2[ii*i+j]=StrToInt(SG3->Cells[ii][j]);
}
//сравнение
for (int ii=0; ii<i-1; ii++)
for (int j=0; j<i-1; j++)
if((mas3_1[ii*i+j]==mas3_2[ii*i+j])&&(mas3_1[ii*i+j]==1))
opt++;
}
}
opt=opt/tc;
opt_f=opt;
opt_f=opt_f/i ;
delete [] mas3_1;
mas3_1=NULL;
delete [] mas3_2;
mas3_2=NULL;
if(i==0)
Image2->Canvas->MoveTo(0,yn);
else
Image2->Canvas->LineTo(xh*(mast/100),yn-(opt_f*yn)); //*(mast/100)
xh=xh+xn/10;
Refresh();
}
//int t;
//t=opt_f*1000;
Image2->Canvas->TextOut((xh-xn/10+hh)*(mast/100),yn-hh-(opt_f*yn),FloatToStr(opt_f));//*(mast/100)
Label18->Caption='OK';
Button12->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit11Change(TObject *Sender)
{
//Button9->Enabled=false;
//Button12->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit10Change(TObject *Sender)
{
//Button12->Enabled=false;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#pragma hdrstop
#include 'Fogel.h'
//---------------------------------------------------------------------------
#pragma package(smart_init)
int fogel_m(int *mas2, int *mas3, int n)
{
int ix=0;
int jy=0;
int min1,min2,t;
//решение
for(int ii=0;ii<n-1;ii++)
{
//строка
for (int i=0; i<n-1; i++)
{
min1=100000;
min2=100000;
for (int j=0; j<n-1; j++)
{
if((mas2[i*(n+1)+n-1]==1) && (mas2[(n-1)*(n+1)+j]==1))
{
if(min1>=mas2[i*(n+1)+j])
{
min2=min1;
min1=mas2[i*(n+1)+j];
}
if(min2>mas2[i*(n+1)+j] && min1<mas2[i*(n+1)+j])
min2=mas2[i*(n+1)+j];
}
}
mas2[i*(n+1)+n]=min2-min1;
}
//столбец
for (int j=0; j<n-1; j++)
{
min1=100000;
min2=100000;
for (int i=0; i<n-1; i++)
{
if((mas2[i*(n+1)+n-1]==1) && (mas2[(n-1)*(n+1)+j]==1))
{
if(min1>=mas2[i*(n+1)+j])
{
min2=min1;
min1=mas2[i*(n+1)+j];
}
if(min2>mas2[i*n+j] && min1<mas2[i*n+j])
min2=mas2[i*n+j];
}
}
mas2[n*(n+1)+j]=min2-min1;
}
//штрафы
min1=-1;
for (int j=0; j<n-1; j++)
{
if(mas2[(n-1)*n+j]==1)
if(min1<mas2[n*n+j])
{
min1=mas2[n*n+j];
ix=n;
jy=j;
}
}
for (int i=1; i<n-1; i++)
{
if(mas2[i*n+n-1]==1)
if(min1<mas2[i*n+n])
{
min1=mas2[i*n+n];
ix=i;
jy=n;
}
}
//наименьший
t=100000;
if(ix==n)
for (int i=0; i<n-1; i++)
{
if((mas2[i*n+n-1]==1) && (mas2[(n-1)*n+jy]==1))
{
if(t>mas2[i*n+jy])
{
t=mas2[i*n+jy];
ix=i;
}
}
}
if(jy==n)
for (int j=0; j<n-1; j++)
{
if((mas2[ix*n+n-1]==1) && (mas2[(n-1)*n+j]==1))
{
if(t>mas2[ix*n+j])
{
t=mas2[ix*n+j];
jy=j;
}
}
}
mas3[ix*n+jy]= 1;
//вычеркивание
mas2[ix*n+n-1]=0;
mas2[(n-1)*n+jy]=0;
}
}
//---------------------------------------------------------------------------
#pragma hdrstop
#include 'N_st.h'
//---------------------------------------------------------------------------
#pragma package(smart_init)
int nai_st(int *mas2, int *mas3, int n)
{
int ix=0;
int jy=0;
//решение
for(int ii=0;ii<n-1;ii++)
{
int t=1000000;
//следующий элемент
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
if((SG2->Cells[i][n-1]==1) && (SG2->Cells[n-1][j]==1))
{
if(t>StrToInt(SG2->Cells[i][j]))
{
t=StrToInt(SG2->Cells[i][j]);
ix=i;
jy=j;
}
}
}
mas3[ix*n+jy]= 1;
//вычеркивание
mas2[ix*n+n-1]=0;
mas2[(n-1)*n+jy]=0;
}
}
//---------------------------------------------------------------------------
#pragma hdrstop
#include 'Ner_p1.h'
//---------------------------------------------------------------------------
#pragma package(smart_init)
int ner_pr1(int *mas2, int *mas3, int n)
{
int ix=0;
int jy=0;
int sum1,sum2;
int t1=0;
int t2=0;
//решение
for(int ii=0;ii<n-1;ii++)
{
sum1=1000000;
sum2=1000000;
//следующий элемент
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
if((mas2[i*n+n-1]==1) && (mas2[(n-1)*n+j]==1))
{
t1=0;
t2=0;
for(int ff=0;ff<n-1;ff++)
{
// for(int ii=0;ii<n-1;ii++)
if((mas2[ff*n+n-1]==1) && (mas2[(n-1)*n+j]==1))
t1=t1+mas2[ff*n+j];
// for(int jj=0;jj<n-1;jj++)
if((mas2[i*n+n-1]==1) && (mas2[(n-1)*n+ff]==1))
t2=t2+mas2[i*n+ff];
}
sum1=3*mas2[i*n+j]-t1-t2;
if(sum1<sum2)
{
sum2=sum1;
ix=i;
jy=j;
}
}
}
mas3[ix*n+jy]= 1;
//вычеркивание
mas2[ix*n+n-1]=0;
mas2[(n-1)*n+jy]=0;
}
}
//---------------------------------------------------------------------------
#pragma hdrstop
#include 'Ner_p2.h'
//---------------------------------------------------------------------------
#pragma package(smart_init)
int ner_pr2(int *mas2, int *mas3, int n)
{
int ix=0;
int jy=0;
int sum1,sum2,x1,y1,x2,y2;
bool fl;
//решение
fl=true;
while(fl)
{
fl=false;
sum1=1000000;
sum2=1000000;
//следующий элемент
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
// if((mas2[(n-1)*n+j]==1)||(mas2[i*n+n-1]==1))
// {
for(int ii=0;ii<n-1;ii++)
if(mas3[ii*n+j]==1)
ix=ii;
for(int jj=0;jj<n-1;jj++)
if(mas3[i*n+jj]==1)
jy=jj;
sum1=mas2[i*n+j]+mas2[ix*n+jy]-mas2[ix*n+j]-mas2[i*n+jy];
if(sum1<sum2)
{
sum2=sum1;
x1=i;
y1=j;
x2=ix;
y2=jy;
}
// }
}
if(sum2<0)
{
mas3[x1*n+y1]= 1;
mas3[x2*n+y2]= 1;
mas3[x1*n+y2]= 0;
mas3[x2*n+y1]= 0;
//mas2[(n-1)*n+y1]=1;
//mas2[x1*n+n-1]=1 ;
//mas2[(n-1)*n+y2]=1;
//mas2[x2*n+n-1]=1 ;
fl=true;
}
}
}
//---------------------------------------------------------------------------
#pragma hdrstop
#include 'Ner_p3.h'
//---------------------------------------------------------------------------
#pragma package(smart_init)
int ner_pr3(int *mas2, int *mas3, int n)
{
int ix=0;
int jy=0;
int t1,x1,y1,x2,y2,min,min_t,mn;
bool fl,fm,flag;
int *m2=new int [(n+1)*(n+1)];
//решение
for (int i=0; i<n-1; i++)
{
mn=mas2[i*n+0];
for (int j=0; j<n-1; j++)
if(mn>mas2[i*n+j])
mn=mas2[i*n+j];
for (int jj=0; jj<n-1; jj++)
m2[i*n+jj]=mas2[i*n+jj]-mn;
}
for (int j=0; j<n-1; j++)
{
mn=m2[0*n+j];
for (int i=0; i<n-1; i++)
if(mn>m2[i*n+j])
mn=m2[i*n+j];
for (int ii=0; ii<n-1; ii++)
m2[ii*n+j]=m2[ii*n+j]-mn;
}
//следующий элемент
for (int i=0; i<n-1; i++) //матрица м2
{
for(int j=0;j<n-1;j++)
if(mas3[i*n+j]==1)
t1=m2[i*n+j];
for(int j=0;j<n-1;j++)
m2[i*n+j]=m2[i*n+j]-t1;
}
min=m2[0*n+0]; //минимум в м2
for(int i=0;i<n-1;i++)
for (int j=0; j<n-1; j++)
if(min>m2[i*n+j])
{
min=m2[i*n+j];
ix=i;
jy=j;
}
flag=true;
while(flag)
{
flag=false;
if(min<0)//условие
{
mas3[ix*n+jy]=7;//начало
for(int i=0;i<n-1;i++)
if(mas3[i*n+jy]==1)
{
mas3[i*n+jy]=5; //хвост
ix=i;
}
x1=ix;
y1=jy;
fl=true;
fm=true;
mas2[(n-1)*n+y1]=0;
while(fl && fm)
{
min_t=10000000;
for(int j=0;j<n-1;j++)
if((mas2[(n-1)*n+j]==1)||(mas3[x1*n+j]==7))
if((min_t>m2[x1*n+j]+min)&&((mas3[x1*n+j]==0)||(mas3[x1*n+j]==7)))
{
min_t=m2[x1*n+j]+min;
y1=j;
}
if(min_t>=0)
fm=false;
if(mas3[x1*n+y1]==7)
fl=false;
mas3[x1*n+y1]=3; //новый элемент
mas2[(n-1)*n+y1]=0;
min=min_t;
for (int i=0; i<n-1; i++)
if((mas3[i*n+y1]==1)||(mas3[i*n+y1]==5))
{
x1=i;
}
mas3[x1*n+y1]=2; //ноль
}
if(fm==false)
{
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
if(mas3[i*n+j]==2)
mas3[i*n+j]=1;
if(mas3[i*n+j]==3)
mas3[i*n+j]=0;
if(mas3[i*n+j]==5)
mas3[i*n+j]=1;
if(mas3[i*n+j]==7)
mas3[i*n+j]=0;
fl=true;
}
}
if(fl==false)
{
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
if(mas3[i*n+j]==2)
mas3[i*n+j]=0;
if(mas3[i*n+j]==3)
mas3[i*n+j]=1;
if(mas3[i*n+j]==5)
mas3[i*n+j]=0;
if(mas3[i*n+j]==7)
mas3[i*n+j]=1;
}
}
}
for (int j=0; j<n-1; j++)
mas2[(n-1)*n+j]=1;
}
delete [] m2;
}
//---------------------------------------------------------------------------
#pragma hdrstop
#include 'Potenc_m.h'
//---------------------------------------------------------------------------
#pragma package(smart_init)
void sb(int i,int j,int *u,int *v,int n,int *mas2, int *mas3,int *ux,int *vx);
//
void st(int i,int j,int *u,int *v,int n,int *mas2, int *mas3,int *ux,int *vx)
{
for(int ii=0;ii<n-1;ii++)
if((mas3[ii*n+j]!=0)&&(vx[ii]==0))
{
v[ii]=mas2[ii*n+j]-u[j];
vx[ii]=1;
sb(ii,j,u,v,n,mas2,mas3,ux,vx);
}
return ;
}
//
void sb(int i,int j,int *u,int *v,int n,int *mas2, int *mas3,int *ux,int *vx)
{
for(int jj=0;jj<n-1;jj++)
if((mas3[i*n+jj]!=0)&&(ux[jj]==0))
{
u[jj]=mas2[i*n+jj]-v[i];
ux[jj]=1;
st(i,jj,u,v,n,mas2,mas3,ux,vx);
}
return ;
}
//
int stb(int i,int j,int *, int *, int n,int *c);
//
int strk(int i,int j,int *mas2, int *mas3, int n,int *c)
{
for(int ii=0;ii<n-1;ii++)
if((mas3[ii*n+j]!=0)&&(ii!=i)&&(mas2[(n-1)*n+j]==1)&&(mas2[ii*n+n-1]==1))
{
//mas2[ii*n+n-1]=1;
if(*c<mas3[ii*n+j])
*c=mas3[ii*n+j];
stb(ii,j,mas2,mas3,n,c);
ii=n-1;
}
return *c;
}
//
int stb(int i,int j,int *mas2, int *mas3, int n,int *c)
{
for(int jj=0;jj<n-1;jj++)
//if((mas2[i*n+jj]==0)&&(mas3[i*n+jj]==0)&&(mas2[(n-1)*n+jj]==1))
if((mas3[i*n+jj]!=0)&&(jj!=j)&&(mas2[(n-1)*n+jj]==1)&&(mas2[i*n+n-1]==1))
{
if(mas3[i*n+jj]!=3)
strk(i,jj,mas2,mas3,n,c);
jj=n-1;
}
return *c;
}
//
int stb_z(int i,int j,int *, int *, int n,int *c);
//
int strk_z(int i,int j,int *mas2, int *mas3, int n,int *c)
{
for(int ii=0;ii<n-1;ii++)
if((mas3[ii*n+j]!=0)&&(ii!=i)&&(mas2[(n-1)*n+j]==1)&&(mas2[ii*n+n-1]==1))
{
// if(*c<mas3[ii*n+j])
// *c=mas3[ii*n+j];
if(*c==1)
mas3[ii*n+j]=2;
stb_z(ii,j,mas2,mas3,n,c);
ii=n-1;
}
return *c;
}
//
int stb_z(int i,int j,int *mas2, int *mas3, int n,int *c)
{
for(int jj=0;jj<n-1;jj++)
//if((mas2[i*n+jj]==0)&&(mas3[i*n+jj]==0)&&(mas2[(n-1)*n+jj]==1))
if((mas3[i*n+jj]!=0)&&(jj!=j)&&(mas2[(n-1)*n+jj]==1)&&(mas2[i*n+n-1]==1))
{
if(mas3[i*n+jj]!=3)
{
if(*c==1)
mas3[i*n+jj]=1;
strk_z(i,jj,mas2,mas3,n,c);
}
jj=n-1;
}
return *c;
}
int potenc(int *mas2, int *mas3, int n)
{
int ix=0;
int jy=0;
int ix1=0;
int jy1=0;
int ix2=0;
int jy2=0;
int *v=new int [n-1];
int *u=new int [n-1];
int *ux=new int [n-1];
int *vx=new int [n-1];
int cc,m,sums,sumt,c,fl;
int ijc[2][3];
//int oix1=0,ojy1=0,oix2=0,ojy2=0;
cc=1;
while(cc>0)
{
//восстановление нулей
for (int i=0; i<n-1; i++)
{
mas2[i*n+n-1]=1;
u[i]=0;
v[i]=0;
ux[i]=0;
vx[i]=0;
}
for (int j=0; j<n-1; j++)
mas2[(n-1)*n+j]=1;
//нахождение потенциалов
//u[0]=0;
//ux[0]=1;
//for (int j=0; j<n-1; j++)
//for (int i=0; i<n-1; i++)
//{
//if((mas3[i*n+j]!=0))//&&((mas2[i*n+n-1]==1) || (mas2[(n-1)*n+j]==1))
//{
//if(ux[j]==1)
//{
// v[i]=mas2[i*n+j]-u[j];
// for (int x=0; x<n-1; x++)
// if((mas3[i*n+x]!=0))
//{
// u[x]=mas2[i*n+x]-v[i];
// ux[x]=1;
// for (int y=0; y<n-1; y++)
// if((mas3[y*n+x]!=0))
// {
// v[y]=mas2[y*n+x]-u[x];
//}
//}
st(0,0,u,v,n,mas2,mas3,ux,vx);
// }
// }
// }
// 2раза
//for (int j=0; j<n-1; j++)
// for (int i=0; i<n-1; i++)
// {
//if((mas3[i*n+j]!=0))//&&((mas2[i*n+n-1]==1) || (mas2[(n-1)*n+j]==1))
// {
//if(ux[j]==1)
// {
// v[i]=mas2[i*n+j]-u[j];
// for (int x=0; x<n-1; x++)
// if((mas3[i*n+x]!=0))
//{
// u[x]=mas2[i*n+x]-v[i];
// ux[x]=1;
// for (int y=0; y<n-1; y++)
// if((mas3[y*n+x]!=0))
//{
// v[y]=mas2[y*n+x]-u[x];
//}
//}
// st(0,0,u,v,n,mas2,mas3);
//}
// }
// }
//матрица C
cc=0;
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
//if(mas3[i*n+j]==0)
if(cc<(v[i]+u[j]-mas2[i*n+j])) //&&((mas2[i*n+n-1]==1) || (mas2[(n-1)*n+j]==1))
{
cc=v[i]+u[j]-mas2[i*n+j];
ix=i;
jy=j;
}
}
if(cc>0)
{
mas3[ix*n+jy]=3;
//вычеркивание строк и столбцов
m=1;
while(m>0)
{
m=0;
for (int i=0; i<n-1; i++)//строки
{
sums=0;
for (int j=0; j<n-1; j++)
{
if(((mas3[i*n+j]==1)||(mas3[i*n+j]==2)||(mas3[i*n+j]==3))&&(mas2[i*n+n-1]==1)&&(mas2[(n-1)*n+j]==1))
sums=sums+1;
}
if(sums==1)
{
mas2[i*n+n-1]=0;
//mas2[(n-1)*n+j]=0;
m=m+1;
}
}
for (int j=0; j<n-1; j++)//столбцы
{
sumt=0;
for (int i=0; i<n-1; i++)
{
if(((mas3[i*n+j]==1)||(mas3[i*n+j]==2)||(mas3[i*n+j]==3))&&(mas2[(n-1)*n+j]==1)&&(mas2[i*n+n-1]==1))
sumt=sumt+1;
}
if(sumt==1)
{
//mas2[i*n+n-1]=0;
mas2[(n-1)*n+j]=0;
m=m+1;
}
}
}
//цикл и обмен
c=0;
strk(ix,jy,mas2,mas3,n,&c);
strk_z(ix,jy,mas2,mas3,n,&c);
if(c==1)
mas3[ix*n+jy]=1;
if(c==2)
mas3[ix*n+jy]=2;
fl=0;
for(int ii=0;ii<n-1;ii++)
if((mas3[ii*n+jy]!=0)&&(ii!=ix)&&(mas2[(n-1)*n+jy]==1)&&(mas2[ii*n+n-1]==1))
{
if(mas3[ii*n+jy]==2)
{
mas3[ii*n+jy]=0;
fl=1;
}
}
if(fl==0)
for(int jj=0;jj<n-1;jj++)
if((mas3[ix*n+jj]!=0)&&(jj!=jy)&&(mas2[(n-1)*n+jj]==1)&&(mas2[ix*n+n-1]==1))
{
if(mas3[ix*n+jj]==2)
mas3[ix*n+jj]=0;
}
}
}
delete [] v;
delete [] u;
delete [] ux;
delete [] vx;
}
//---------------------------------------------------------------------------
#pragma hdrstop
#include 'S_z.h'
//---------------------------------------------------------------------------
#pragma package(smart_init)
int s_zy(int *mas2, int *mas3, int n)
{
int ix=0;
int jy=0;
//for(int ii=0;ii<n-1;ii++)
//{
//следующий элемент
//for (int i=0; i<n-1; i++)
// for (int j=0; j<n-1; j++)
// {
// if((mas2[i*n+n-1]==1) && (mas2[(n-1)*n+j]==1))
// {
// ix=i;
// jy=j;
// i=n;
// j=n;
// }
// }
//mas3[ix*n+jy]= 1;
//вычеркивание
//mas2[ix*n+n-1]=0;
//ms2[(n-1)*n+jy]=0;
//}
for (int i=0; i<n-1; i++)
{
mas3[i*n+i]= 1;
}
}
//---------------------------------------------------------------------------
#pragma hdrstop
#include 'Venger_m.h'
//---------------------------------------------------------------------------
#pragma package(smart_init)
//
int stb(int i,int j,int *, int *, int n,int *c,int *x,int *y);
//
int strk(int i,int j,int *mas2, int *mas3, int n,int *c,int *x,int *y)
{
int z=0;
for(int ii=0;ii<n-1;ii++)
if(mas3[ii*n+j]==1)
{
mas2[ii*n+n-1]=1;
z=stb(ii,j,mas2,mas3,n,c,x,y);
if(*c==0)
*c=3;
ii=n-1;
}
return *c;
}
//
int stb(int i,int j,int *mas2, int *mas3, int n,int *c,int *x,int *y)
{
int z=0;
for(int jj=0;jj<n-1;jj++)
if((mas2[i*n+jj]==0)&&(mas3[i*n+jj]==0)&&(mas2[(n-1)*n+jj]==1))
{
mas2[(n-1)*n+jj]=0;
mas3[i*n+jj]=2;
strk(i,jj,mas2,mas3,n,c,x,y);
z=1;
if(*c==0)
*c=2;
if((*x==-1)&&(*y==-1))
{
*x=i;
*y=jj;
}
jj=n-1;
return *c;
}
//
int stb2(int i,int j,int *, int *, int n);
//
int strk2(int i,int j,int *mas2, int *mas3, int n)
{
int x=0;
for(int ii=0;ii<n-1;ii++)
if(mas3[ii*n+j]==2)
{
mas3[ii*n+j]=1;
tb2(ii,j,mas2,mas3,n);
ii=n-1;
}
return x;
}
//
int stb2(int i,int j,int *mas2, int *mas3, int n)
{
int x=0;
for(int jj=0;jj<n-1;jj++)
if((mas3[i*n+jj]==1)&&(jj!=j))
{
mas3[i*n+jj]=0;
strk2(i,jj,mas2,mas3,n);
x=1;
jj=n-1;
}
return x;
}
int venger(int *mas2, int *mas3, int n)
{
int ix=0;
int jy=0;
int min,zvt,zvs;
int e3,e2;
int c;
//
//минус по столбцам
for (int i=0; i<n-1; i++)
{
min=mas2[i*n+0];
for (int j=1; j<n-1; j++)
{
if(min>mas2[i*n+j])
min=mas2[i*n+j];
}
for (int j=0; j<n-1; j++)
{
mas2[i*n+j]=mas2[i*n+j]-min;
}
}
//минус по строкам
for (int j=0; j<n-1; j++)
{
min=mas2[0*n+j];
for (int i=1; i<n-1; i++)
{
if(min>mas2[i*n+j])
min=mas2[i*n+j];
}
for (int i=0; i<n-1; i++)
{
mas2[i*n+j]=mas2[i*n+j]-min;
}
}
// 0->*
int ns=0;
for (int i=0; i<n-1; i++)
{
zvt=0;
for (int j=0; j<n-1; j++)
{
if((mas2[i*n+j]==0)&&(zvt==0))
{
zvs=0;
for (int ii=0; ii<n-1; ii++)
if(mas3[ii*n+j]==1)
zvs=1;
if(zvs==0)
{
mas3[i*n+j]=1;
zvt=1;
ns=ns+1;
}
}
}
}
//ns=0;
while(ns<n-1)
{
ix=-1;
jy=-1;
//выделение столбцов
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
if(mas3[i*n+j]==1)
mas2[i*n+n-1]=0;
//первый этап
//e3=0;
e2=0;
for (int i=0; i<n-1; i++)
{
if(mas2[i*n+n-1]==1)
for (int j=0; j<n-1; j++)
{
if((mas2[i*n+j]==0)&&(mas3[i*n+j]==0))
{
mas2[(n-1)*n+j]=0;
mas3[i*n+j]=2;
// for (int ii=0; ii<n-1; ii++)
// if(mas3[ii*n+j]==1)
// {mas2[ii*n+n-1]=1; e3=1; i=0; e2=0;}
// else {if(e3==0) {e2=1; i=n-1;}}
c=0;
e3=strk(i,j,mas2,mas3,n,&c,&ix,&jy);
if(c==0)
{ix=i; jy=j;}
if(c%2==0)
{
i=n-1;
j=n-1;
}
else {ix=-1; jy=-1;}
}
}
}
//проверка на свободные нули
if(c%2==1)
{
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
if((mas2[i*n+n-1]==1)&&(mas2[(n-1)*n+j]==1))
if((mas2[i*n+j]==0)&&(mas3[i*n+j]==0))
{
c=2;
ix=i;
jy=j;
}
}
}
//третий этап
if(c%2==1)
{
min=1000000;
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
if((mas2[i*n+n-1]==1) && (mas2[(n-1)*n+j]==1))
if(min>mas2[i*n+j])
min=mas2[i*n+j];
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
{
if(mas2[i*n+n-1]==0)
mas2[i*n+j]=mas2[i*n+j]+min;
if(mas2[(n-1)*n+j]==1)
mas2[i*n+j]=mas2[i*n+j]-min;
}
}
//второй этап
if(c%2==0)
{
mas3[ix*n+jy]=1;
stb2(ix,jy,mas2,mas3,n);
ns++;
}
// очисткапо стр и стб выделений
for (int i=0; i<n-1; i++)
for (int j=0; j<n-1; j++)
if(mas3[i*n+j]==2)
mas3[i*n+j]=0;
for (int i=0; i<n-1; i++)
mas2[i*n+n-1]=1;
for (int j=0; j<n-1; j++)
mas2[(n-1)*n+j]=1;
}
}