// This runs a single trial/instance of the QState problem. QLearner will automatically run many times for learning or once to apply what has been learned. // Must return the final state public override QState Run(QState currentState, int trialNum, decimal learn, decimal discount, decimal explore) { while (!currentState.IsEnd() && currentState.GetActions().Length > 0 && isRunning) { QAction action = currentState.GetActions().ElementAt(r.Next(currentState.GetActions().Length)); QState newState = currentState.GetNewState(action); newState.Inherit(currentState); newState.Step(); WriteOutput((CurrentMode == LEARN ? "Trial " + trialNum + ", " : "") + ": '" + action + "' @ " + currentState.ToString()); currentState = newState; } return(currentState); }
// This runs a single trial/instance of the QState problem. QLearner will automatically run many times for learning or once to apply what has been learned. // Must return the final state public override QState Run(QState currentState, int trialNum, decimal learn, decimal discount, decimal explore) { while (!currentState.IsEnd() && currentState.GetActions().Length > 0 && isRunning) { QAction action = currentState.GetActions().ElementAt(r.Next(currentState.GetActions().Length)); QState newState = currentState.GetNewState(action); newState.Inherit(currentState); newState.Step(); WriteOutput((CurrentMode == LEARN ? "Trial " + trialNum + ", " : "") + ": '" + action + "' @ " + currentState.ToString()); currentState = newState; } return currentState; }
public override QState Run(QState currentState, int trialNum, decimal learn, decimal discount, decimal explore) { QSearch qsearch = new QSearch(this); QSearchResult actions = qsearch.Breadth_First(currentState, true); if (actions != null) { foreach (QAction action in actions.actionsList) { if (!currentState.IsEnd() && isRunning && currentState.GetActions().Contains(action)) { WriteOutput(currentState + ": " + action); QState newState = currentState.GetNewState(action); newState.Inherit(currentState); newState.Step(); currentState = newState; } } if (currentState.IsEnd()) WriteOutput(currentState + ": End"); else { WriteOutput("Existing solution no longer applicable. Re-solving..."); return Run(currentState, trialNum, learn, discount, explore); } } else WriteOutput("No solution found.", true); return currentState; }
public override QState Run(QState currentState, int trialNum, decimal learn, decimal discount, decimal explore) { QSearch qsearch = new QSearch(this); QSearchResult actions = qsearch.Depth_First(currentState, true); if (actions != null) { foreach (QAction action in actions.actionsList) { if (!currentState.IsEnd() && isRunning && currentState.GetActions().Contains(action)) { WriteOutput(currentState + ": " + action); QState newState = currentState.GetNewState(action); newState.Inherit(currentState); newState.Step(); currentState = newState; } } if (currentState.IsEnd()) { WriteOutput(currentState + ": End"); } else { WriteOutput("Existing solution no longer applicable. Re-solving..."); return(Run(currentState, trialNum, learn, discount, explore)); } } else { WriteOutput("No solution found.", true); } return(currentState); }
public QSearchResult Breadth_First(QState startState, bool output = false) { HashSet <QState> explored = new HashSet <QState>(); Dictionary <QState, decimal> bestSoFar = new Dictionary <QState, decimal>() { { startState, 0 } }; Queue <QState> toDo = new Queue <QState>(); toDo.Enqueue(startState); Dictionary <QState, QSearchResult> pathTo = new Dictionary <QState, QSearchResult>() { { startState, new QSearchResult() } }; if (output) { WriteOutput("Searching for shortest path via Breadth-First Search..."); } int steps = 0; while (toDo.Any() && isRunning) { steps++; QState current = toDo.Dequeue(); if (current.IsEnd()) { if (output) { WriteOutput("Shortest path of " + pathTo[current].Count + " step(s) found after " + steps + " iteration(s)."); } return(pathTo[current]); } else { explored.Add(current); foreach (QAction action in current.GetActions()) { QState newState = current.GetNewState(action); if (!explored.Contains(newState)) { decimal actualCost = bestSoFar[current] - current.GetValue(); if (!bestSoFar.ContainsKey(newState) || actualCost < bestSoFar[newState]) { pathTo[newState] = new QSearchResult(pathTo[current]); pathTo[newState].actionsList.Add(action); pathTo[newState].QStatesList.Add(newState); bestSoFar[newState] = actualCost; toDo.Enqueue(newState); } } } } } if (output) { WriteOutput("No path found after " + steps + " iteration(s)."); } return(null); }
public QSearchResult AStar(QState startState, bool output = false, int maxQueue = 1000) { HashSet <QState> explored = new HashSet <QState>(); Dictionary <QState, decimal> bestSoFar = new Dictionary <QState, decimal>() { { startState, 0 } }; HeapPriorityQueue <QStateContainer> toDo = new HeapPriorityQueue <QStateContainer>(maxQueue); toDo.Enqueue(new QStateContainer(startState), 0); Dictionary <QState, QSearchResult> pathTo = new Dictionary <QState, QSearchResult>() { { startState, new QSearchResult() } }; if (output) { WriteOutput("Searching for shortest path via A-Star Search..."); } int steps = 0; while (toDo.Count > 0 && isRunning) { steps++; QState current = toDo.Dequeue().qstate; if (current.IsEnd()) { if (output) { WriteOutput("Shortest path of " + pathTo[current].Count + " step(s) found after " + steps + " iteration(s)."); } return(pathTo[current]); } else { explored.Add(current); foreach (QAction action in current.GetActions()) { QState newState = current.GetNewState(action); if (!explored.Contains(newState)) { decimal actualCost = bestSoFar[current] - current.GetValue(); if (!bestSoFar.ContainsKey(newState) || actualCost < bestSoFar[newState]) { pathTo[newState] = new QSearchResult(pathTo[current]); pathTo[newState].actionsList.Add(action); pathTo[newState].QStatesList.Add(newState); bestSoFar[newState] = actualCost; toDo.Enqueue(new QStateContainer(newState), bestSoFar[newState] - 1 * newState.GetValueHeuristic()); } } } } } if (output) { WriteOutput("No path found after " + steps + " iteration(s)."); } return(null); }
// Return list of all possible states that can result from an action taken from the current state protected virtual List<QStateActionPair> GetOutcomes(QState state) { return state.GetActions().Select(x => new QStateActionPair(state, x)).ToList() ; }
// Return list of all possible states that can result from an action taken from the current state protected virtual List <QStateActionPair> GetOutcomes(QState state) { return(state.GetActions().Select(x => new QStateActionPair(state, x)).ToList()); }
public override Dictionary<QStateActionPair, QState> GetObservedStates(QState prevState, QAction action) { Maze m = (Maze)prevState; Dictionary<QStateActionPair, QState> otherMoves = new Dictionary<QStateActionPair, QState>(); foreach (QAction a in prevState.GetActions()) { Maze potentialMove = (Maze)m.GetNewState(a); potentialMove.opponent = opponent.ToList(); } return otherMoves; }