class_docstr: Controller.`
  Keep Track of each ship and shipyard
docstr: Obtain the id of ships which are not controlled by rules
  Return:
      ready_ship_id (list) : containing the ship ids
docstr_tok: ["Obtain","the","id","of","ships","which","are","not","controlled","by","rules","Return",":","ready_ship_id","(","list",")",":","containing","the","ship","ids"]
code: def get_ship_id(self):
      """Obtain the id of ships which are not controlled by rules
      Return:
          ready_ship_id (list) : containing the ship ids
      """
      ready_ship_id = []
  
      for ship_id, ship_state in self.ship_states.items():
          if not ship_state["rule"]:
              ready_ship_id.append(ship_id)
  
      return ready_ship_id
  
imports: import numpy
  from config import config
  from zerosum_env.envs.halite.helpers import *
  from .agent import Agent
  from .model import Model
  from .algorithm import PPO
  from .obs_parser import get_ship_feature
  from .replay_memory import ReplayMemory
  from .utils import is_alive, check_nearby_ship, nearest_shipyard_position, mahattan_distance
  from .policy import do_nothing_policy, move_up_policy, move_down_policy, move_left_policy, move_right_policy, spawn_policy, return_to_base_policy, mine_policy, convert_policy
label_desc: Use image node_id 5 for calling the Controller obj's underlying member method code with example usage: obj.get_ship_id() and returns: ready_ship_id