Just a post to review the things I've learned over the past week:
Intuitive explanation of Lagrange multipliers [1]. Given a D-dimensional function to optimize and a set of a few equality constraints.
KKT Conditions: Generalized method of Lagrange multipliers to be applicable on Inequality constraints. g_i(x)-b_i\geq 0
In case we obtain negative Lagrange multiplier, the constraint corresponding to the most negative multiplier is removed and the optimization is performed again until all multipliers are positive.
A bit about active set algorithm [2]:
Quadratic programming:
What qp.m does:
[x, obj, info, lambda] = qp (x0, H, q, Aeq, beq, lb, ub, A_lb, A_in, A_ub)
[1] http://www.slimy.com/~steuard/teaching/tutorials/Lagrange.html
[2] https://www.youtube.com/user/ucmath352/videos
Intuitive explanation of Lagrange multipliers [1]. Given a D-dimensional function to optimize and a set of a few equality constraints.
- The vector normal to the function should be a scaled version of the vector normal to the constraint function (In other words, both normals are parallel to each other). This scaling factor is the Lagrange multiplier corresponding a particular constraint.
- \nabla f=\lambda_1\nabla g+\lambda_2 \nabla h, where g and h are two constraint functions.
KKT Conditions: Generalized method of Lagrange multipliers to be applicable on Inequality constraints. g_i(x)-b_i\geq 0
- Feasibility- g_i(x^*)-b_i\geq 0
- Stationarity- \nabla f(x^*)-\sum\limits_i\lambda_i^*\nabla g_i(x^*)=0
- Complementary Slackness \lambda_i^*(g_i(x^*)-b_i)=0
- Positive Lagrange multipliers \lambda_i \geq 0, \forall i
In case we obtain negative Lagrange multiplier, the constraint corresponding to the most negative multiplier is removed and the optimization is performed again until all multipliers are positive.
- Possibility that none of the constraints are active or may be some are active. We only need to solve for equality constraints that are active at the optimum (binding).
- When we have an active set S^*, x^* \in F, where F=\{x|A x^*\leq b\},\lambda^* \geq0, where \lambda^* is the set of Lagrange multipliers for equality constraints Ax=b
- Start at x=x_0 and initial active set
- Calculate x^*_{EQP}, \lambda_{EQP}^* which minimizes the EQP defined by the current active set. Two possible outcomes:
- x^*_{EQP} is feasible (x_{EQP}^* \in F). Set x=x_{EQP} and check Lagrange mulitpliers \lambda_{EQP}^*. If positive, solution found! Otherwise, remove constraint with \min(\lambda_{EQP}^*) and repeat.
- x^*_{EQP}is infeasible. We move as far as possible along the line segment from x_0 to x^*_{EQP} while staying feasible. Add to S the constraint we encounter that prevents further progress. This is the blocking constraint.
Quadratic programming:
\min\limits_{x}\frac{1}{2} x^THx + x^Tq
s.t.
A_{eq} x = b_{eq}
lb \leq x \leq ub
A_{lb} \leq A_{in}x \leq A_{ub}
[x, obj, info, lambda] = qp (x0, H, q, Aeq, beq, lb, ub, A_lb, A_in, A_ub)
- Checks feasibility of initial guess x_0
- Checks size of inputs and that they make sense.
- Checks if bounds lb,ub too close or A_lb or A_ub too close. If they are very close then the inequality is treated as an equality constraint instead.
- Checks if any bound is set to Inf or -Inf. qp simply strikes it off.
- Calls backend solver __qp__ using null space active set algorithm.
- quadprog returns Lagrange multipliers in a structure (with fields upper, lower, eqlin, ineqlin) and the multipliers corresponding to the constraints not provided are left empty.
- In qp, lambda is a column vector with Lagrange multipliers associated to the constraints in the following order: [equality constraints; lower bounds; upper bounds; other inequality constraints].
- The length of lambda vector output from qp depends on the number of different constraints provided as input.
- Two issues in wrapping qp.m
- the order, i.e. the position of the bounds constraints within the inequality constraints) is not specified by qp.m. The code could change and the ordering too.
- qp.m strips off the INF constraints before calling __qp__ but does not process the lambda (returned by __qp__) accordingly.
- Solution:
- If this order is "specified" then we could extract parts of lambda. Patch for Inf checks in qp output lambda will make things easier but is not critical.
[1] http://www.slimy.com/~steuard/teaching/tutorials/Lagrange.html
[2] https://www.youtube.com/user/ucmath352/videos
No comments:
Post a Comment