Скачиваний:
10
Добавлен:
17.06.2016
Размер:
7.16 Кб
Скачать
#include "stdafx.h"
#include "IterationCircleMoment.h"
#include "Aircraft.h"
#include <math.h>       /* round, floor, ceil, trunc */
#include <stdlib.h>     /* srand, rand */
#include <time.h>       /* time */
#include <algorithm>    // std::sort

namespace OEMInf
{

	IterationCircleMoment::IterationCircleMoment(int middleNewBidArrivingTimeOut, int variationNewBidArrivingTimeOut, int middleNewBidArrivingTimeIn, int variationNewBidArrivingTimeIn)
	{
		currentTime = 0;
		previousTime = 0;
		bidTimeIn = 0;
		bidTimeOut = 0;
		releaseTime = 0;
		timeOut = 0;
		loadTime = 0;
		maxCircle = 0;
		maxTailIn = 0;
		maxTailOut = 0;
		all = 0;
		counterOfCancelledBids = 0;
		counterOfServedBidsOut = 0;
		counterOfServedBidsIn = 0;
		//aircraftInBuffer = null;
		//aircraftOutBuffer = null;
		isRunwayLoad = false;
		this->middleNewBidArrivingTimeOut = middleNewBidArrivingTimeOut;
		this->middleNewBidArrivingTimeIn = middleNewBidArrivingTimeIn;
		this->variationNewBidArrivingTimeOut = variationNewBidArrivingTimeOut;
		this->variationNewBidArrivingTimeIn = variationNewBidArrivingTimeIn;
	}

	int IterationCircleMoment::makeRandomTime(int middle, int variation)
	{
		int min = middle - variation;
		int second = middle + variation - min;
		float r = (static_cast<float>(rand()) / std::numeric_limits<short>::max());
		float doubleTime = r * second + min;
		int intTime = ceil(doubleTime);
		return intTime;
	}

	bool CompareAircrafts(Aircraft *aircraft1, Aircraft *aircraft2) 
	{ 
		return aircraft1->time > aircraft2->time; 
	}

	void IterationCircleMoment::bidTimeProcedure(IterationCircleMoment *iteration)
	{
		if (iteration->bidTimeIn >= iteration->bidTimeOut)
		{ //время взлетать
			iteration->currentTime = iteration->bidTimeOut;
			iteration->isRunwayLoad = true;
			counterOfServedBidsOut++;
			iteration->releaseTime = iteration->currentTime + 2;
			if ((iteration->maxTailOut < aircraftOutBuffer.size()))
			{
				iteration->maxTailOut = aircraftOutBuffer.size();
			}
			iteration->aircraftOutBuffer.erase(iteration->aircraftOutBuffer.begin());
			Aircraft *out = new Aircraft(makeRandomTime(iteration->middleNewBidArrivingTimeOut, iteration->variationNewBidArrivingTimeOut) + iteration->currentTime);
			iteration->aircraftOutBuffer.push_back(out);
			iteration->all++;


			//тут надо отсортировать массив исходящих

			std::sort(aircraftOutBuffer.begin(), aircraftOutBuffer.end(), CompareAircrafts);
		}
		else
		{
			//время садиться
			iteration->currentTime = iteration->bidTimeIn;
			iteration->isRunwayLoad = true;
			counterOfServedBidsIn++;
			iteration->releaseTime = iteration->currentTime + 2;
			if ((iteration->maxTailIn < aircraftInBuffer.size()))
			{
				iteration->maxTailIn = aircraftInBuffer.size();
			}
			iteration->aircraftInBuffer.erase(iteration->aircraftInBuffer.begin());
			Aircraft *in_Renamed = new Aircraft(makeRandomTime(iteration->middleNewBidArrivingTimeIn, iteration->variationNewBidArrivingTimeIn) + iteration->currentTime, 0);
			iteration->aircraftInBuffer.push_back(in_Renamed);
			iteration->all++;

			//тут надо отсортировать массив входящих
			std::sort(aircraftInBuffer.begin(), aircraftInBuffer.end(), CompareAircrafts);
		}
		iteration->previousTime = iteration->currentTime;
		iteration->timeOut = iteration->currentTime;

	}

