I developed an app that implements many different algorithms for determining this. Some of them find only approximate solutions, and some are infeasible because they try each combinatoric possibility. I implemented the A* search, Held-Karp, Malandraki-Dial, and Genetic algorithms. In the case of the Genetic, I tried several variants for initializations and the cross-over phase. In the end, I determined that the Genetic algorithm consistently had a high performance, both in terms of the optimality of the plan and the efficiency of the computation time. It was able to plan a day with 35 attractions in an average of 94 milliseconds on an Android phone.The image at right shows an attraction selection screen for the app. Users are able to select both which attractions to visit, and how many times to visit each. The application considers the time spent in line, travelling between attractions, and the time spent on the attractions themselves.
This app was the project I completed for my Master's degree, but I still work on it in my spare time. So far in the app development, I have learned
1) The importance of considering hardware limitations
2) The Android app development process
3) The importance of planning a complex piece of software before writing it