Refactor algorithm to a singleton object

Algorithm:

  • Place all algorithm members into a singleton object
  • Expose algorithm state via getter APIs on singleton

Others:

  • Change movement code to utilize public algorithm API to get information (as opposed to passing arguments from algorithm to movement)