From 1af8749a8c606d111caac5e1f8d92267fe37bb75 Mon Sep 17 00:00:00 2001 From: zuchaoli Date: Thu, 19 Dec 2024 16:56:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=87=B3=E5=A4=9A=E9=98=B5?= =?UTF-8?q?=E8=90=A5=E5=A4=9A=E6=96=B9=E5=8D=8F=E4=BD=9C=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/__init__.cpython-310.pyc | Bin 144 -> 0 bytes __pycache__/yes_cmdr_env.cpython-310.pyc | Bin 32579 -> 0 bytes __pycache__/yes_cmdr_utils.cpython-310.pyc | Bin 1545 -> 0 bytes yes_cmdr_env.py | 29 ++++++++++++--------- 4 files changed, 17 insertions(+), 12 deletions(-) delete mode 100644 __pycache__/__init__.cpython-310.pyc delete mode 100644 __pycache__/yes_cmdr_env.cpython-310.pyc delete mode 100644 __pycache__/yes_cmdr_utils.cpython-310.pyc diff --git a/__pycache__/__init__.cpython-310.pyc b/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 90ac4dbfa7f5155e2755bff993b866133ff2a2cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmd1j<>g`kf(?`2rh(|kAOaaM0yz#qT+9L_QW%06G#UL?G8BP?5yUTJ{qp>x?BasN z|2y`1s7c%#!$cy@JYH95%W6DWy57 Nb|AxwnScZf0|2z?AnO1C diff --git a/__pycache__/yes_cmdr_env.cpython-310.pyc b/__pycache__/yes_cmdr_env.cpython-310.pyc deleted file mode 100644 index 2fe8ef946f5c95f857a9e8cc97e69dec0be5738e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32579 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¥j2rq zVyLoC&tE}89>K1{uipexkdp4vl5kowpsaL&I;9KLEj^%K;U85>Z)&f#MIO^mBTx)9 zjU%&NQ!SEI>LN}DW~~P_PIfY$2vZ&O$;sL0nujEY~JT;~P>WN;iDtYT4g5 zelO3qlO0t7R23kpBEjH4Ch7uAf4|+jnX4Om5cgzDOSLOitJz9N#kJP3Ncy@plA8A* zdglzc`^~|~1e_;XQgH48kgfp_?Igf zKzwTJ$^kGXIU+W^bV3E2u#)Oc*n^NyATN&~JEwHwmhN?DLJL$pm|gAg&7G%*ud`D}Y@=yD$gVeig1C4!;DK!U)F6pZ89t z2T$)D&%WDx`e6U`!QJ_z-{-&HJ~_VsXU=?lLC3#@16K0bOT7y%zif#yo*w diff --git a/yes_cmdr_env.py b/yes_cmdr_env.py index 9b99fad..249bbec 100644 --- a/yes_cmdr_env.py +++ b/yes_cmdr_env.py @@ -15,6 +15,7 @@ class YesCmdrEnv(gym.Env): replay_path: str = None, campaign_id: str = "NOID", team_id: int = 0, + faction_id: int = 0, max_team: int = 2, max_faction: int = 2, data_path: str = "../data", @@ -27,6 +28,7 @@ class YesCmdrEnv(gym.Env): self.replay_path = replay_path self.campaign_id = campaign_id self.init_team_id = team_id + self.init_faction_id = faction_id self.max_team = max_team self.max_faction = max_faction self.data_path = data_path @@ -127,7 +129,7 @@ class YesCmdrEnv(gym.Env): if terminated or truncated: # The eval_episode_return is calculated from Player 1's perspective - info["eval_episode_return"] = reward if self.faction_id == self.teams[self.init_team_id].faction_id else -reward + info["eval_episode_return"] = reward if self.faction_id == self.init_faction_id else -reward info["done_reason"] = "Terminated" if terminated else "Truncated" if self.replay_path is not None: @@ -222,12 +224,12 @@ class YesCmdrEnv(gym.Env): return self._legal_actions map_data = self.map.nodes - player_data = self.current_agents_dict + team_data = self.current_agents_dict spotted_enemy_ids = self.spotted_enemy_ids _legal_actions = [Action(ActionType.END_OF_TURN)] # Default action - for agent_id, agent in player_data.items(): + for agent_id, agent in team_data.items(): if agent.commenced_action or not agent.alive or agent.pos == (-1, -1) or agent.is_carried: continue pos = agent.pos @@ -411,7 +413,7 @@ class YesCmdrEnv(gym.Env): _teams = [ Team( team_id=_team_id, - faction_id=agents_dict_lists[_team_id][0]["faction_id"], + faction_id=agents_dict_lists[_team_id][0]["faction_id"] if agents_dict_lists[_team_id] else -1, # 可能为空 agents=_agents[_team_id] ) for _team_id in range(self.max_team) @@ -558,6 +560,8 @@ class YesCmdrEnv(gym.Env): @property def faction_id(self): + if self._team_id >= self.max_team: + raise ValueError(f"Team id {self._team_id} exceeds max id {self.max_team - 1}") return self.teams[self._team_id].faction_id @property @@ -713,6 +717,8 @@ class YesCmdrEnv(gym.Env): target_agent.endurance -= damage agent.weapon.ammo -= 1 agent.commenced_action = True + + terminated = False if target_agent.endurance <= 0: # 删除与地图关联 @@ -721,10 +727,9 @@ class YesCmdrEnv(gym.Env): node.team_id = -1 node.faction_id = -1 - if sum(self.teams[team_id].alive_count for team_id in range(self.max_team) if self.teams[team_id].faction_id != self.faction_id) == 0: - return damage, True + terminated = sum(self.teams[team_id].alive_count for team_id in range(self.max_team) if self.teams[team_id].faction_id != self.faction_id) == 0 - return damage, False + return damage, terminated def _interact(self, agent_id, target_id): agent = self.get_agent(agent_id) @@ -1261,19 +1266,19 @@ class YesCmdrEnv(gym.Env): obs = self.observe() truncated = self.episode_steps >= self.max_episode_steps - terminated = self.teams[self.enemy_id].alive_count == 0 - self._cumulative_rewards[self.player_id] += reward + terminated = sum(self.teams[team_id].alive_count for team_id in range(self.max_team) if self.teams[team_id].faction_id != self.faction_id) == 0 + self._cumulative_rewards[self.team_id] += reward info = {} info["accum_reward"] = (self._cumulative_rewards[0], self._cumulative_rewards[1]) - info["next_player"] = self.player_id + 1 if not terminated else -1 + info["next_team"] = self.team_id + 1 if not terminated else -1 if self.replay_path is not None: - self._frames[self.player_id].append(self.render(mode="rgb_array")) + self._frames[self.team_id].append(self.render(mode="rgb_array")) if terminated or truncated: # The eval_episode_return is calculated from Player 1's perspective - info["eval_episode_return"] = reward if self.player_id == 0 else -reward + info["eval_episode_return"] = reward if self.faction_id == self.init_faction_id else -reward info["done_reason"] = "Terminated" if terminated else "Truncated" if self.replay_path is not None: