Beispiel #1
0
    // 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;
            }
        }
    }
Beispiel #2
0
    // 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();
    }