public int ComputeProbabilisticDestinationFloor(int currentFloor, int floorBound) { double[] distrib = new double[floorBound + 1]; ProbabilityHelper.SetUniformDistribution(distrib); int expected = currentFloor + RelativeFloor; if (expected <= floorBound && expected >= 0) { distrib[expected] = SuccessProb; ProbabilityHelper.NormalizePdf(distrib, 0); } ProbabilityHelper.PdfToCdf(distrib); return(ProbabilityHelper.Sample(distrib)); }
/// <summary> /// Получить вероятностный индекс класса по распределению из матрицы ошибок /// </summary> /// <param name="trueClassName">Истинное название класса</param> /// <returns></returns> public int GetProbabalisticClassIndex(string trueClassName) { int trueClassIndex = Array.IndexOf(KnownClasses, trueClassName); if (trueClassIndex == -1) { trueClassIndex = Array.IndexOf(KnownClasses, ModelBase.UnknownClassName); } double[] distrib = new double[KnownClasses.Length]; for (int i = 0; i < KnownClasses.Length; i++) { distrib[i] = ConfusionMatrix[trueClassIndex, i]; } ProbabilityHelper.NormalizePdf(distrib, 0); ProbabilityHelper.PdfToCdf(distrib); return(ProbabilityHelper.Sample(distrib)); }
public Dictionary <string, double> Measure(ModelBase model, int orientation) { double[] distrib = new double[KnownClasses.Length]; if (new Random().NextDouble() < SuccessProb) { //Нормальная работа камеры var obj = _world.Find(model); int absOrientation = MathHelper.GetOneTurn(obj.Orientation + orientation); Point point = obj.Point + new Point(absOrientation); string seenClass = _world.FindOrDefault(point)?.Model.Class; if (seenClass == null) { seenClass = ModelBase.EmptyClassName; } //Превращение точного прогноза в вероятностное int probClassIndex = GetProbabalisticClassIndex(seenClass); //Составление распределения вероятности по предполагаемому классу for (int i = 0; i < KnownClasses.Length; i++) { distrib[i] = ConfusionMatrix[i, probClassIndex]; } ProbabilityHelper.NormalizePdf(distrib, 0); } else { //Сбой камеры - вероятность распределяется случайно ProbabilityHelper.SetRandomDistribution(distrib); } //Запись предсказания в словарь var prediction = new Dictionary <string, double>(); for (int i = 0; i < KnownClasses.Length; i++) { prediction.Add(KnownClasses[i], distrib[i]); } return(prediction); }