Рисунок 4 . Укрупненная блок-схема алгоритма работы программы

2.3.1 Алгоритм формирования групп для текущего распределения

Шаг 1. Для каждого ОЦ по каждому предмету формируется одна группа из N человек.

Шаг 2. Для каждого ОЦ по каждому предмету высчитывается число групп: n = [N/nimax], где nimax – максимальный размер группы для i-го предмета.

Шаг 3. Зная число групп в каждом ОЦ по каждому предмету, распределяем из N клиентов n*nimax клиентов по группам таким образом, что остаются нераспределенными те клиенты, которые:

 

· Максимально удалены от данного ОЦ (значения весов и, соответственно, вклад в функцию прогнозируемой прибыли минимальны)

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

Шаг 4. Зная, какие именно клиенты запишутся на курсы, можно подсчитать функцию прогнозируемой прибыли по формуле

(14). Клиентов, не попавших в сформированные группы, не учитываем.

2.3.2 Алгоритм поиска нового распределения для данного курса

Шаг 1. Нахождение значения прибыли от текущего распределения

Шаг 2. Формирование списка из образовательных центров, в которых можно сформировать новую группу по данному курсу

Шаг 3. Если список пуст, возвращаем текущее значение прибыли и текущее распределение. Конец работы алгоритма

Шаг 4. Для каждого элемента списка формируем соответствующее распределение и запускаем алгоритм поиска нового распределения, который возвращает новое распределение и новое значение прибыли

Шаг 5. Из полученных распределений выбирается то, которое обеспечило максимальную прибыль. Возвращаем его и полученное значение прибыли.

Подробная блок-схема алгоритма поиска нового распределения для конкретного курса представлена на рисунке 5.

Рисунок 5 . Блок-схема алгоритма поиска нового распределения

2.4 Диаграмма классов

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

 

Рисунок 6 . Диаграмма классов

2.5 Спецификация основных классов

Таблица 3 . Класс «ClientsDistribution»

Класс « ClientsDistribution »

Имя члена/метода Модификатор доступа Описание
Client[] clients + Массив записей клиентов на курсы (хранится пара ID клиента и ID курса)
Course[] courses + Список курсов
EducationCenter[] centers + Список ОЦ
Relation[][] distribution + Массив возможных распределений (для каждого клиента хранятся ближайшие ОЦ, в которых он может учиться)
bool DataLoaded - True, если данные загружены
bool InitialDistributionMade - True, если создано начальное распределение
double relatedDistance - Максимально допустимое расстояние от ОЦ до места жительства клиента, в метрах
int numOfRelatedCenters - Количество центров, в которых может обучаться каждый клиент. Служит для ускорения работы алгоритма. Все равно клиент не будет учиться в удаленных ОЦ
LoadData() + Загрузить данные из базы
MakeInitialDistribution() + Создать начальное распределение
GetCurrentDistribution() + Получить текущее распределение (для дальнейшего его отображения на карте Москвы)
GetClientsCoordinates + Возвращает координаты клиента по его ID
GetCurrentIncome() + Подсчитывает прогнозируемую прибыль для текущего распределения
FindOptDistribution() + Запускает алгоритм поиска “оптимального” распределения

Таблица 4 . Класс «MoscowMap»

Класс « MoscowMap »

Имя члена/метода Модификатор доступа Описание
double dolgota1, shirota1, dolgota2, shirota2   - Координаты GPS левого верхнего и правого нижнего углов карты Москвы. Нужны для масштабирования карты и аппроксимации местоположения
int Width   + Ширина карты, в пикселях
int Height   + Высота карты, в пикселях
getCurrentCoordinates() + Получает gps координаты по координатам пикселя
GetCurrentDistribution() + Возвращает изображение с текущим распределением клиентов  
GetIntCoordinates() - Получает координаты пикселя по gps-координатам  
GetEmptyMap()   + Возвращает пустую карту  

Таблица 5 . Класс «GPS»

Класс « GPS »

Имя члена/метода Модификатор доступа Описание
ConvertToRadians() - Конвертирует значение из градусов в радианы
get_fi() - Вычисляет угол, который вдальнейшем используется для нахождения расстояния между двумя точками по их gps координатам  
get_S_yandex()   + Вычисляет расстояние по gps координатам  

Таблица 6 . Класс «Client»

Класс « Client »

