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)]; } } }
public void PrintTree(BossDecisionNode node) { Debug.Log(node); if (node.heuristic == BossHeuristic.Heuristic.NONE) { return; } PrintTree(node.left); PrintTree(node.right); }
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); }
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]; }