Усовершенствование системы краткосрочной аренды

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

Рубрика Государство и право
Вид дипломная работа
Язык русский
Дата добавления 11.08.2017
Размер файла 2,2 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

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

С точки зрения информационной безопасности бортовой компьютер машины должен выполнять требования по:

конфиденциальности передаваемых данных;

выполнять аутентификацию клиента;

обеспечивать невозможность отказа от совершенных водителем действий;

гарантировать целостность передаваемых данных.

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

Аутентификация клиента подразумевает проверку личности водителя перед резервированием автомобиля и перед запуском мотора.

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

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

Конфиденциальность передаваемых данных обеспечивается с помощью использования криптографических протоколов транспортного уровня (TLS/ SSL), гарантирующих защищенную передачу данных.

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

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

Применение современных технологий для обеспечения безопасности транспортного уровня (TLS/ SSL) подразумевает использование кодов аутентичности сообщений, что гарантирует сохранение целостности сообщений.

5.2 Анализ рисков

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

В случае усовершенствованного процесса резервирования автомобиля добавляются дополнительные сообщения для коммуникации между мобильным телефоном и сервером DriveNow. Это незначительно увеличит сложность бизнес-логики мобильного приложения и сложность поведения сервера DriveNow.

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

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

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

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

Заключение

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

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

В ходе работы были достигнуты следующие результаты:

оценена актуальность выбранной темы и важность ее анализа;

произведен анализ бизнес-процессов краткосрочной аренды машин, были выявлены недостатки данных процессов;

проведено детализирование процессов совместного использования автомобилей в компании DriveNow и построение их текущих моделей с помощью UML диаграмм;

сформированы требования, приводящие к усовершенствованию бизнес-процессов;

созданы будущие модели измененных бизнес-процессов;

было описано концептуальное проектирование системы;

было реализовано приложение на языке С++, симулирующее процесс краткосрочной аренды автомобилей;

были описаны аспекты информационной безопасности системы;

были учтены риски использования новых процессов.

При выполнении магистерской диссертации были применены практические и теоретические навыки. Были достигнуты цели и задачи магистерской диссертации.

В результате работы были разработаны решения более эффективного использования автомобилей DriveNow благодаря расширению существующей системы.

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

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

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

Список литературы

1. "Bringing Carsharing to your Community", компания City Car Share, 2016.

2. "DriveNow Tarife und Pakete", блог DriveNow 2017.

3. M. Land, “Nutzen statt Kaufen. Auswirkungen der Sharing Economy auf die Automobilindustrie. Car-Sharing”. - M.: Издательство Фрезениус, 2016 .

4. M. Borchardt, “Mobilitдt vs. Nachhaltigkeit. Soziale, цkologische und цkonomische Auswirkungen des Car-Sharing”, Бремен 2011.

a. Gebauer, “Car-Sharing - Die Fortbewegungsart von morgen?: Eine empirische Studie zur eigentumslosen Fortbewegungsart aus der Sicht von Laien und Experten”, Akademikerverlag 2014.

5. “DriveNow”, DriveNow Blog.

6. Немецкий федеративный союз краткосрочной аренды машин. Carsharing [Электронный ресурс] / Википедия - свободная энциклопедия. - URL: https://en.wikipedia.org/wiki/Carsharing. (Дата обращения: 10.12.16).

7. Seeing the back of the car // The Economist, 2012.

8. M. Gibbs,T. Nick, Car2Go poised to top 1-million users // Automotive News, 2014.

9. Car sharing today [Электронный ресурс] / BGG Website - Официальный сайт BGG. - URL: https://www.bcg.com/careers/path/knowledge-analytics/default.aspx (Дата обращения: 06.01.17).

10. J. Fingas. BMW DriveNow EV car sharing comes to San Francisco Bay Area, ParkNow follows suit // Engadged, 2013.

11. DriveNow Munich [Электронный ресурс] / DriveNow Website -Официальный сайт DriveNow. - URL: https://www.drive-now.com/gb/en/london#!/carsharing/munich (Дата обращения: 08.01.17).

12. Car sharing/ Дж. Рассел, Р. Кон. - M.: Издательство пер. с англ. -- Буквика паблишинг, 2012. -130 c.

13. Новости car sharing [Электронный ресурс] / Carsharing Association -Ассоциация по car sharing. - URL: http://carsharing.org/news/. (Дата обращения: 25.11.16).

14. Процессный подход к управлению. Моделирование, внедрение, управление. / Репин В. В. - M.: Издательство Манн, Иванов и Фербер, 2013. - 544 c.

15. Designing Concurrent, Distributed, and Real-Time Applications with UML/. Х.Гома. . - M.: Издательство ДМК Пресс, 2017. - 700 c.

16. UML distilled second edition/. M. Fowler, K. Scott. - M.: Издательство Addison Wesley, 2013. - 192 c.

17. Die UML-Kurzreferenz 2.3 fьr die Praxis/. B. Oestereich.- M.: Издательство Oldenbourg Wissenschaftsverlag, 2009. - 198 c.

18. UML online [Электронный ресурс] / PlantUML in a nutshell - URL: http://plantuml.com. (Дата обращения: 15.11.16).

19. Моделирование бизнес-процессов. Учебник и практикум/ О.Долобанов, Е. Виноградов, А. Лобанова- M.: Издательство Юрайт, 2016. - 290 c.

20. Основы менеджмента. / Мескон, Альберт, Хедоури. - M.: Издательство Вильям, 2016. - 720 c.

