We have made a lot of progress the last two days and now we actually have something that is presentable. A lot of improvements have been made to the algorithm, addressing the problems we described before and these improvements are mainly bug fixes. Not only do we now get results that would be expected when solving for the UIC, we have also managed to improve performance by almost 100%. The sudden gain in performance stems from the fact that we recently discovered a severe blunder in our matrix representation in the LCP-solver. The matrix involved in the LCP is in fact a sparse one. Naturally, we thought of defining it as a sparse matrix from start, but somewhere along the way we messed up and it became a dense matrix instead. Upon later changing the definition from dense to sparse, we went from 18 FPS to 32 FPS, a quite distinct improvement.
Apart from this major bug fix, we fixed some other small errors that were found and now the agents move in a much more consistent way. It certainly looks like we are getting closer and closer to our final goal. One of the issues still present, though, is the fact that the result is very sensitive to parameter change, something we will look into later. Another thing, is that we have to implement a preconditioner to further improve performance of the LCP-solver. Other than that, the UIC-implementation seems to work as intended and thus prototype 2 is completed.
Finally, some new features have been added. First of all, we have added color coding to the agents which makes it a lot easier to track the movements of groups of agents. In addition, much earlier than expected, obstacles are now here! We now have the ability to place arbitrary obstacles on the ground and the coefficients describing area availability in the covered cells are set automatically, thus we get the boundary conditions around every obstacle. The coefficients later go into the LCP and will result in agents avoiding the affected cells. All of the improvements made and all of the added features are summarized in the two videos below.
We clearly see a spiral in the movement of the agents. Note that it is only due to the fact that we are correcting the velocities by solving the LCP. Pretty cool isn’t it? In the next video some obstacles are introduced. We have placed walls around the edges of the plane to create a neat border and a block is placed right in the middle. The cells that are unavailable are shown in red.
Here, we can clearly see that the agents avoid entering the unavailable cells for the most part. Note, however, that a few agents still tend to enter at points where the density is lower. This is not a problem though, because we do handle collisions between agents and the obstacles in pretty much the same way they are handled among agents themselves.
To conclude, we have now come a long way since we first started off and we are pretty happy with how the agents behave at high densities. There are, of course, still some issues that we will need to solve but that is something we will tackle later. Now, we are focusing on the upcoming presentation of our final project in SI2335, Simulation Physics, where we will need to show a scenario where we simulate a dense crowd and record some data from that. This is our primary objective right now and therefore we will continue to improve the algorithm afterwards.