Ejemplo n.º 1
0
    public void Mutate(BossDecisionNode node)
    {
        if (UnityEngine.Random.Range(0, 1.00f) <= MUTATIONCHANCE)
        {
            List <BossDecisionNode> matches = BossNodeData.FindMatches(node.left, node.right);

            node.heuristic = matches[UnityEngine.Random.Range(0, matches.Count)].heuristic;
        }

        if (node.left.heuristic != BossHeuristic.Heuristic.NONE)
        {
            Mutate(node.left);
        }
        else
        {
            if (UnityEngine.Random.Range(0, 1.00f) <= MUTATIONCHANCE)
            {
                node.left = actions[UnityEngine.Random.Range(0, actions.Count)];
            }
        }

        if (node.right.heuristic != BossHeuristic.Heuristic.NONE)
        {
            Mutate(node.right);
        }
        else
        {
            if (UnityEngine.Random.Range(0, 1.00f) <= MUTATIONCHANCE)
            {
                node.right = actions[UnityEngine.Random.Range(0, actions.Count)];
            }
        }
    }
Ejemplo n.º 2
0
    public void PrintTree(BossDecisionNode node)
    {
        Debug.Log(node);
        if (node.heuristic == BossHeuristic.Heuristic.NONE)
        {
            return;
        }

        PrintTree(node.left);
        PrintTree(node.right);
    }
Ejemplo n.º 3
0
    public static List <BossDecisionNode> FindMatches(BossDecisionNode m_left, BossDecisionNode m_right)
    {
        List <BossDecisionNode> nodeSpace = new List <BossDecisionNode>();

        foreach (BossDecisionNode node in nodeSpace)
        {
            bool add = false;

            foreach (BossNodeType leftType in m_left.nodeData.front)
            {
                if (node.nodeData.left.Contains(leftType))
                {
                    add = true;
                }
            }

            foreach (BossNodeType rightType in m_right.nodeData.front)
            {
                if (node.nodeData.right.Contains(rightType))
                {
                    add = true;
                }
            }

            if (add)
            {
                nodeSpace.Add(node);
            }
        }

        if (nodeSpace.Count == 0)
        {
            nodeSpace.Add(new BossDecisionNode(BossHeuristic.Heuristic.WEIGHTED, new BossNodeData(new List <BossNodeType>(new BossNodeType[] { (Random.Range(0, 1) > 0.5f) ? m_left.nodeData.front[0] : m_right.nodeData.front[0] }), new List <BossNodeType>(new BossNodeType[] { m_left.nodeData.front[0] }), new List <BossNodeType>(new BossNodeType[] { m_right.nodeData.front[0] }))));
        }

        return(nodeSpace);
    }
Ejemplo n.º 4
0
    public void GenerateTree(int m_points)
    {
        if (m_points < 2)
        {
            m_points = 2;
        }

        List <BossAction>       actionSpace         = new List <BossAction>();
        List <BossAction>       possibleActionSpace = Boss.Current().actions;
        List <BossAction>       requiredActionSpace = Boss.Current().requiredActions;
        List <BossDecisionNode> layerNodes          = new List <BossDecisionNode>();
        List <BossDecisionNode> newLayerNodes       = new List <BossDecisionNode>();

        for (int i = 0; i < m_points; i++)
        {
            actionSpace.Add(possibleActionSpace[Random.Range(0, possibleActionSpace.Count)]);
        }

        foreach (BossAction A in requiredActionSpace)
        {
            actionSpace.Add(A);
        }

        foreach (BossAction action in actionSpace)
        {
            layerNodes.Add(action);
        }

        do
        {
            newLayerNodes = new List <BossDecisionNode>();

            if (layerNodes.Count % 2 == 0)
            {
                for (int i = 0; i < layerNodes.Count - 1; i += 2)
                {
                    List <BossDecisionNode> nodeSpace = BossNodeData.FindMatches(layerNodes[i], layerNodes[i + 1]);
                    BossDecisionNode        node      = nodeSpace[Random.Range(0, nodeSpace.Count)];
                    node.left  = layerNodes[i];
                    node.right = layerNodes[i + 1];
                    newLayerNodes.Add(node);
                }

                layerNodes = newLayerNodes;
            }
            else
            {
                for (int i = 0; i < layerNodes.Count - 2; i += 2)
                {
                    List <BossDecisionNode> nodeSpace = BossNodeData.FindMatches(layerNodes[i], layerNodes[i + 1]);
                    BossDecisionNode        node      = nodeSpace[Random.Range(0, nodeSpace.Count)];
                    node.left  = layerNodes[i];
                    node.right = layerNodes[i + 1];
                    newLayerNodes.Add(node);
                }

                newLayerNodes.Add(layerNodes[layerNodes.Count - 1]);
                layerNodes = newLayerNodes;
            }
        } while (layerNodes.Count > 1);

        rootNode = layerNodes[0];
    }