21. Стратегический менеджмент: концепции и ситуации для анализа/. Томпсон-мл., Стрикленд ІІІ. - M.: Издательство Вильям, 2007. - 928 c.

22. Стратегическое управление/. Писаренко Н. Л., Длигач А. А. - M.: Издательство МИФ, 2008. - 352 c.

23. Путь к снижению затрат и повышению качества/ Масааки И. Гемба. - M.: Издательство пер. с англ. --Альпина Бизнес Букс, 2015. - 424 c.

24. Курс теории вероятностей и математической статистики: учебник для студентов высших учебных заведений, обучающихся по специальностям «математика» и «механика»/ Б.А. Севастьянов, главная редакция физико-математической литературы, 1982. - 198 с.

25. Основы имитационного моделирования сложных экономических систем/ Н. Кобелев. - M.: Издательство Дело, 2006. - 336 c.

26. Вероятность - 1: учебник для студентов высших учебных заведений, обучающихся по физико-математическим направлениям специальностям/ А.Н. Ширяев. - M.: Издательство МЦНМО, 2007. - 240 с.

27. Вероятность - 2: учебник для студентов высших учебных заведений, обучающихся по физико-математическим направлениям специальностям/ А.Н. Ширяев.- M.: Издательство МЦНМО, 2007. - 198 с.

28. Программирование: принципы и практика использования C++/. Б. Страуструп. - М.: Издательство Вильямс, 2011. - 1382 с.

29. Thinking in C++ second edition/ Volume One: Introduction to standard C++/. B. Eckel. - M.: Издательство Prentice Hall, 2000. - 857 с.

30. The C++ Standard Library/. Nikolai M. Josuttis. - M.: Издательство Addison-Wesley, 2006. - 1136 с.

31. Teach Youself C++/. J. Liberty, B. Jones. - M.: Издательство Sams, 2005. - 768 с.

32. More effective C++/. S. Meyers. - M.: Издательство Addison-Wesley, 2015. - 653 с.

33. Eclipse: Building Commercial-Quality Plug-ins/ E. Clayberg, D. Rubel. - M.: Издательство Addison-Wesley, 2006. - 1142 с.

34. Eclipse. Платформа Web-инструментов/. Н. Дей, Л. Мандел, Артур. - M.: Издательство КУДИЦ-Пресс, 2008. - 688 с.

35. Расширения Eclipse. Принципы, шаблоны и подключаемые модули/. К. Бек, Э. Гамма. - M.: Издательство Кудиц, 2006. - 384 с.

36. Eclipse IDE/. Э. Барнет. - M.: Издательство Кудиц, 2006. - 160 с.

37. Pro Git/. S. Chacon. - M.: Издательство Apress, 2009. - 598 с.

38. Бизнес-информатика: немецкий взгляд на характеристики, проблемные области и возможности/ Д. Штельцер. - M.: Издательство Синергия, 2015. - 458 c.

Приложение 1

Входные параметры программы

Входные параметры программы

Название параметра

Значение параметра

Длина города в км

20

Ширина города в км

15

Количество используемых автомобилей

500

Продолжительность симуляции в минутах

43200 (30 дней)

Вероятность дневного использования машины в начале симуляционного шага

0,01

Вероятность ночного использования машины в начале симуляционного шага

0,001

Средняя скорость движения автомобиля в км/ч

30

Максимальное количество минут парковки

15

Средний размер бака автомобиля в литрах

50

Средний расход бензина автомобиля в литрах на 100 км

8

Верхняя граница содержимого бака для получения бонусных минут в процентах

25

Вероятность заправки автомобиля клиентом

0,05

Количество бонусных минут после заправки автомобиля

30

Затраты в евро на обслуживающий персонал в час

20

Стоимость минуты аренды машины в евро

0,32

Стоимость минуты парковки машины в евро

0,15

Приложение 2

Исходный код программы

*************************************************

File CarInfo.h:

#ifndef CARINFO_H_

#define CARINFO_H_

namespace drivenow

{

/**

* Class containing all car properties

*/

class CarInfo

{

public:

CarInfo()

{

currentPositionX = 0;

currentPositionY = 0;

targetPositionX = 0;

targetPositionY = 0;

totalDistance = 0;

totalDriveDurationMinutes = 0;

restDistance = 0;

restDriveDurationMinutes = 0;

totalNumberOfParkingMinutes = 0;

restNumberOfParkingMinutes = 0;

tankFillStateLiter = 0;

mileage = 0;

numberOfNoRefuels = 0;

inUse = false;

}

float currentPositionX;

float currentPositionY;

float targetPositionX;

float targetPositionY;

float totalDistance;

int totalDriveDurationMinutes;

float restDistance;

int restDriveDurationMinutes;

int totalNumberOfParkingMinutes;

int restNumberOfParkingMinutes;

float tankFillStateLiter;

float mileage;

int numberOfNoRefuels;

bool inUse;

};

} /* namespace drivenow */

#endif /* CARINFO_H_ */

*************************************************

File DefaultValues.h:

#ifndef DEFAULTVALUES_H_

#define DEFAULTVALUES_H_

/**

* Default values that are used if no command line parameters are specified

*/

#define CITY_WIDTH_KM 15

#define CITY_HEIGHT_KM 20

#define NUMBER_OF_CARS 100

#define SIMULATION_TIME_MIN (60 * 24 * 30)

#define CAR_USAGE_PROBABILITY 0.01

#define CAR_AVERAGE_SPEED_KMH 30.0

#define DRIVING_MINUTE_PRICE_EURO 0.32

#define PARKING_MINUTE_PRICE_EURO 0.15

