public void AddOptimizationRecord(int intersectionID, OptimizationRecord optRecord)
 {
     int cycle = optRecord.optimizeCycle;
     OptimizationRecords[intersectionID].Add(cycle, optRecord);
 }
        public void IntersectionOptimize()
        {
            if (currentCycle >= latestOptimizationCycle + optimizationInterval_Cycle) //確認是否達到優化週期限制
            {
                OptimizationRecord newOptimizationRecord = new OptimizationRecord(currentCycle,Simulator.getCurrentTime_Format(), currentIAWR, optimizationThreshold_IAWR);

                if (currentIAWR > this.optimizationThreshold_IAWR) //判斷是否需要優化
                {
                    stability = 0;
                    Simulator.UI.AddMessage("AI", "Intersection : " + intersectionID + "  IAWR : " + currentIAWR + "(" + latestOptimizationCycle + "~" + currentCycle + ")");

                    foreach (SignalConfig sc in signalConfigList)
                    {
                        newOptimizationRecord.AddOriginConfiguration(sc.ToString_Short());
                    }

                    TO.CleanRoadList();

                    foreach(Road r in roadList)
                    {
                        double avgAriRate_min = Simulator.DataManager.GetAvgArrivalRate_min(r.roadID, latestOptimizationCycle, currentCycle);
                        double avgDepartureRate_min = Simulator.DataManager.GetAvgDepartureRate_min(r.roadID, latestOptimizationCycle, currentCycle);
                        double avgWaitingVehicle = Simulator.DataManager.GetAvgWaittingVehicles(r.roadID, latestOptimizationCycle, currentCycle);
                        double avgWaitingRate = Simulator.DataManager.GetAvgWaittingRate(r.roadID, latestOptimizationCycle, currentCycle);
                        TO.AddRoad(r.roadID, r.phaseNo, signalConfigList[r.phaseNo].Green, signalConfigList[r.phaseNo].Red, avgAriRate_min, avgDepartureRate_min, avgWaitingVehicle, avgWaitingRate);
                    }

                    //optimization
                    Dictionary<int, int> optimizedGreenTime = TO.Optimization();

                    //new signal config
                    List<SignalConfig> optimizedConfig = new List<SignalConfig>();

                    //fill value
                    for (int i = 0; i < signalConfigList.Count; i++)
                    {
                        SignalConfig newConfig = new SignalConfig(optimizedGreenTime[i], 2);
                        optimizedConfig.Add(newConfig);
                    }

                    //apply
                    SetIntersectionSignalConfig(optimizedConfig);

                    foreach (SignalConfig sc in signalConfigList)
                    {
                        newOptimizationRecord.AddOptimizedConfiguration(sc.ToString_Short());
                    }

                }// if (IAWR > this.IAWRThreshold)
                else
                {
                    stability++;
                }

                latestOptimizationCycle = currentCycle;

                Simulator.DataManager.AddOptimizationRecord(intersectionID, newOptimizationRecord);

            } //if (currentCycle >= latestOptimizeCycle + optimizeInerval)
        }