public ArrayList getSuccessors(object state) { RubickColorMatrix node = (RubickColorMatrix)state; ArrayList successors = new ArrayList(); RubickMovementTypes lastMove = node.stackSize > 0 ? node.moveStack[node.moveStack.Count - 1] : RubickMovementTypes.None; if (lastMove != RubickMovementTypes.None) { lastMove = (RubickMovementTypes)(-((int)lastMove)); } var moves = System.Enum.GetValues(typeof(RubickMovementTypes)); for (int i = 0; i < moves.Length; i++) { RubickMovementTypes val = (RubickMovementTypes)moves.GetValue(i); if (val != RubickMovementTypes.None && val != lastMove) { RubickColorMatrix clone = (RubickColorMatrix)node.Clone(); clone.Transform(val); successors.Add(new Successor(val.ToString(), clone)); } } return(successors); }
private void Transform(RubickMovementTypes _move, bool _save = true) { if (_save) { //UnityEngine.Debug.LogFormat("Move <b>{0}</b>", _move); m_moveStack.Add(_move); } //m_matrix.Transform(_move); m_pieces.ForEach(p => p.Transform(_move)); m_pieces.Sort((p1, p2) => { if (p1.state > p2.state) { return(1); } else if (p2.state > p1.state) { return(-1); } else { return(0); } }); }
public void Resolve() { rubickCube.Apply(); Problem problem = new Problem(rubickCube, new RubickSuccessorFunction(), new RubickGoalTest(), new RubickHeuristicFunction()); Search search = new IterativeDeepeningSearch(); //Search search = new AStarSearch(new GraphSearch()); SearchAgent agent = new SearchAgent(problem, search); int iterations = -1; ArrayList actions = agent.getActions(); Hashtable info = agent.getInstrumentation(); for (int i = 0; i < actions.Count; i++) { RubickMovementTypes move = (RubickMovementTypes)Enum.Parse(typeof(RubickMovementTypes), (string)actions[i]); rubickCube.Transform(move); } //aStarSearchTree.Search(rubickCube); //if (aStarSearchTree.result != null) //{ // rubickCube = aStarSearchTree.result; // iterations = aStarSearchTree.iterations; //} DispatchEvent(new RubickCubeResolvedOutputEvent((RubickColorMatrix)rubickCube.Clone(), iterations)); }
public static int GetEventIndex(RubickMovementTypes _moveType) { switch (_moveType) { case RubickMovementTypes.TopTurnRight: return(0); case RubickMovementTypes.TopTurnLeft: return(1); case RubickMovementTypes.BottomTurnRight: return(2); case RubickMovementTypes.BottomTurnLeft: return(3); case RubickMovementTypes.LeftTurnUp: return(4); case RubickMovementTypes.LeftTurnDown: return(5); case RubickMovementTypes.RightTurnUp: return(6); case RubickMovementTypes.RightTurnDown: return(7); } return(-1); }
private List <RubickColorMatrix> GetBestNeighbors(RubickColorMatrix _node) { List <RubickColorMatrix> neighbors = new List <RubickColorMatrix>(); int min = int.MaxValue; RubickColorMatrix minNeightbor = null; var moves = System.Enum.GetValues(typeof(RubickMovementTypes)); for (int i = 0; i < moves.Length; i++) { RubickMovementTypes val = (RubickMovementTypes)moves.GetValue(i); if (val != RubickMovementTypes.None) { RubickColorMatrix clone = (RubickColorMatrix)_node.Clone(); clone.Transform(val); int cost = clone.HeuristicCostEstimate(); if (cost < min) { min = cost; minNeightbor = clone; } } } if (min == _node.HeuristicCostEstimate()) { UnityEngine.Debug.Log("Duh"); } neighbors.Add(minNeightbor); return(neighbors); }
private List <RubickColorMatrix> GenerateNeighbors(RubickColorMatrix _node) { List <RubickColorMatrix> neighbors = new List <RubickColorMatrix>(); RubickMovementTypes lastMove = _node.stackSize > 0 ? _node.moveStack[_node.moveStack.Count - 1] : RubickMovementTypes.None; if (lastMove != RubickMovementTypes.None) { lastMove = (RubickMovementTypes)(-((int)lastMove)); } var moves = System.Enum.GetValues(typeof(RubickMovementTypes)); for (int i = 0; i < moves.Length; i++) { RubickMovementTypes val = (RubickMovementTypes)moves.GetValue(i); if (val != RubickMovementTypes.None && val != lastMove) { RubickColorMatrix clone = (RubickColorMatrix)_node.Clone(); clone.Transform(val); neighbors.Add(clone); } } return(neighbors); }
public void Shuffle(int _steps = 100) { Random rand = new Random(DateTime.Now.Millisecond); while (_steps > 0) { int num = rand.Next(4) + 1; num = rand.NextDouble() > 0.5 ? num : -num; RubickMovementTypes move = (RubickMovementTypes)num; Transform(move); _steps--; } }
private void Transform(RubickMovementTypes _move, bool _save = true) { if (_save) { m_moveStack.Add(_move); } switch (_move) { case RubickMovementTypes.TopTurnRight: TransformRow(0, -1); TransformRow(1, 1); break; case RubickMovementTypes.TopTurnLeft: TransformRow(0, 1); TransformRow(1, -1); break; case RubickMovementTypes.BottomTurnRight: TransformRow(2, 1); TransformRow(3, -1); break; case RubickMovementTypes.BottomTurnLeft: TransformRow(2, -1); TransformRow(3, 1); break; case RubickMovementTypes.LeftTurnUp: TransformColumn(0, 1); TransformColumn(1, -1); break; case RubickMovementTypes.LeftTurnDown: TransformColumn(0, -1); TransformColumn(1, 1); break; case RubickMovementTypes.RightTurnUp: TransformColumn(2, -1); TransformColumn(3, 1); break; case RubickMovementTypes.RightTurnDown: TransformColumn(2, 1); TransformColumn(3, -1); break; } }
private List <RubickMatrix> GenerateNeighbors(RubickMatrix _node) { List <RubickMatrix> neighbors = new List <RubickMatrix>(); var moves = System.Enum.GetValues(typeof(RubickMovementTypes)); for (int i = 0; i < moves.Length; i++) { RubickMovementTypes val = (RubickMovementTypes)moves.GetValue(i); if (val != RubickMovementTypes.None) { RubickMatrix clone = (RubickMatrix)_node.Clone(); clone.Transform(val); neighbors.Add(clone); } } return(neighbors); }
public void ApplyMove(RubickMovementTypes _move, bool animated = false) { Transform t = null; switch (_move) { case RubickMovementTypes.TopTurnRight: if (!animated) { TurnRight(pieces[0], pieces[1], pieces[4], pieces[5]); } else { StartCoroutine(TurnAnimated(new Vector3(0, -90, 0), pieces[0], pieces[1], pieces[4], pieces[5])); } t = pieces[0]; pieces[0] = pieces[4]; pieces[4] = pieces[5]; pieces[5] = pieces[1]; pieces[1] = t; break; case RubickMovementTypes.TopTurnLeft: if (!animated) { TurnLeft(pieces[0], pieces[1], pieces[4], pieces[5]); } else { StartCoroutine(TurnAnimated(new Vector3(0, 90, 0), pieces[0], pieces[1], pieces[4], pieces[5])); } t = pieces[0]; pieces[0] = pieces[1]; pieces[1] = pieces[5]; pieces[5] = pieces[4]; pieces[4] = t; break; case RubickMovementTypes.BottomTurnRight: if (!animated) { TurnRight(pieces[3], pieces[2], pieces[7], pieces[6]); } else { StartCoroutine(TurnAnimated(new Vector3(0, -90, 0), pieces[3], pieces[2], pieces[7], pieces[6])); } t = pieces[3]; pieces[3] = pieces[7]; pieces[7] = pieces[6]; pieces[6] = pieces[2]; pieces[2] = t; break; case RubickMovementTypes.BottomTurnLeft: if (!animated) { TurnLeft(pieces[3], pieces[2], pieces[7], pieces[6]); } else { StartCoroutine(TurnAnimated(new Vector3(0, 90, 0), pieces[3], pieces[2], pieces[7], pieces[6])); } t = pieces[3]; pieces[3] = pieces[2]; pieces[2] = pieces[6]; pieces[6] = pieces[7]; pieces[7] = t; break; case RubickMovementTypes.LeftTurnUp: if (!animated) { TurnUp(pieces[0], pieces[3], pieces[7], pieces[4]); } else { StartCoroutine(TurnAnimated(new Vector3(90, 0, 0), pieces[0], pieces[3], pieces[7], pieces[4])); } t = pieces[0]; pieces[0] = pieces[3]; pieces[3] = pieces[7]; pieces[7] = pieces[4]; pieces[4] = t; break; case RubickMovementTypes.LeftTurnDown: if (!animated) { TurnDown(pieces[0], pieces[3], pieces[7], pieces[4]); } else { StartCoroutine(TurnAnimated(new Vector3(-90, 0, 0), pieces[0], pieces[3], pieces[7], pieces[4])); } t = pieces[0]; pieces[0] = pieces[4]; pieces[4] = pieces[7]; pieces[7] = pieces[3]; pieces[3] = t; break; case RubickMovementTypes.RightTurnUp: if (!animated) { TurnUp(pieces[1], pieces[2], pieces[6], pieces[5]); } else { StartCoroutine(TurnAnimated(new Vector3(90, 0, 0), pieces[1], pieces[2], pieces[6], pieces[5])); } t = pieces[1]; pieces[1] = pieces[2]; pieces[2] = pieces[6]; pieces[6] = pieces[5]; pieces[5] = t; break; case RubickMovementTypes.RightTurnDown: if (!animated) { TurnDown(pieces[1], pieces[2], pieces[6], pieces[5]); } else { StartCoroutine(TurnAnimated(new Vector3(-90, 0, 0), pieces[1], pieces[2], pieces[6], pieces[5])); } t = pieces[1]; pieces[1] = pieces[5]; pieces[5] = pieces[6]; pieces[6] = pieces[2]; pieces[2] = t; break; default: break; } }
private void AnimatemMovement(RubickMovementTypes _move) { }
public void Transform(RubickMovementTypes _moveType) { int eventIndex = GetEventIndex(_moveType); int oldState = state; state = s_stateTrasitionTable[state, eventIndex]; if (oldState == state) { return; } ClearAux(); if (oldState == 0) { if (_moveType == RubickMovementTypes.TopTurnRight) { m_dataAux[FRONT] = data[LEFT]; m_dataAux[RIGHT] = data[FRONT]; m_dataAux[UP] = data[UP]; } else if (_moveType == RubickMovementTypes.LeftTurnDown) { m_dataAux[LEFT] = data[LEFT]; m_dataAux[DOWN] = data[FRONT]; m_dataAux[FRONT] = data[UP]; } else if (_moveType == RubickMovementTypes.TopTurnLeft) { m_dataAux[BACK] = data[LEFT]; m_dataAux[LEFT] = data[FRONT]; m_dataAux[UP] = data[UP]; } else if (_moveType == RubickMovementTypes.LeftTurnUp) { m_dataAux[LEFT] = data[LEFT]; m_dataAux[UP] = data[FRONT]; m_dataAux[BACK] = data[UP]; } } else if (oldState == 1) { if (_moveType == RubickMovementTypes.TopTurnRight) { m_dataAux[BACK] = data[RIGHT]; m_dataAux[RIGHT] = data[FRONT]; m_dataAux[UP] = data[UP]; } else if (_moveType == RubickMovementTypes.TopTurnLeft) { m_dataAux[FRONT] = data[RIGHT]; m_dataAux[LEFT] = data[FRONT]; m_dataAux[UP] = data[UP]; } else if (_moveType == RubickMovementTypes.RightTurnUp) { m_dataAux[RIGHT] = data[RIGHT]; m_dataAux[UP] = data[FRONT]; m_dataAux[BACK] = data[UP]; } else if (_moveType == RubickMovementTypes.RightTurnDown) { m_dataAux[RIGHT] = data[RIGHT]; m_dataAux[DOWN] = data[FRONT]; m_dataAux[FRONT] = data[UP]; } } else if (oldState == 2) { if (_moveType == RubickMovementTypes.BottomTurnLeft) { m_dataAux[FRONT] = data[RIGHT]; m_dataAux[LEFT] = data[FRONT]; m_dataAux[DOWN] = data[DOWN]; } else if (_moveType == RubickMovementTypes.BottomTurnRight) { m_dataAux[BACK] = data[RIGHT]; m_dataAux[RIGHT] = data[FRONT]; m_dataAux[DOWN] = data[DOWN]; } else if (_moveType == RubickMovementTypes.RightTurnUp) { m_dataAux[RIGHT] = data[RIGHT]; m_dataAux[UP] = data[FRONT]; m_dataAux[FRONT] = data[DOWN]; } else if (_moveType == RubickMovementTypes.RightTurnDown) { m_dataAux[RIGHT] = data[RIGHT]; m_dataAux[DOWN] = data[FRONT]; m_dataAux[BACK] = data[DOWN]; } } else if (oldState == 3) { if (_moveType == RubickMovementTypes.BottomTurnLeft) { m_dataAux[LEFT] = data[FRONT]; m_dataAux[BACK] = data[LEFT]; m_dataAux[DOWN] = data[DOWN]; } else if (_moveType == RubickMovementTypes.BottomTurnRight) { m_dataAux[RIGHT] = data[FRONT]; m_dataAux[FRONT] = data[LEFT]; m_dataAux[DOWN] = data[DOWN]; } else if (_moveType == RubickMovementTypes.LeftTurnUp) { m_dataAux[UP] = data[FRONT]; m_dataAux[LEFT] = data[LEFT]; m_dataAux[FRONT] = data[DOWN]; } else if (_moveType == RubickMovementTypes.LeftTurnDown) { m_dataAux[DOWN] = data[FRONT]; m_dataAux[LEFT] = data[LEFT]; m_dataAux[BACK] = data[DOWN]; } } else if (oldState == 4) { if (_moveType == RubickMovementTypes.TopTurnLeft) { m_dataAux[UP] = data[UP]; m_dataAux[RIGHT] = data[BACK]; m_dataAux[BACK] = data[LEFT]; } else if (_moveType == RubickMovementTypes.TopTurnRight) { m_dataAux[UP] = data[UP]; m_dataAux[LEFT] = data[BACK]; m_dataAux[FRONT] = data[LEFT]; } else if (_moveType == RubickMovementTypes.LeftTurnUp) { m_dataAux[BACK] = data[UP]; m_dataAux[DOWN] = data[BACK]; m_dataAux[LEFT] = data[LEFT]; } else if (_moveType == RubickMovementTypes.LeftTurnDown) { m_dataAux[FRONT] = data[UP]; m_dataAux[UP] = data[BACK]; m_dataAux[LEFT] = data[LEFT]; } } else if (oldState == 5) { if (_moveType == RubickMovementTypes.TopTurnLeft) { m_dataAux[UP] = data[UP]; m_dataAux[RIGHT] = data[BACK]; m_dataAux[FRONT] = data[RIGHT]; } else if (_moveType == RubickMovementTypes.TopTurnRight) { m_dataAux[UP] = data[UP]; m_dataAux[LEFT] = data[BACK]; m_dataAux[BACK] = data[RIGHT]; } else if (_moveType == RubickMovementTypes.RightTurnUp) { m_dataAux[BACK] = data[UP]; m_dataAux[DOWN] = data[BACK]; m_dataAux[RIGHT] = data[RIGHT]; } else if (_moveType == RubickMovementTypes.RightTurnDown) { m_dataAux[FRONT] = data[UP]; m_dataAux[UP] = data[BACK]; m_dataAux[RIGHT] = data[RIGHT]; } } else if (oldState == 6) { if (_moveType == RubickMovementTypes.BottomTurnLeft) { m_dataAux[DOWN] = data[DOWN]; m_dataAux[RIGHT] = data[BACK]; m_dataAux[FRONT] = data[RIGHT]; } else if (_moveType == RubickMovementTypes.BottomTurnRight) { m_dataAux[DOWN] = data[DOWN]; m_dataAux[LEFT] = data[BACK]; m_dataAux[BACK] = data[RIGHT]; } else if (_moveType == RubickMovementTypes.RightTurnUp) { m_dataAux[FRONT] = data[DOWN]; m_dataAux[DOWN] = data[BACK]; m_dataAux[RIGHT] = data[RIGHT]; } else if (_moveType == RubickMovementTypes.RightTurnDown) { m_dataAux[BACK] = data[DOWN]; m_dataAux[UP] = data[BACK]; m_dataAux[RIGHT] = data[RIGHT]; } } else if (oldState == 7) { if (_moveType == RubickMovementTypes.BottomTurnLeft) { m_dataAux[DOWN] = data[DOWN]; m_dataAux[RIGHT] = data[BACK]; m_dataAux[BACK] = data[LEFT]; } else if (_moveType == RubickMovementTypes.BottomTurnRight) { m_dataAux[DOWN] = data[DOWN]; m_dataAux[LEFT] = data[BACK]; m_dataAux[FRONT] = data[LEFT]; } else if (_moveType == RubickMovementTypes.LeftTurnUp) { m_dataAux[FRONT] = data[DOWN]; m_dataAux[DOWN] = data[BACK]; m_dataAux[LEFT] = data[LEFT]; } else if (_moveType == RubickMovementTypes.LeftTurnDown) { m_dataAux[BACK] = data[DOWN]; m_dataAux[UP] = data[BACK]; m_dataAux[LEFT] = data[LEFT]; } } Array.Copy(m_dataAux, data, LENGTH); }