#define REFUEL_PROBABILITY 0.06

#define MAX_PARKING_DURATION_MIN 15

#define TANK_SIZE_L 50.0

#define FUEL_USAGE_100KM 8.0

#define TANK_FILL_LEVEL_TO_GET_BONUS_MINUTES 25.0

#define REFUEL_DURATION_MIN 5

#define NEXT_REFUEL_STATION_DISTANCE_KM 10.0

#define NUMBER_OF_BONUS_MINUTES 30

#define MANUAL_REFUEL_COSTS 50.0

#define DURATION_TO_BECOME_EMPTY_CAR_MIN 60

#define SERVICE_VISITS_COSTS 100.0

#define SERVICE_VISIT_PROBABILITY 0.001

#define NUMBER_OF_BONUS_MINUTES_FOR_SERVICE_VISIT 120

#endif /* DEFAULTVALUES_H_ */

*************************************************

File Parameters.h:

#ifndef PARAMETERS_H_

#define PARAMETERS_H_

namespace drivenow

{

/**

* Command line parameters that can be specified by user

*/

class Parameters

{

public:

Parameters()

{

cityWidth = 0;

cityHeight = 0;

numberOfCars = 0;

simulationTimeMin = 0;

carUsageProbability = 0;

carAverageSpeedKmh = 0;

drivingMinutePriceEuro = 0;

parkingMinutePriceEuro = 0;

refuelProbability = 0;

maxParkingDurationMin = 0;

tankSizeL = 0;

fuelUsage100km = 0;

tankFillLevelToGetBonusMinutes = 0;

refuelDurationMin = 0;

nextRefuelStationDistanceKm = 0;

}

static const int MAX_LOG_FILE_NAME = 1024;

int cityWidth;

int cityHeight;

int numberOfCars;

int simulationTimeMin;

float carUsageProbability;

float carAverageSpeedKmh;

float drivingMinutePriceEuro;

float parkingMinutePriceEuro;

float refuelProbability;

int maxParkingDurationMin;

float tankSizeL;

float fuelUsage100km;

float tankFillLevelToGetBonusMinutes;

int refuelDurationMin;

float nextRefuelStationDistanceKm;

};

} /* namespace drivenow */

#endif /* PARAMETERS_H_ */

*************************************************

File Parser.h:

#ifndef PARSER_H_

#define PARSER_H_

namespace drivenow

{

class Parameters;

/**

* Class used to parse command line parameters

*/

class Parser

{

public:

/**

* Prints command line parameters

* @param outputFileDescriptor file descriptor to log file

* @param argc number of command line parameters

* @param argv array of command line parameters

*/

static void printCommandLineParameters(

FILE* outputFileDescriptor,

int argc,

char** argv);

/**

* Parses command line parameters

* @param outputFileDescriptor file descriptor to log file

* @param argc number of command line parameters

* @param argv array of command line parameters

* @param parameters object containing all command line parameters

*/

static void parseCommandLineParameters(

FILE* outputFileDescriptor,

int argc,

char** argv,

Parameters& parameters);

};

} /* namespace drivenow */

#endif /* PARSER_H_ */

*************************************************

File Parser.cpp:

#include "DefaultValues.h"

#include <cstdio>

#include <cstring>

#include <cstdlib>

#include "Parameters.h"

#include "Parser.h"

namespace drivenow

