【强化学习】解决MPE环境中两个小球重合导致态势为nan问题
本质原因还没定位到,具体为某种操作,导致两个具有碰撞属性的小球重合了!!!
重合后导致距离计算为0,从而导致碰撞的力为nan,导致态势位置变成nan。
修改以下源码解决:
multiagent/core.py中的193行改为:
force = self.contact_force * delta_pos / (dist+1e-6) * penetration
完整的 get_collision_force 方法:
# get collision forces for any contact between two entitiesdef get_collision_force(self, entity_a, entity_b):if (not entity_a.collide) or (not entity_b.collide):return [None, None] # not a colliderif (entity_a is entity_b):return [None, None] # don't collide against itself# compute actual distance between entitiesdelta_pos = entity_a.state.p_pos - entity_b.state.p_posdist = np.sqrt(np.sum(np.square(delta_pos)))# minimum allowable distancedist_min = entity_a.size + entity_b.size# softmax penetrationk = self.contact_marginpenetration = np.logaddexp(0, -(dist - dist_min)/k)*kforce = self.contact_force * delta_pos / (dist+1e-6) * penetrationforce_a = +force if entity_a.movable else Noneforce_b = -force if entity_b.movable else Nonereturn [force_a, force_b]