Имя члена/метода Модификатор доступа Описание
Int32 ID + ID клиента
double Dolgota + GPS координаты долготы
double Shirota + GPS координаты широты
Int32 CourseID   + ID курса, к которому относится данная запись

Таблица 7 . Класс «Course»

Класс « Course »

Имя члена/метода Модификатор доступа Описание
Int32 ID + ID курса
Double Cost   + Стоимость курса
Int32 MinGroupSize   + Минимальный размер группы по данному курсу
Int32 MaxGroupSize   + Максимальный размер группы по данному курсу

Таблица 8 . Класс «EducationCenter»

Класс « EducationCenter »

Имя члена/метода Модификатор доступа Описание
Int32 ID + ID образовательного центра
double Dolgota + GPS координаты долготы
double Shirota + GPS координаты широты

 

Таблица 9 . Класс «OneClientDistribution»

Класс « OneClientDistribution »

Имя члена/метода Модификатор доступа Описание
Int32 ClientID + ID клиента
Int32 CenterID + ID образовательного центра, к которому он относится
Int32 CourseID + ID курса, на который записан
bool isDistributed + True, если клиент уже распределен в какую-то группу
Int32 relatedCenter + Коэффициент, который позволяет учитывать учащихся, которые вносят корреляцию

 

 

Таблица 10 . Класс «Relation»

Класс « Relation »

Имя члена/метода Модификатор доступа Описание
Int32 ID + ID ОЦ в списке связанных для данного клиента ОЦ
Double S + Расстояние для данного ОЦ
Double P + Весовой коэффициент – вероятность того, что клиент будет ходить именно в этот ОЦ

2.6 Требования к БД

· Возможность получения доступа через интернет

· В БД должен быть предусмотрен поиск, изменение и удаление записей

· Авторизация при помощи логина и пароля. Разграничение прав доступа. Возможность регистрироваться и восстанавливать забытый пароль.

· Возможность использовать администраторам сайта “Панель администратора”, через которую возможно изменение и удаление базовых элементов системы, а так же получение более детальной информации о базе данных

2.7 Концептуальная модель базы данных

Каждой таблице в базе данных соответствует своя сущность на ER-диаграмме. Всего 12 сущностей, 11 из которых являются сильными (или “нормальными”). Сущность “Курс” является слабой сущностью, так как её существование зависит от другой сущности “Обобщенный курс”.

Каждый тип сущности на ER-диаграмме представляется в виде отдельного прямоугольника с указанным внутри именем сущности, причем прямоугольники сущностей слабых типов рисуются двойной линией.[6]

Описанные сущности и их связи представлены на ER-диаграмме на рис. 7.

В нашей модели “сущность-связь” связи могут иметь тип “один к одному” и “один ко многим” (иначе может называться “многие к одному”). Связи типа “многие ко многим” отсутствуют. Связи типа “один к одному” и “один ко многим” всегда могут быть представлены с помощью механизма внешнего ключа, помещаемого в одну из переменных-отношений, участвующих в данной связи.

Рисунок 7 . ER- диаграмма

2.8 Спецификации таблиц

 

Таблица 11 . Таблица образовательных центров (ОЦ)

Таблица « Образовательные центры »

Название атрибута Тип Комментарий
Адрес ОЦ VARCHAR(100) город, улица, дом, корпус, строение
Долгота VARCHAR(80) Gps-координаты ОЦ
Широта CHAR(20) Gps-координаты ОЦ

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


Таблица «Клиенты с бонусом»

Название атрибута Тип Комментарий
ФИО ребенка VARCHAR(100) фамилия, имя и отчество ученика, записывающегося на курсы
ФИО родителя VARCHAR(100) фамилия, имя и отчество родителя, обычно матери ученика
Телефон родителя CHAR(20)  
Сегодняшняя дата DATE дата создания этой записи. Учитывается при наборе групп. Если клиент записался больше, чем за месяц до начала курса, ему предоставляется скидка
Долгота float Gps-координаты места жительства
Широта float Gps-координаты места жительства

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

Таблица «Записи клиентов с бонусами»

Название атрибута Тип Комментарий
ID клиента с бонусом INT  
ID обобщенного курса INT ID курса, на который хочет записаться потенциальный клиент


Таблица 14 . Таблица клиентов

Таблица « Клиенты »