{

/**

* Prints C-style command line parameters

* @param outputFileDescriptor file descriptor for output file

* @param argc number of arguments

* @param argv command line parameters (array of strings)

*/

void Parser::printCommandLineParameters(

FILE* outputFileDescriptor,

int argc,

char** argv)

{

if (outputFileDescriptor == 0L)

{

printf("printCommandLineParameters(): empty file descriptor\n");

}

fprintf(outputFileDescriptor, "Command line parameters:\n");

for (int i = 0; i < argc; ++i)

{

fprintf(outputFileDescriptor, "%d: %s\n", i, argv[i]);

}

fprintf(outputFileDescriptor, "\n");

}

/**

* Parses C-style command line parameters

* @param outputFileDescriptor file descriptor for output file

* @param argc number of arguments

* @param argv command line parameters (array of strings)

* @param parameters reference to class containing all parameters

*/

void Parser::parseCommandLineParameters(

FILE* outputFileDescriptor,

int argc,

char** argv,

Parameters& parameters)

{

if (outputFileDescriptor == 0L)

{

printf("parseCommandLineParameters(): empty file descriptor\n");

}

for (int i = 1; i < argc; ++i)

{

if (strstr(argv[i], "-cityWidthKm=") != NULL)

{

const char* str = strstr(argv[i], "=");

if (str != NULL)

{

parameters.cityWidth = atoi(&str[1]);

}

}

else if (strstr(argv[i], "-cityHeightKm=") != NULL)

{

const char* str = strstr(argv[i], "=");

if (str != NULL)

{

parameters.cityHeight = atoi(&str[1]);

}

}

else if (strstr(argv[i], "-numberOfCars=") != NULL)

{

const char* str = strstr(argv[i], "=");

if (str != NULL)

{

parameters.numberOfCars = atoi(&str[1]);

}

}

else if (strstr(argv[i], "-simulationTimeMin=") != NULL)

{

const char* str = strstr(argv[i], "=");

if (str != NULL)

{

parameters.simulationTimeMin = atoi(&str[1]);

}

}

else if (strstr(argv[i], "-carUsageProbability=") != NULL)

{

const char* str = strstr(argv[i], "=");

if (str != NULL)

{

parameters.carUsageProbability = atof(&str[1]);

}

}

else if (strstr(argv[i], "-carAverageSpeedKmh=") != NULL)

{

const char* str = strstr(argv[i], "=");

if (str != NULL)

{

parameters.carAverageSpeedKmh = atof(&str[1]);

}

}

else if (strstr(argv[i], "-drivingMinutePriceEuro=") != NULL)

{

const char* str = strstr(argv[i], "=");

if (str != NULL)

{

parameters.drivingMinutePriceEuro = atof(&str[1]);

}

}

else if (strstr(argv[i], "-parkingMinutePriceEuro=") != NULL)

{

const char* str = strstr(argv[i], "=");

if (str != NULL)

{

parameters.parkingMinutePriceEuro = atof(&str[1]);

}

}

else if (strstr(argv[i], "-refuelProbability=") != NULL)

{

const char* str = strstr(argv[i], "=");

if (str != NULL)

{

parameters.refuelProbability = atof(&str[1]);

}

}

else if (strstr(argv[i], "-maxParkingDurationMin=") != NULL)

{

const char* str = strstr(argv[i], "=");

if (str != NULL)

{

parameters.maxParkingDurationMin = atoi(&str[1]);

}

}

else if (strstr(argv[i], "-tankSizeL=") != NULL)

{

const char* str = strstr(argv[i], "=");

if (str != NULL)

{

parameters.tankSizeL = atof(&str[1]);

}

}

else if (strstr(argv[i], "-fuelUsage100km=") != NULL)

{

const char* str = strstr(argv[i], "=");

if (str != NULL)

{

parameters.fuelUsage100km = atof(&str[1]);

}

}

else if (strstr(argv[i], "-tankFillLevelToGetBonusMinutes=") != NULL)

{

const char* str = strstr(argv[i], "=");

if (str != NULL)

{

parameters.tankFillLevelToGetBonusMinutes = atof(&str[1]);

}

}

else if (strstr(argv[i], "-refuelDurationMin=") != NULL)

{

const char* str = strstr(argv[i], "=");

if (str != NULL)

{

parameters.refuelDurationMin = atoi(&str[1]);

}

}

else if (strstr(argv[i], "-nextRefuelStationDistanceKm=") != NULL)

{

const char* str = strstr(argv[i], "=");

if (str != NULL)

{

parameters.nextRefuelStationDistanceKm = atof(&str[1]);

}

}

}

if (parameters.cityWidth == 0)

{

fprintf(outputFileDescriptor, "taking default value %d for city width\n", CITY_WIDTH_KM);

parameters.cityWidth = CITY_WIDTH_KM;

}

fprintf(outputFileDescriptor, "city width = %d km\n", parameters.cityWidth);

if (parameters.cityHeight == 0)

{

fprintf(outputFileDescriptor, "taking default value %d for city height\n", CITY_HEIGHT_KM);

parameters.cityHeight = CITY_HEIGHT_KM;

}

fprintf(outputFileDescriptor, "city height = %d km\n", parameters.cityHeight);

if (parameters.numberOfCars == 0)

{

fprintf(outputFileDescriptor, "taking default value %d for number of cars\n", NUMBER_OF_CARS);

parameters.numberOfCars = NUMBER_OF_CARS;

}

fprintf(outputFileDescriptor, "number of cars = %d\n", parameters.numberOfCars);

if (parameters.simulationTimeMin == 0)

{

fprintf(outputFileDescriptor, "taking default value %d for number of cars\n", SIMULATION_TIME_MIN);

parameters.simulationTimeMin = SIMULATION_TIME_MIN;

}

fprintf(outputFileDescriptor, "simulation time = %d min\n", parameters.simulationTimeMin);

if (parameters.carUsageProbability == 0)

{

fprintf(outputFileDescriptor, "taking default value %.02f for car usage probability\n", CAR_USAGE_PROBABILITY);

parameters.carUsageProbability = CAR_USAGE_PROBABILITY;

}

fprintf(outputFileDescriptor, "car usage probability = %.02f\n", parameters.carUsageProbability);

if (parameters.carAverageSpeedKmh == 0)

{

fprintf(outputFileDescriptor, "taking default value %02.02f for car average speed\n", CAR_AVERAGE_SPEED_KMH);

parameters.carAverageSpeedKmh = CAR_AVERAGE_SPEED_KMH;

}

fprintf(outputFileDescriptor, "car average speed = %02.02f km/h\n", parameters.carAverageSpeedKmh);

if (parameters.drivingMinutePriceEuro == 0)

{

fprintf(outputFileDescriptor, "taking default value %02.02f for driving minute price\n", DRIVING_MINUTE_PRICE_EURO);

parameters.drivingMinutePriceEuro = DRIVING_MINUTE_PRICE_EURO;

}

fprintf(outputFileDescriptor, "driving minute price = %02.02f Euro\n", parameters.drivingMinutePriceEuro);

if (parameters.parkingMinutePriceEuro == 0)

{

fprintf(outputFileDescriptor, "taking default value %02.02f for parking minute price\n", PARKING_MINUTE_PRICE_EURO);

parameters.parkingMinutePriceEuro = PARKING_MINUTE_PRICE_EURO;

}

fprintf(outputFileDescriptor, "parking minute price = %02.02f Euro\n", parameters.parkingMinutePriceEuro);

if (parameters.refuelProbability == 0)

{

fprintf(outputFileDescriptor, "taking default value %02.02f for refuel probability\n", REFUEL_PROBABILITY);

parameters.refuelProbability = REFUEL_PROBABILITY;

}

fprintf(outputFileDescriptor, "refuel probability = %02.02f\n", parameters.refuelProbability);

if (parameters.maxParkingDurationMin == 0)

{

fprintf(outputFileDescriptor, "taking default value %d for max parking duration\n", MAX_PARKING_DURATION_MIN);

parameters.maxParkingDurationMin = MAX_PARKING_DURATION_MIN;

}

fprintf(outputFileDescriptor, "max parking duration = %d min\n", parameters.maxParkingDurationMin);

if (parameters.tankSizeL == 0)

{

fprintf(outputFileDescriptor, "taking default value %02.02f for tank size\n", TANK_SIZE_L);

parameters.tankSizeL = TANK_SIZE_L;

}

fprintf(outputFileDescriptor, "tank size = %02.02f L\n", parameters.tankSizeL);

if (parameters.fuelUsage100km == 0)

{

fprintf(outputFileDescriptor, "taking default value %02.02f for fuel usage/100km\n", FUEL_USAGE_100KM);

parameters.fuelUsage100km = FUEL_USAGE_100KM;

}

fprintf(outputFileDescriptor, "fuel usage/100km = %02.02f L\n", parameters.fuelUsage100km);

if (parameters.tankFillLevelToGetBonusMinutes == 0)

{

fprintf(outputFileDescriptor, "taking default value %02.02f for tank fill level to get bonus minutes\n", TANK_FILL_LEVEL_TO_GET_BONUS_MINUTES);

parameters.tankFillLevelToGetBonusMinutes = TANK_FILL_LEVEL_TO_GET_BONUS_MINUTES;

}

fprintf(outputFileDescriptor, "tank fill level to get bonus minutes = %02.02f %%\n", parameters.tankFillLevelToGetBonusMinutes);

if (parameters.refuelDurationMin == 0)

{

fprintf(outputFileDescriptor, "taking default value %d for refuel duration\n", REFUEL_DURATION_MIN);

parameters.refuelDurationMin = REFUEL_DURATION_MIN;

}

fprintf(outputFileDescriptor, "refuel duration = %d min\n", parameters.refuelDurationMin);

if (parameters.nextRefuelStationDistanceKm == 0)

{

fprintf(outputFileDescriptor, "taking default value %02.02f for next refuel station distance\n", NEXT_REFUEL_STATION_DISTANCE_KM);

parameters.nextRefuelStationDistanceKm = NEXT_REFUEL_STATION_DISTANCE_KM;

}

fprintf(outputFileDescriptor, "next refuel station distance = %02.02f km\n", parameters.nextRefuelStationDistanceKm);

fprintf(outputFileDescriptor, "\n");

}

} /* namespace drivenow */

