/// <summary> /// Deprecated! Reads the state map from file. /// </summary> /// <returns> /// The Dictionary representing the state map. /// </returns> /// <param name='filename'> /// The path to state map file. /// </param> /// <remarks> /// File format: <numVirtualStates> <numAgentProp> <numHelperProp> <numMonsterProp> <numSpecLocProp>. /// In the current implementation, numAgentProb = numHelperProp = 3, numMonsterProp = 4 or 5 depending /// on whether there is any hit point. /// /// Thereafter are: <agentRegion> <agentX> <agentY> <helperRegion> <helperX> <helperY>. /// Then: <monsterX> <monsterY> <seesAgent> <seesHelper> <additional props>[]. /// </remarks> public Dictionary <VirtualState, int> readStateMapping(string filename) { //UnityEngine.Debug.Log("readStateMapping from "+filename); string uncompressedStr = ZlibDecompression.decompress(filename); string[] strArray = uncompressedStr.Split(' '); Dictionary <VirtualState, int> result = new Dictionary <VirtualState, int>(); //int xSize = parentScript.levelData.xSize; //int ySize = parentScript.levelData.ySize; // 1. read number of virtual states int numVirtualStates = int.Parse(strArray[0]); UnityEngine.Debug.Log("readStateMapping from " + filename + ", num Virtual States =" + numVirtualStates); VirtualState state; // = new VirtualState(); //state.monsterProperty. int sizeMonster = int.Parse(strArray[3]) - 2; // exclude seesAgent and seesHelper int sizePerState = int.Parse(strArray[1]) + int.Parse(strArray[2]) + int.Parse(strArray[3]) + int.Parse(strArray[4]); int offset; for (int i = 0; i < numVirtualStates; i++) { state = new VirtualState(sizeMonster); offset = 4 + i * sizePerState; // a. agent and helper // exclude the first element, being the region id state.playerProperties[0, 0] = int.Parse(strArray[offset + 2]); state.playerProperties[0, 1] = int.Parse(strArray[offset + 3]); state.playerProperties[1, 0] = int.Parse(strArray[offset + 5]); state.playerProperties[1, 1] = int.Parse(strArray[offset + 6]); // b. NPC, exclude seesAgent and seesHelper because we are dealing with no abstraction here. offset = offset + 7; state.monsterProperty[0] = int.Parse(strArray[offset]); state.monsterProperty[1] = int.Parse(strArray[offset + 1]); for (int j = 4; j < sizeMonster + 2; j++) { state.monsterProperty[j - 2] = int.Parse(strArray[offset + j]); } // c. I'm not dealing with specialLocation here. // d. Add into result try{ result.Add(state, i); } catch { UnityEngine.Debug.Log("Duplicated Virtual State " + i + ": " + state.ToString()); } } return(result); }
/// <summary> /// Reads the policy file to initialize QValues. /// </summary> /// <returns> /// The matrix representing the Q values. /// </returns> /// <param name='filename'> /// The path to Ftn file. The filename should be level.tmx.ghost/sheep/fiery.0.Ftn. /// </param> public double[,,] readPolicyFile(string filename) { string uncompressedStr = ZlibDecompression.decompress(filename); string[] strArray = uncompressedStr.Split(' '); // 1. read number of virtual states int numVirtualStates = int.Parse(strArray[0]); double[,,] result = new double[numVirtualStates, GameConstants.NumAgentActions, GameConstants.NumHelperActions]; int i = 1; for (int j = 0; j < numVirtualStates; j++) { for (int k = 0; k < GameConstants.NumAgentActions; k++) { for (int l = 0; l < GameConstants.NumHelperActions; l++) { result[j, k, l] = double.Parse(strArray[i]); i++; } } } return(result); }