void CNature::ProcessModel(CView *pEngine) { CField *pField = static_cast<CTrafficLightDoc *>(pEngine->GetDocument())->GetField(); m_pOptimalTLight->SetNumbersOfLines(pField->GetNCarLines(), pField->GetNHumanLines()); CCarStreamDisctrib *pCarDistrib = new CCarStreamDisctrib(); Days day = Monday; int time = 0; Weather weather = Sunny; TrafficLightType TLightType = Smart; int roadLen1 = pField->GetXMax()*(1-pField->GetPercentOfPedestrianCrossing()); int roadLen2 = pField->GetYMax()*(1-pField->GetPercentOfCarRoad()); m_pOptimalTLight->TeachYourSelf(m_SpeedHumanAppearance, m_SpeedCarAppearance, roadLen1, roadLen2); while (true) { if (m_Paused) { while (m_Paused) { Sleep(100); }; pField->DeleteAllMO(); if (pInfoPanel != NULL) { int Hours; int Minutes; day = pInfoPanel->GetDay(); pInfoPanel->GetTime(Hours, Minutes); GetTicsByTime(Hours, Minutes, time); weather = pInfoPanel->GetWeather(); TLightType = pInfoPanel->GetTrafficLightType(); } else { day = Monday; time = 0; weather = Sunny; TLightType = Smart; }; }; for (; (day <= Sunday)&&(!m_Paused); day = static_cast<Days>(static_cast<int>(day) + 1)) { float RedTime; float GreenTime; float YellowTime; int Counter; for (; (time < m_CyclesPerDay)&&(!m_Paused); time++, Counter++) { Times TypeOfTime; int Hours; int Minutes; GetTimeByTics(time, Hours, Minutes); if ((Hours>=6)&&(Hours < 8)) { TypeOfTime = EarlyMorning; } else { if ((Hours>=8)&&(Hours<11)) { TypeOfTime = Morning; } else { if ((Hours>=11)&&(Hours<16)) { TypeOfTime = Afternoon; } else { if ((Hours>=16)&&(Hours<21)) { TypeOfTime = Everning; } else { TypeOfTime = Night; }; }; }; }; //Generate weather (obsolete, now it is setted by GUI) //if (time % (m_CyclesPerDay/5) == 0) //{ // weather = static_cast<Weather>(rand() % 3); //}; int day1 = ((day!=Saturday)&&(day!=Sunday))?(Workday):(Holiday); if ((time % m_CyclesPerTrafficLight) == 0) { if (TLightType == Ordinary) { RedTime = m_CyclesPerTrafficLight * 0.4; GreenTime = m_CyclesPerTrafficLight * 0.4; YellowTime = m_CyclesPerTrafficLight * 0.2; } else { bool DayObserved; bool TimeObserved; bool WeatherObserved; if (pInfoPanel != NULL) { pInfoPanel->GetObservation(DayObserved, TimeObserved, WeatherObserved); }; m_pOptimalTLight->SetType(static_cast<DayType>(day1), TypeOfTime, weather); m_pOptimalTLight->SetObserved(DayObserved, TimeObserved, WeatherObserved); m_pOptimalTLight->Solve(-1,-1); int Strategy = m_pOptimalTLight->GetOptValue(); GreenTime = m_CyclesPerTrafficLight*0.8*m_TrafficLightVariants[Strategy]; YellowTime = m_CyclesPerTrafficLight * 0.2; RedTime = m_CyclesPerTrafficLight - GreenTime - YellowTime; }; pInfoPanel->SetTrafficLightDistribution((float)GreenTime/m_CyclesPerTrafficLight, (float)RedTime/m_CyclesPerTrafficLight, (float)YellowTime/m_CyclesPerTrafficLight); Counter = 0; TMode = Green; }; if (Counter >= GreenTime) { TMode = Yellow; }; if (Counter >= GreenTime + YellowTime/2) { TMode = Red; }; if (Counter >= GreenTime + YellowTime/2 + RedTime) { TMode = Yellow; }; CMovingObject *pObject; #ifdef CONST_NUMBER_OF_MO for (int car = 0; car < static_cast<int>(m_SpeedCarAppearance[day1][TypeOfTime][weather]); car++) { pObject = new CCar(); pField->AddObject(pObject); }; if (rand() <= RAND_MAX*(m_SpeedCarAppearance[day1][TypeOfTime][weather] - static_cast<int>(m_SpeedCarAppearance[day1][TypeOfTime][weather]))) { pObject = new CCar(); pField->AddObject(pObject); }; for (int human = 0; human < static_cast<int>(m_SpeedHumanAppearance[day1][TypeOfTime][weather]); human++) { pObject = new CHuman(); pField->AddObject(pObject); }; if (rand() <= RAND_MAX*(m_SpeedHumanAppearance[day1][TypeOfTime][weather] - static_cast<int>(m_SpeedHumanAppearance[day1][TypeOfTime][weather]))) { pObject = new CHuman(); pField->AddObject(pObject); }; #else pCarDistrib->SetLambda(m_SpeedCarAppearance[day1][TypeOfTime][weather]); int NNewCars = pCarDistrib->getPuassonValue(); for (int car = 0; car < NNewCars; car++) { pObject = new CCar(); pField->AddObject(pObject); }; pCarDistrib->SetLambda(m_SpeedHumanAppearance[day1][TypeOfTime][weather]); int NNewHumans = pCarDistrib->getPuassonValue(); for (int human = 0; human < NNewHumans; human++) { pObject = new CHuman(); pField->AddObject(pObject); }; #endif pField->SetTrafficLightForCars(TMode); pField->Move(); if (pInfoPanel != NULL) { pInfoPanel->SetDay(day); pInfoPanel->SetTime(Hours, Minutes); pInfoPanel->SetNumbersOfCarsAndHumans(pField->GetNumberOfCars(), pField->GetNumberOfHumans()); pInfoPanel->SetSpeedOfCarsAndHumans(CCar::GetDefaultSpeed(), CHuman::GetDefaultSpeed()); pInfoPanel->SetSpeedOfCarAndHumanAppearance(m_SpeedCarAppearance[day1][TypeOfTime][weather], m_SpeedHumanAppearance[day1][TypeOfTime][weather]); pInfoPanel->Invalidate(FALSE); }; pEngine->Invalidate(FALSE); Sleep(10); }; time = 0; }; day = Monday; }; delete pCarDistrib; }