*************************************************

File RandomNumberGenerator.h:

#ifndef RANDOMNUMBERGENERATOR_H_

#define RANDOMNUMBERGENERATOR_H_

namespace drivenow

{

/**

* Class used to get random numbers

*/

class RandomNumberGenerator

{

public:

/**

* Returns uniformely distributed random number in [0.0, 1.0]

*/

static float getUniformDistributedRandomNumber(void);

/**

* Returns standard distributed random number

*/

static float getStandardDistributedRandomNumber(void);

};

} /* namespace drivenow */

#endif /* RANDOMNUMBERGENERATOR_H_ */

*************************************************

File RandomNumberGenerator.cpp:

#include "RandomNumberGenerator.h"

#include <cstdlib>

#include <cmath>

namespace drivenow

{

float RandomNumberGenerator::getUniformDistributedRandomNumber(void)

{

int random_variable = rand();

float f1 = (float) random_variable;

float f2 = (float) RAND_MAX;

float f3 = f1 / f2;

eturn f3;

}

float RandomNumberGenerator::getStandardDistributedRandomNumber(void)

{

float u1 = getUniformDistributedRandomNumber();

float u2 = getUniformDistributedRandomNumber();

return cos(2 * 3.14 * u1) * sqrt(-2.0 * log(u2));

}

} /* namespace drivenow */

*************************************************

File Simulator.h:

#ifndef SIMULATOR_H_

#define SIMULATOR_H_

#include <cstdio>

#include <vector>

#include "Parameters.h"

#include "CarInfo.h"

namespace drivenow

{

/**

* Class used to simulate drive now process of cars rental

*/

class Simulator

{

public:

/**

* Randomly generates start position for all cars

* @param parameters object containing all command line parameters

* @param cars vector of all cars

*/

static void generateStartPosition(

const Parameters& parameters,

std::vector<CarInfo>& cars);

/**

* Randomely chooses cars that will be used by clients

* @param outputFileDescriptor file descriptor to log file

* @param parameters object containing all command line parameters

* @param cars vector of all cars

* @param currentTime current time

* @param numberOfBonusMinutes total number of bonus minutes given to all clients

* @param numberOfEmptyCars total number of empty cars where manual refuel is needed

* @param numberOfServiceVisits total number of service visits

*/

static void chooseCarsForDriving(

FILE* outputFileDescriptor,

const Parameters& parameters,

std::vector<CarInfo>& cars,

int currentTime,

int& numberOfBonusMinutes,

int& numberOfEmptyCars,

int& numberOfServiceVisits);

/**

* Simulates car driving process, updates car position, car fuel state

* @param outputFileDescriptor file descriptor to log file

* @param parameters object containing all command line parameters

* @param cars vector of all cars

* @param numberOfDrivingMinutes total number of driving minutes of all clients

* @param numberOfParkingMinutes total number of parking minutes of all clients

*/

static void driveCars(

FILE* outputFileDescriptor,

const Parameters& parameters,

std::vector<CarInfo>& cars,

int& numberOfDrivingMinutes,

int& numberOfParkingMinutes);

/**

* Prints current car information

* @param outputFileDescriptor file descriptor to log file

* @param parameters object containing all command line parameters

* @param cars vector of all cars

*/

static void printCarInformation(

FILE* outputFileDescriptor,

const Parameters& parameters,

std::vector<CarInfo>& cars);

};

} /* namespace drivenow */

