/// <summary> /// Create a sensor that encodes the cell special types as observations. Returns null if the board's /// NumSpecialTypes is 0 (indicating the sensor isn't needed). /// </summary> /// <param name="board">The abstract board.</param> /// <param name="obsType">Whether to produce vector or visual observations</param> /// <param name="name">Name of the sensor.</param> /// <returns></returns> public static Match3Sensor SpecialTypeSensor(AbstractBoard board, Match3ObservationType obsType, string name) { var maxBoardSize = board.GetMaxBoardSize(); if (maxBoardSize.NumSpecialTypes == 0) { return(null); } var specialSize = maxBoardSize.NumSpecialTypes + 1; return(new Match3Sensor(board, board.GetSpecialType, specialSize, obsType, name)); }
/// <summary> /// Create a sensor for the GridValueProvider with the specified observation type. /// </summary> /// <remarks> /// Use Match3Sensor.CellTypeSensor() or Match3Sensor.SpecialTypeSensor() instead of calling /// the constructor directly. /// </remarks> /// <param name="board">The abstract board.</param> /// <param name="gvp">The GridValueProvider, should be either board.GetCellType or board.GetSpecialType.</param> /// <param name="oneHotSize">The number of possible values that the GridValueProvider can return.</param> /// <param name="obsType">Whether to produce vector or visual observations</param> /// <param name="name">Name of the sensor.</param> public Match3Sensor(AbstractBoard board, GridValueProvider gvp, int oneHotSize, Match3ObservationType obsType, string name) { var maxBoardSize = board.GetMaxBoardSize(); m_Name = name; m_MaxBoardSize = maxBoardSize; m_GridValues = gvp; m_OneHotSize = oneHotSize; m_Board = board; m_ObservationType = obsType; m_ObservationSpec = obsType == Match3ObservationType.Vector ? ObservationSpec.Vector(maxBoardSize.Rows * maxBoardSize.Columns * oneHotSize) : ObservationSpec.Visual(maxBoardSize.Rows, maxBoardSize.Columns, oneHotSize); }
/// <summary> /// Create a Match3Actuator. /// </summary> /// <param name="board"></param> /// <param name="forceHeuristic">Whether the inference action should be ignored and the Agent's Heuristic /// should be called. This should only be used for generating comparison stats of the Heuristic.</param> /// <param name="seed">The seed used to initialize <see cref="System.Random"/>.</param> /// <param name="agent"></param> /// <param name="name"></param> public Match3Actuator(AbstractBoard board, bool forceHeuristic, int seed, string name) { m_Board = board; m_MaxBoardSize = m_Board.GetMaxBoardSize(); Name = name; m_ForceHeuristic = forceHeuristic; var numMoves = Move.NumPotentialMoves(m_MaxBoardSize); m_ActionSpec = ActionSpec.MakeDiscrete(numMoves); m_Random = new System.Random(seed); }
/// <summary> /// Create a sensor that encodes the board cells as observations. /// </summary> /// <param name="board">The abstract board.</param> /// <param name="obsType">Whether to produce vector or visual observations</param> /// <param name="name">Name of the sensor.</param> /// <returns></returns> public static Match3Sensor CellTypeSensor(AbstractBoard board, Match3ObservationType obsType, string name) { var maxBoardSize = board.GetMaxBoardSize(); return(new Match3Sensor(board, board.GetCellType, maxBoardSize.NumCellTypes, obsType, name)); }