Название атрибута Тип Комментарий
ФИО клиента VARCHAR(100) Фамилия, имя и отчество обучающегося
Название школы VARCHAR(80) школа, в которой обучается клиент на данный момент
Телефон клиента CHAR(20) телефон ученика
ФИО родителя VARCHAR(100)  
Телефон родителя CHAR(20)  

Таблица 15 . Таблица, содержащая основную информацию о каждом преподавателе

Таблица « Преподаватели »

Название атрибута Тип Комментарий
ID предмета INT ID обучаемого предмета
ФИО преподавателя VARCHAR(100) фамилия, имя и отчество преподавателя
Телефон CHAR(20) телефон преподавателя
Опыт работы INT стаж сотрудника, в годах
Место работы VARCHAR(100) последнее или текущее место работы преподавателя

Таблица 16 . Таблица курсов с уже конкретно заданными датами занятий

Таблица « Группы »

Название атрибута Тип Комментарий
ID преподавателя INT ID того преподавателя, который будет вести данный курс
ID обобщенного курса INT ID обобщенного курса, но основе которого построен данный курс
Дата начала DATE дата первого занятия
Дата окончания DATE дата последнего занятия
Дата родительского собрания DATETIME  


Таблица 17 . Таблица обобщенных курсов. Имеет всю информацию о каждом курсе


Таблица «Обобщенные курсы»

Название атрибута Тип Комментарий
ID предмета INT предмет обучения, к которому относится данный курс (математика, физика и т.д.)
Название курса VARCHAR(100) полное название курса. Например “Web-дизайн и язык HTML”
Минимальное значение класса INT класс, ученики которого уже способны осваивать данный курс
Максимальное значение класса INT наибольшее значение класса, ученики которого могут изучать выбранный курс
Количество часов, в семестр INT какое количество часов в семестре имеет выбранный курс
Количество часов в неделю REAL суммарное количество часов обучения по данному курсу в неделю
Стоимость за месяц MONEY месячная стоимость обучения
Бонусная стоимость за месяц MONEY месячная стоимость обучения при единоразовой оплате всего семестра
Минимальный размер группы INT минимальное количество людей в группе. Если в группе людей меньше, занятия не начинаются
Максимальный размер группы INT наибольшее количество людей в группе. Если записывается больше людей, группа делится на 2 подгруппы

Таблица 18 . Таблица платежей, сделанных клиентами


Таблица «Платежи»

Название атрибута Тип Комментарий
ID клиента INT ID клиента, осуществившего платеж
ID курса INT ID курса, оплата за которого сделан платеж
Стоимость MONEY сумма платежа
Дата оплаты DATE дата внесения платежа
Оплаченные часы INT количество оплаченных часов за семестр

 

 

Таблица 19 . Таблица пользователей, работающих с сайтом

Таблица «Пользователи»

Название атрибута Тип Комментарий
Логин INT логин пользователя
Имя INT имя пользователя
Фамилия MONEY фамилия пользователя
Приоритет DATE уровень доступа пользователя к системе
Пароль INT  

 

Таблица 20 . Таблица уроков. Содержит информацию о времени проведения каждого запланированного занятия

Таблица «Уроки»

Название атрибута Тип Комментарий
ID курса INT ID курса, к которому относится данное занятие
Дата INT дата проведения занятия
Время начала MONEY время начала занятия
Время окончания DATE время окончания занятия

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


Таблица «Предметы»

Название атрибута Тип Комментарий
Название VARCHAR(50) Название дисциплины, по которой ведется обучение

 

Таблица 22 . Таблица с информацией о каждом ученике за конкретное занятие

Таблица «Информация об ученике за урок»

Название атрибута Тип Комментарий
ID урока INT ID того урока, к которой относится эта запись
ID клиента INT ID ученика, кому посвящена данная запись
Присутствие BIT Отметка о том, посетил ли ученик данное занятие
Домашнее задание BIT Отметка о том, выполнил ли ученик домашнее задание для данного занятия
Отметка varchar(100) Оценка, а так же замечания и пометки, сделанные ученику за урок


2.9 Вычисление расстояния по GPS-координатам

Через любые две точки на поверхности сферы, если они не прямо противоположны друг другу (то есть не являются антиподами), можно провести уникальный большой круг. Две точки, разделяют большой круг на две дуги. Длина короткой дуги – кратчайшее расстояние между двумя точками. Между двумя точками-антиподами можно провести бесконечное количество больших кругов, но расстояние между ними будет одинаково на любом круге и равно половине окружности круга, или pi*R, где R – радиус сферы.