#endif /* SIMULATOR_H_ */

*************************************************

File Simulator.cpp:

#include "DefaultValues.h"

#include <cmath>

#include "Simulator.h"

#include "RandomNumberGenerator.h"

#include "Utilities.h"

using namespace std;

namespace drivenow

{

void Simulator::generateStartPosition(

const Parameters& parameters,

vector<CarInfo>& cars)

{

for (int i = 0; i < parameters.numberOfCars; ++i)

{

struct CarInfo& car = cars[i];

car.currentPositionX = RandomNumberGenerator::getUniformDistributedRandomNumber() * parameters.cityWidth;

car.currentPositionY = RandomNumberGenerator::getUniformDistributedRandomNumber() * parameters.cityHeight;

car.targetPositionX = 0;

car.targetPositionY = 0;

car.totalNumberOfParkingMinutes = 0;

car.restNumberOfParkingMinutes = 0;

car.tankFillStateLiter = parameters.tankSizeL;

car.mileage = 0;

car.inUse = false;

}

}

void Simulator::chooseCarsForDriving(

FILE* outputFileDescriptor,

const Parameters& parameters,

vector<CarInfo>& cars,

int currentTime,

int& numberOfBonusMinutes,

int& numberOfEmptyCars,

int& numberOfServiceVisits)

{

for (int i = 0; i < parameters.numberOfCars; ++i)

{

struct CarInfo& car = cars[i];

if (!car.inUse)

{

float carUsageProbability = RandomNumberGenerator::getUniformDistributedRandomNumber();

//simulate lower night car usage probability

int dayTime = currentTime % (24 * 60);

if (dayTime > 18 * 60)

{

carUsageProbability *= 10.0;

}

if (carUsageProbability < parameters.carUsageProbability)

{

bool refuelWillBeDone = false;

if (Utilities::getTankFillState(parameters, car) < parameters.tankFillLevelToGetBonusMinutes)

{

if (RandomNumberGenerator::getUniformDistributedRandomNumber() < parameters.refuelProbability)

{

refuelWillBeDone = true;

car.numberOfNoRefuels = 0;

}

else

{

++car.numberOfNoRefuels;

if (car.numberOfNoRefuels >= DURATION_TO_BECOME_EMPTY_CAR_MIN)

{

++numberOfEmptyCars;

}

continue;

}

}

if (RandomNumberGenerator::getUniformDistributedRandomNumber() < SERVICE_VISIT_PROBABILITY)

{

++numberOfServiceVisits;

}

int targetPositionX;

int targetPositionY;

int numberOfRetries = 0;

while (numberOfRetries < 3)

{

float radius;

if (parameters.cityWidth < parameters.cityHeight)

{

radius = parameters.cityWidth;

}

else

{

radius = parameters.cityHeight;

}

radius /= 4.0;

float centerX = parameters.cityWidth / 2.0;

float centerY = parameters.cityHeight / 2.0;

float dx = centerX - car.currentPositionX;

float dy = centerY - car.currentPositionY;

if (dx * dx + dy * dy <= radius * radius)

{

//car is in center

targetPositionX = RandomNumberGenerator::getUniformDistributedRandomNumber() * parameters.cityWidth;

targetPositionY = RandomNumberGenerator::getUniformDistributedRandomNumber() * parameters.cityHeight;

}

else

{

//car is not in center

float r1 = RandomNumberGenerator::getStandardDistributedRandomNumber();

float r2 = RandomNumberGenerator::getStandardDistributedRandomNumber();

if (r1 >= 1.0 || r1 <= -1.0 || r2 >= 1.0 || r2 <= -1.0)

{

targetPositionX = parameters.cityWidth / 4.0 + 2.0 * radius * RandomNumberGenerator::getUniformDistributedRandomNumber();

targetPositionY = parameters.cityHeight / 4.0 + 2.0 * radius * RandomNumberGenerator::getUniformDistributedRandomNumber();

}

else

{

targetPositionX = centerX + r1 * parameters.cityWidth / 4.0;

targetPositionY = centerY + r2 * parameters.cityHeight / 4.0;

}

}

if (targetPositionX != car.currentPositionX

&& targetPositionY != car.currentPositionY)

{

break;

}

++numberOfRetries;

}

if (targetPositionX == car.currentPositionX

&& targetPositionY == car.currentPositionY)

{

continue;

}

car.inUse = true;

car.targetPositionX = targetPositionX;

car.targetPositionY = targetPositionY;

int x1 = car.currentPositionX;

int x2 = car.targetPositionX;

int dx = x2 - x1;

int y1 = car.currentPositionY;

int y2 = car.targetPositionY;

int dy = y2 - y1;

car.totalDistance = sqrt(dx * dx + dy * dy);

if (refuelWillBeDone)

{

car.totalDistance += parameters.nextRefuelStationDistanceKm;

}

car.totalDriveDurationMinutes = car.totalDistance / (parameters.carAverageSpeedKmh / 60.0);

if (car.totalDriveDurationMinutes == 0)

{

car.totalDriveDurationMinutes = 1;

}

car.restDistance = car.totalDistance;

car.restDriveDurationMinutes = car.totalDriveDurationMinutes;

car.totalNumberOfParkingMinutes = (int) (RandomNumberGenerator::getUniformDistributedRandomNumber() * parameters.maxParkingDurationMin);

if (refuelWillBeDone)

{

car.totalNumberOfParkingMinutes += parameters.refuelDurationMin;

car.tankFillStateLiter = parameters.tankSizeL;

numberOfBonusMinutes += NUMBER_OF_BONUS_MINUTES;

fprintf(outputFileDescriptor, "Refuel of car %d\n", i + 1);

}

car.restNumberOfParkingMinutes = car.totalNumberOfParkingMinutes;

}

}

}

}

void Simulator::driveCars(

FILE* outputFileDescriptor,

const Parameters& parameters,

vector<CarInfo>& cars,

int& numberOfDrivingMinutes,

int& numberOfParkingMinutes)

{

for (int i = 0; i < parameters.numberOfCars; ++i)

{

CarInfo& car = cars[i];

if (car.inUse)

{

if (car.restDriveDurationMinutes >= 1)

{

--car.restDriveDurationMinutes;

float distance1min = car.totalDistance / car.totalDriveDurationMinutes;

car.restDistance -= distance1min;

float spentFuel = distance1min * parameters.fuelUsage100km / 100.0;

car.tankFillStateLiter -= spentFuel;

}

else

{

if (car.restNumberOfParkingMinutes >= 1)

{

--car.restNumberOfParkingMinutes;

}

else

{

fprintf(outputFileDescriptor, "CAR %d ARRIVED (adding %d min)!\n", i + 1, car.totalDriveDurationMinutes);

car.inUse = false;

car.restDistance = 0.0;

numberOfDrivingMinutes += car.totalDriveDurationMinutes;

numberOfParkingMinutes += car.totalNumberOfParkingMinutes;

car.mileage += car.totalDistance;

car.restDistance = 0.0;

car.totalDistance = 0.0;

car.restDriveDurationMinutes = 0;

car.totalDriveDurationMinutes = 0;

car.targetPositionX = 0;

car.targetPositionY = 0;

car.restNumberOfParkingMinutes = 0;

car.totalNumberOfParkingMinutes = 0;

}

}

}

}

}

void Simulator::printCarInformation(

FILE* outputFileDescriptor,

const Parameters& parameters,

vector<CarInfo>& cars)

{

for (int i = 0; i < parameters.numberOfCars; ++i)

{

struct CarInfo& car = cars[i];

fprintf(outputFileDescriptor, "CAR %d: %s: (%02.02f, %02.02f) -> (%02.02f, %02.02f), %2.1f of %2.1f, %d of %d min, parking: %d of %d min, "

"tank: %d%%, "

"total: %dkm"

"\n",

i + 1, (car.inUse) ? "driving" : "free ",

car.currentPositionX, car.currentPositionY,

car.targetPositionX, car.targetPositionY,

car.totalDistance - car.restDistance, car.totalDistance,

car.totalDriveDurationMinutes - car.restDriveDurationMinutes, car.totalDriveDurationMinutes,

car.totalNumberOfParkingMinutes - car.restNumberOfParkingMinutes, car.totalNumberOfParkingMinutes,

Utilities::getTankFillState(parameters, car),

(int) car.mileage);

}

}

} /* namespace drivenow */

