// rewrite the spreaded detection values with zeroes public void SpreadZeroes(int id, Vector3 pos) { float[][] detection = new float[0][]; int minX = 0; int maxX = 0; int minY = 0; int maxY = 0; switch (_fitnessFunction) { case GameManager.FitnessFunctions.DetectionBased: detection = RouteOptimizer.SpreadDetection(new Vector2(pos.x, pos.y), this); minX = Mathf.Clamp((int)(pos.x) - RouteOptimizer.Radius, 0, _width - 1); maxX = Mathf.Clamp((int)(pos.x) + RouteOptimizer.Radius, 0, _width - 1); minY = Mathf.Clamp((int)(pos.y) - RouteOptimizer.Radius, 0, _height - 1); maxY = Mathf.Clamp((int)(pos.y) + RouteOptimizer.Radius, 0, _height - 1); break; case GameManager.FitnessFunctions.IntersectionBased: detection = RouteOptimizer2.SpreadDetection(new Vector2(pos.x, pos.y), this); minX = Mathf.Clamp((int)(pos.x) - RouteOptimizer2.Radius, 0, _width - 1); maxX = Mathf.Clamp((int)(pos.x) + RouteOptimizer2.Radius, 0, _width - 1); minY = Mathf.Clamp((int)(pos.y) - RouteOptimizer2.Radius, 0, _height - 1); maxY = Mathf.Clamp((int)(pos.y) + RouteOptimizer2.Radius, 0, _height - 1); break; case GameManager.FitnessFunctions.IntersectionScheme: detection = RouteOptimizer3.SpreadDetection(new Vector2(pos.x, pos.y), this); minX = Mathf.Clamp((int)(pos.x) - RouteOptimizer3.Radius, 0, _width - 1); maxX = Mathf.Clamp((int)(pos.x) + RouteOptimizer3.Radius, 0, _width - 1); minY = Mathf.Clamp((int)(pos.y) - RouteOptimizer3.Radius, 0, _height - 1); maxY = Mathf.Clamp((int)(pos.y) + RouteOptimizer3.Radius, 0, _height - 1); break; } for (int x = minX; x <= maxX; x++) { for (int y = minY; y < maxY; y++) { _grid[x][y].Detection[id] = 0f; } } }
// use GA to find the patrol route scheme and construct guards from them private void SetGuards() { GameObject tempGuard; Guard behavior; _guardControllers = new List <GuardController>(); List <SimpleRoute> lr = new List <SimpleRoute>(); switch (FitnessFunction) { case FitnessFunctions.DetectionBased: lr = RouteOptimizer.FindScheme(NumberOfGuards, CrossoverPerStage, MapGrid, NumberOfIterations, RouteGenotypeLength, MutationProbability, DetectionRadius, DetectionDecayTime, FitnessBinsX, FitnessBinsY, RandomSeed); break; case FitnessFunctions.IntersectionBased: lr = RouteOptimizer2.FindScheme(NumberOfGuards, CrossoverPerStage, MapGrid, NumberOfIterations, RouteGenotypeLength, MutationProbability, DetectionRadius, DetectionDecayTime, FitnessBinsX, FitnessBinsY, RandomSeed); break; case FitnessFunctions.IntersectionScheme: lr = RouteOptimizer3.FindScheme(NumberOfSchemes, NumberOfGuards, CrossoverPerStage, SimpleCrossover, MapGrid, NumberOfIterations, RouteGenotypeLength, MutationProbability, RouteMutationProbability, UseMinFunction, DetectionRadius, DetectionDecayTime, RandomSeed); break; } Vector2 curNode, prevNode; Color color; float totalFitness = 0f; for (int i = 0; i < NumberOfGuards; i++) { totalFitness += lr[i].Fitness; tempGuard = Instantiate(GuardPrefab, GuardContainer); behavior = new Guard(lr[i]); tempGuard.transform.position = new Vector3(lr[i].StartNode.x, lr[i].StartNode.y, 0f); do { color = new Color(Random.value, Random.value, Random.value); }while (color.grayscale > 0.75); tempGuard.GetComponent <GuardController>().color = color; curNode = lr[i].StartNode; MapGrid.ModifyNodeText(curNode, i.ToString()); for (int j = 0; j < lr[i].PatrolRoutePhen.Count; j++) { prevNode = curNode; curNode = MapGrid.Move(curNode, lr[i].PatrolRoutePhen[j].Direction); MapGrid.ModifyNodeText(curNode, i.ToString()); MapGrid.ModifyRouteDisplay(prevNode, curNode, lr[i].PatrolRoutePhen[j].Direction, color); } tempGuard.GetComponent <GuardController>().Behavior = behavior; tempGuard.GetComponent <GuardController>().SetAlarmLimits(MinOutputToCheck, MinOutputForAlarm); _guardControllers.Add(tempGuard.GetComponent <GuardController>()); } totalFitness /= NumberOfGuards; FitnessDisplayField.text += totalFitness.ToString(); }