Lemke's algorithm and pivoting
Posted: Sat Jan 01, 2011 2:52 am
I've implemented a naive version of Lemke's algorithm for solving LCPs based on this paper: Linear Complementarity and Mathematical (Non-linear) Programming.
To handle degeneracy issues (cases where we have a choice of pivot), which might cause issues with cycling, it suggests "perturbing" each equation in the system by a power of an epsilon. eg: ε, ε^2, ε^3, etc. I need to add this to my solver still, but I'm not quite clear how to do that.
Let's say that it just so happens that in the course of solving the system, you arrive at one equation with a constant term of (ε) * ε^2 and another with a constant term ε^3. They'll be identical and we'll have a choice of pivot again, wouldn't we? Which would break things again since we'd have a choice of pivot.
So I guess you have to keep track of the ε terms symbolically (maybe by adding extra columns to the "dictionary" for each power of ε). But then when it comes time to actually chose a pivot, you still have to actually choose a value for ε so you can evaluate the terms. So how do you chose a value for ε when you evaluate it?
Another source dealing with using Lemke to solve for Nash equilibrium suggested that you could just randomly select a pivot. The idea being that even if you ended up cycling once or twice, eventually the cycle would chose the other pivot and escape. Which is an interesting/clever idea. But it would make debugging sort of a pain since it would break determinacy (maybe there would also be numerical considerations? Like each time through the cycle you lose a bit of precision. So depending on the route taken, you could end up with numerically different answers for the same problem on different run throughs). Are there any other schemes to avoid degeneracy that I could use?
To handle degeneracy issues (cases where we have a choice of pivot), which might cause issues with cycling, it suggests "perturbing" each equation in the system by a power of an epsilon. eg: ε, ε^2, ε^3, etc. I need to add this to my solver still, but I'm not quite clear how to do that.
Let's say that it just so happens that in the course of solving the system, you arrive at one equation with a constant term of (ε) * ε^2 and another with a constant term ε^3. They'll be identical and we'll have a choice of pivot again, wouldn't we? Which would break things again since we'd have a choice of pivot.
So I guess you have to keep track of the ε terms symbolically (maybe by adding extra columns to the "dictionary" for each power of ε). But then when it comes time to actually chose a pivot, you still have to actually choose a value for ε so you can evaluate the terms. So how do you chose a value for ε when you evaluate it?
Another source dealing with using Lemke to solve for Nash equilibrium suggested that you could just randomly select a pivot. The idea being that even if you ended up cycling once or twice, eventually the cycle would chose the other pivot and escape. Which is an interesting/clever idea. But it would make debugging sort of a pain since it would break determinacy (maybe there would also be numerical considerations? Like each time through the cycle you lose a bit of precision. So depending on the route taken, you could end up with numerically different answers for the same problem on different run throughs). Are there any other schemes to avoid degeneracy that I could use?