*************************************************

File Utilities.h:

#ifndef UTILITIES_H_

#define UTILITIES_H_

#include "Parameters.h"

#include "CarInfo.h"

namespace drivenow

{

/**

* Utilities class

*/

class Utilities

{

public:

/**

* Returns tank fill state

* @param parameters object containing all command line parameters

* @param car object containing car information

*/

static int getTankFillState(const Parameters& parameters, struct CarInfo& car);

};

} /* namespace drivenow */

#endif /* UTILITIES_H_ */

*************************************************

File Utilities.cpp:

#include "Utilities.h"

namespace drivenow

{

int Utilities::getTankFillState(const Parameters& parameters, struct CarInfo& car)

{

return (int) (car.tankFillStateLiter * 100.0 / parameters.tankSizeL);

}

} /* namespace drivenow */

*************************************************

File main.cpp:

#include "DefaultValues.h"

#include <cstdio>

#include <cstring>

#include <cstdlib>

#include <ctime>

#include <iostream>

#include <vector>

#include "Parameters.h"

#include "Parser.h"

#include "CarInfo.h"

#include "Simulator.h"

#include "RandomNumberGenerator.h"

#include "Utilities.h"

using namespace std;

using namespace drivenow;

/**

* Application entry point

* creates car objects and starts simulation

*/

int main(int argc, char** argv)