	void IterationCircleMoment::releaseTimeProcedure(IterationCircleMoment *iteration)
	{

		if (iteration->bidTimeOut < iteration->releaseTime || iteration->bidTimeIn < iteration->releaseTime)
		{
			if (iteration->bidTimeIn >= iteration->bidTimeOut)
			{
				iteration->currentTime = iteration->bidTimeOut;
				iteration->loadTime = iteration->loadTime + iteration->currentTime - iteration->previousTime;
				aircraftOutBuffer[0]->time++;
				if ((iteration->maxTailOut < aircraftOutBuffer.size()))
				{
					iteration->maxTailOut = aircraftOutBuffer.size();
				}
			}
			else
			{
				iteration->currentTime = iteration->bidTimeIn;
				iteration->loadTime = iteration->loadTime + iteration->currentTime - iteration->previousTime;
				if (iteration->aircraftInBuffer[0]->circle == 5)
				{
					counterOfCancelledBids++;
				}
				else
				{
					aircraftInBuffer[0]->circle++;
					if ((iteration->maxCircle < aircraftInBuffer[0]->circle))
					{
						iteration->maxCircle = aircraftInBuffer[0]->circle;
					}
					if ((iteration->maxTailIn < aircraftInBuffer.size()))
					{
						iteration->maxTailIn = aircraftInBuffer.size();
					}
					aircraftInBuffer[0]->time = aircraftInBuffer[0]->time + 4;
				}
			}
		}
		else
		{
			iteration->currentTime = iteration->releaseTime;
			iteration->loadTime = iteration->loadTime + iteration->currentTime - iteration->previousTime;
			iteration->isRunwayLoad = false;

		}
		iteration->previousTime = iteration->currentTime;
		iteration->timeOut = iteration->currentTime;
	}

	void IterationCircleMoment::main(int argc, _TCHAR* argv[])
	{
		srand(time(NULL));
		IterationCircleMoment *iteration = new IterationCircleMoment(10, 2, 10, 5);
		do
		{
			if (iteration->timeOut == 0)
			{
				Aircraft *in_Renamed = new Aircraft(makeRandomTime(iteration->middleNewBidArrivingTimeIn, iteration->variationNewBidArrivingTimeIn), 0);
				Aircraft *out = new Aircraft(makeRandomTime(iteration->middleNewBidArrivingTimeOut, iteration->variationNewBidArrivingTimeOut));
				iteration->aircraftInBuffer.push_back(in_Renamed);
				iteration->aircraftOutBuffer.push_back(out);
				iteration->releaseTime = std::numeric_limits<int>::max();
			}
			if (!iteration->aircraftOutBuffer.empty())
			{
				iteration->bidTimeOut = iteration->aircraftOutBuffer[0]->time;
			}
			else
			{
				iteration->bidTimeOut = std::numeric_limits<int>::max();
			}
			if (!iteration->aircraftInBuffer.empty())
			{
				iteration->bidTimeIn = iteration->aircraftInBuffer[0]->time;
			}
			else
			{
				iteration->bidTimeIn = std::numeric_limits<int>::max();
			}

			if (!iteration->isRunwayLoad)
			{
				iteration->bidTimeProcedure(iteration);
			}
			else
			{
				iteration->releaseTimeProcedure(iteration);
			}
		} while (iteration->timeOut < iteration->DEFAULT_ITERATION_TIME);

		std::wcout << iteration->counterOfServedBidsIn << std::wstring(L" BidsIn") << std::endl;
		std::wcout << iteration->counterOfServedBidsOut << std::wstring(L" BidsOut") << std::endl;
		std::wcout << iteration->counterOfCancelledBids << std::wstring(L" CancelllBids") << std::endl;
		std::wcout << iteration->maxCircle << std::endl;
		std::wcout << iteration->maxTailIn << std::endl;
		std::wcout << iteration->maxTailOut << std::endl;
		std::wcout << iteration->currentTime << std::wstring(L" currentTime") << std::endl;
		//System.out.println(iteration.all);
		std::wcout << iteration->loadTime << std::wstring(L" loadTime") << std::endl;
		float K = static_cast<float>(iteration->loadTime) / 1440.0;
		std::wcout << K << std::endl;
		int str;
		std::wcin >> str;
	}
}
Соседние файлы в папке ConsoleApplication1