1 | /* $Id: CoinPresolveDual.hpp 1372 2011-01-03 23:31:00Z lou $ */ |
2 | |
3 | // Copyright (C) 2002, International Business Machines |
4 | // Corporation and others. All Rights Reserved. |
5 | // This code is licensed under the terms of the Eclipse Public License (EPL). |
6 | |
7 | #ifndef CoinPresolveDual_H |
8 | #define CoinPresolveDual_H |
9 | |
10 | /*! \class remove_dual_action |
11 | \brief Attempt to fix variables by bounding reduced costs |
12 | |
13 | The reduced cost of x_j is d_j = c_j - y*a_j (1). Assume minimization, |
14 | so that at optimality d_j >= 0 for x_j nonbasic at lower bound, and |
15 | d_j <= 0 for x_j nonbasic at upper bound. |
16 | |
17 | For a slack variable s_i, c_(n+i) = 0 and a_(n+i) is a unit vector, hence |
18 | d_(n+i) = -y_i. If s_i has a finite lower bound and no upper bound, we |
19 | must have y_i <= 0 at optimality. Similarly, if s_i has no lower bound and a |
20 | finite upper bound, we must have y_i >= 0. |
21 | |
22 | For a singleton variable x_j, d_j = c_j - y_i*a_ij. Given x_j with a |
23 | single finite bound, we can bound d_j greater or less than 0 at |
24 | optimality, and that allows us to calculate an upper or lower bound on y_i |
25 | (depending on the bound on d_j and the sign of a_ij). |
26 | |
27 | Now we have bounds on some subset of the y_i, and we can use these to |
28 | calculate upper and lower bounds on the d_j, using bound propagation on |
29 | (1). If we can manage to bound some d_j as strictly positive or strictly |
30 | negative, then at optimality the corresponding variable must be nonbasic |
31 | at its lower or upper bound, respectively. If the required bound is lacking, |
32 | the problem is unbounded. |
33 | |
34 | There is no postsolve object specific to remove_dual_action, but execution |
35 | will queue postsolve actions for any variables that are fixed. |
36 | */ |
37 | |
38 | class remove_dual_action : public CoinPresolveAction { |
39 | public: |
40 | remove_dual_action(int nactions, |
41 | //const action *actions, |
42 | const CoinPresolveAction *next); |
43 | /*! \brief Attempt to fix variables by bounding reduced costs |
44 | |
45 | Always scans all variables. Propagates bounds on reduced costs until there's |
46 | no change or until some set of variables can be fixed. |
47 | */ |
48 | static const CoinPresolveAction *presolve(CoinPresolveMatrix *prob, |
49 | const CoinPresolveAction *next); |
50 | }; |
51 | #endif |
52 | |