{

FILE* outputFileDescriptor = 0L;

int numberOfDrivingMinutes = 0;

int numberOfParkingMinutes = 0;

int numberOfBonusMinutes = 0;

int numberOfEmptyCars = 0;

int numberOfServiceVisits = 0;

Parameters parameters;

outputFileDescriptor = fopen("drivenow.log", "w");

Parser::printCommandLineParameters(outputFileDescriptor, argc, argv);

Parser::parseCommandLineParameters(outputFileDescriptor, argc, argv, parameters);

vector<CarInfo> cars;

//add cars to vector of cars

for (int i = 0; i < parameters.numberOfCars; ++i)

{

CarInfo car;

cars.push_back(car);

}

// use current time as seed for random generator

srand(time(0));

fprintf(outputFileDescriptor, "TIME 00d:00h:00min\n");

Simulator::generateStartPosition(parameters, cars);

Simulator::printCarInformation(outputFileDescriptor, parameters, cars);

int numberOfHours = 0;

int numberOfDays = 0;

for (int currentTime = 0; currentTime < parameters.simulationTimeMin; ++currentTime)

{

if (((currentTime + 1) % 60) == 0)

{

++numberOfHours;

if ((numberOfHours % 24) == 0)

{

++numberOfDays;

}

}

fprintf(

outputFileDescriptor,

"\nTIME %02dd:%02dh:%02dmin\n",

numberOfDays, numberOfHours % 24, (currentTime + 1) % 60);

Simulator::chooseCarsForDriving(

outputFileDescriptor,

parameters,

cars,

currentTime,

numberOfBonusMinutes,

numberOfEmptyCars,

numberOfServiceVisits);

Simulator::printCarInformation(

outputFileDescriptor,

parameters,

cars);

Simulator::driveCars(

outputFileDescriptor,

parameters,

cars,

numberOfDrivingMinutes,

numberOfParkingMinutes);

}

float drivingPrice = numberOfDrivingMinutes * parameters.drivingMinutePriceEuro;

float parkingPrice = numberOfParkingMinutes * parameters.parkingMinutePriceEuro;

float bonusMinutesPrice = numberOfBonusMinutes * parameters.drivingMinutePriceEuro;

float manualRefuelPrice = numberOfEmptyCars * MANUAL_REFUEL_COSTS;

float serviceVisitsPrice1 = numberOfServiceVisits * SERVICE_VISITS_COSTS;

float serviceVisitsPrice2 = numberOfServiceVisits * NUMBER_OF_BONUS_MINUTES_FOR_SERVICE_VISIT * parameters.drivingMinutePriceEuro;

float totalPrice1 = drivingPrice + parkingPrice - bonusMinutesPrice - manualRefuelPrice - serviceVisitsPrice1;

float totalPrice2 = drivingPrice + parkingPrice - bonusMinutesPrice - manualRefuelPrice - serviceVisitsPrice2;

fprintf(

outputFileDescriptor,

"\nTOTAL usage:\n"

"%d driving minutes, driving price = %.2f EUR\n"

"%d parking minutes, parking price = %.2f EUR\n"

"%d bonus minutes, bonus minutes price = %.2f EUR\n"

"%d empty cars, manuel refuel price = %.2f EUR\n"

"%d service visits, service visits price = %.2f EUR\n"

"%d service visits, bonus minutes price for service visits = %.2f EUR\n"

"total: %.2f EUR\n"

"total: %.2f EUR\n",

numberOfDrivingMinutes, drivingPrice,

numberOfParkingMinutes, parkingPrice,

numberOfBonusMinutes, bonusMinutesPrice,

numberOfEmptyCars, manualRefuelPrice,

numberOfServiceVisits, serviceVisitsPrice1,

numberOfServiceVisits, serviceVisitsPrice2,

totalPrice1,

totalPrice2);

fprintf(outputFileDescriptor, "\ndone.\n");

fclose(outputFileDescriptor);

return 0;

}

*************************************************

Размещено на Allbest.ru


Подобные документы

  • Сущность и подходы к определению правовой системы, ее формы и типы. Сравнительная характеристика различных правовых семей: романо-германской, англосаксонской и мусульманской. История и этапы их развития, анализ главных преимуществ и недостатков.

    курсовая работа [44,3 K], добавлен 15.11.2016

  • Ознакомление с государственной и муниципальной политикой в сфере развития системы дошкольного воспитания. Рассмотрение проблем в развитии системы дошкольного воспитания. Анализ предложений по развитию системы дошкольного воспитания в Дзержинске.

    дипломная работа [1,6 M], добавлен 05.04.2018

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

    реферат [43,6 K], добавлен 01.08.2010

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

    дипломная работа [138,3 K], добавлен 14.01.2014

  • Понятие про миграционную информациологию. Структурно-функциональный анализ правоотношений в подсистеме информатизации. Генезис паспортно-визовой системы. Автоматизированные системы управления в интересах правового регулирования миграционных процессов.

    курсовая работа [26,1 K], добавлен 18.01.2012

  • Раскрытие содержания понятия и определение роли принципов избирательной системы РФ. Анализ российской избирательной системы и определение её взаимосвязи с политической системой общества. Проблема развития и правовая оценка реформы избирательной системы.

    дипломная работа [133,9 K], добавлен 22.09.2011

  • Понятие системы права и основные признаки системы права. Структурные элементы системы права. Соотношение системы права и системы законодательства. Понятияе и признаки системы права как явления объективного порядка. Формирование отрасли законодательства.

    реферат [25,5 K], добавлен 05.01.2009

  • Понятие и структура политической системы. Модель политической системы Дэвида Истона, Габриэля Алмонда, Карла Дойча. Обзор нормативной основы составляющих политической системы: общественные объединения, идеология, институты конституционного контроля.

    дипломная работа [92,9 K], добавлен 27.10.2014

  • Характерные особенности организации избирательной системы. Классификация выборов по территориальному признаку, объекту и времени проведения. Мажоритарная, пропорциональная, смешанная избирательные системы. Анализ российской избирательной системы.

    контрольная работа [45,1 K], добавлен 04.10.2011

  • Правовой анализ избирательной системы и избирательного права. Основные виды избирательных систем и их характеристика. Особенности мажоритарной системы как системы абсолютного большинства. Правовой анализ пропорциональной и смешанной систем.

    курсовая работа [58,1 K], добавлен 27.08.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.