/* * Copyright (c) 2005-2006 Erik Tigerholm * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ namespace OpenTraffic.Model.StopCriteria { using System; using System.Collections.Generic; using System.Text; using System.Xml.Serialization; using OpenTraffic.Model.Result; public class AverageAbsoluteDifference : AbstractStopCriteria { [XmlAttribute(AttributeName = "MaxValue")] public float MaxValue { get; set; } [XmlAttribute(AttributeName = "persistence")] public int persistence { get; set; } [XmlAttribute(AttributeName = "nOk")] public int nOk { get; set; } private AbstractStopCriteria.StopCriteriaFunction func; public AverageAbsoluteDifference(AbstractStopCriteria.StopCriteriaFunction func) { this.func = func; } public AverageAbsoluteDifference() { func = this.GetTravelTime; nOk = 3; } public AverageAbsoluteDifference(float maxValue, int persistence) { func = this.MeanFlowIn; nOk = persistence; this.persistence = persistence; this.MaxValue = maxValue; } public override bool CheckCriteria(ResultData newFrame, ResultData oldFrame, TrafficModel m) { float value = Compare(newFrame, oldFrame, m); Console.WriteLine("AAD(" + MaxValue + "): " + value); if (value > Math.Abs(MaxValue)) { nOk = persistence; return false; } else { nOk--; if (nOk < 0) return true; return false; } } public override float Compare(ResultData newFrame, ResultData oldFrame, TrafficModel m) { float value = 0; if (m != null) { if (oldFrame != null) { int nTest = 100; for (float i = oldFrame.startTime; i < oldFrame.stopTime; i += (oldFrame.stopTime - oldFrame.startTime) / nTest) { foreach (TrafficModelLink l in m.TrafficModelLinks) { float v1 = func(newFrame, i, l); float v2 = func(oldFrame, i, l); value += Math.Abs(v1 - v2); } } value = value / (nTest * m.TrafficModelLinks.Count); } } return value; } private float MeanFlowIn(ResultData oldFrame, float i, TrafficModelLink l) { return oldFrame.GetLinkResultFromTime(i, l).FlowIn; } private float GetTravelTime(ResultData oldFrame, float i, TrafficModelLink l) { float t1 = (oldFrame.GetTravelTime(i, l) == 0) ? l.CalculateFreeFlowTravelTime() : oldFrame.GetTravelTime(i, l); t1 += oldFrame.GetQueuingTime(i, l); return t1; } } }