Integer simplex method (gomory's cutting plane method)
If the optimal solution is integers, then problem is solved.
Otherwise, add Gomory's constraint (cut) is added to optimal solution.
Now new problem is solved using dual simplex method
The method terminates as soon as optimal solution become integers.
Algorithm
|
Integer simplex method (gomory's cutting plane method) Steps (Rule)
|
|
Step-1:
|
a. Formulate the integer LP problem
b. If any constraint contains non-integer coefficient then convert it into integer.
c. Solve the given problem using Simplex (BigM) method, ignore the integer condition
|
|
Step-2:
|
a. Examine the optimal solution. if all the basic variables have integer values, then terminate the process.
b. Otherwise, construct a Gomory's fractional cut from the row, which has the largest fractional part,
and add it to the original set of constraints.
Gomory's constraint
`-f_r = s_g - sum f_r x`
|
|
Step-3:
|
a. Now add this constraint to optimal simplex table.
b. Find a new optimal solution using dual simplex method. and then goto step-2.
|
Example-1
Find solution using integer simplex method (Gomory's cutting plane method)
MAX Z = x1 + x2
subject to
3x1 + 2x2 <= 5
x2 <= 2
x1,x2 non-negative integersSolution:Problem is | Max `Z` | `=` | `` | `` | `x_1` | ` + ` | `` | `x_2` |
|
| subject to |
| `` | `3` | `x_1` | ` + ` | `2` | `x_2` | ≤ | `5` | | | | `` | `` | `x_2` | ≤ | `2` |
|
| and `x_1,x_2 >= 0; ``x_1,x_2` non-negative integers |
The problem is converted to canonical form by adding slack, surplus and artificial variables as appropiate
1. As the constraint-1 is of type '`<=`' we should add slack variable `S_1`
2. As the constraint-2 is of type '`<=`' we should add slack variable `S_2`
After introducing slack variables| Max `Z` | `=` | `` | `` | `x_1` | ` + ` | `` | `x_2` | ` + ` | `0` | `S_1` | ` + ` | `0` | `S_2` |
|
| subject to |
| `` | `3` | `x_1` | ` + ` | `2` | `x_2` | ` + ` | `` | `S_1` | | | | = | `5` | | | | `` | `` | `x_2` | | | | ` + ` | `` | `S_2` | = | `2` |
|
| and `x_1,x_2,S_1,S_2 >= 0` |
| Tableau-1 | `C_j` | `1` | `1` | `0` | `0` | | |
| `C_B` | `"Basis"` | `x_1` | `x_2` | `S_1` | `S_2` | `RHS` | `"Ratio"=(RHS)/(x_1)` |
| `R_1` `0` | `S_1` | `(3)` | `2` | `1` | `0` | `5` | `(5)/(3)=1.6667``->` |
| `R_2` `0` | `S_2` | `0` | `1` | `0` | `1` | `2` | `(2)/(0)` (ignore, denominator is 0) |
| | `Z_j` | `0` | `0` | `0` | `0` | `Z=0` | |
| | `C_j-Z_j` | `1``uarr` | `1` | `0` | `0` | | |
Most Positive `C_j-Z_j` is `1`. So,
the entering variable is `x_1`.
Minimum ratio is `1.6667`. So,
the leaving basis variable is `S_1`.
`:.`
The pivot element is `3`.
Entering `=x_1`, Departing `=S_1`, Key Element `=3`
`R_1`(new)`= R_1`(old) `-: 3`
| `x_1` | `x_2` | `S_1` | `S_2` | `RHS` |
| `R_1`(old) = | `3` | `2` | `1` | `0` | `5` |
| `R_1`(new)`= R_1`(old) `-: 3` | `1` | `0.6667` | `0.3333` | `0` | `1.6667` |
`R_2`(new)`= R_2`(old)
| `x_1` | `x_2` | `S_1` | `S_2` | `RHS` |
| `R_2`(old) = | `0` | `1` | `0` | `1` | `2` |
| `R_2`(new)`= R_2`(old) | `0` | `1` | `0` | `1` | `2` |
| Tableau-2 | `C_j` | `1` | `1` | `0` | `0` | | |
| `C_B` | `"Basis"` | `x_1` | `x_2` | `S_1` | `S_2` | `RHS` | `"Ratio"=(RHS)/(x_2)` |
| `R_1` `1` | `x_1` | `1` | `0.6667` | `0.3333` | `0` | `1.6667` | `(1.6667)/(0.6667)=2.5` |
| `R_2` `0` | `S_2` | `0` | `(1)` | `0` | `1` | `2` | `(2)/(1)=2``->` |
| | `Z_j` | `1` | `0.6667` | `0.3333` | `0` | `Z=1.6667` | |
| | `C_j-Z_j` | `0` | `0.3333``uarr` | `-0.3333` | `0` | | |
Most Positive `C_j-Z_j` is `0.3333`. So,
the entering variable is `x_2`.
Minimum ratio is `2`. So,
the leaving basis variable is `S_2`.
`:.`
The pivot element is `1`.
Entering `=x_2`, Departing `=S_2`, Key Element `=1`
`R_2`(new)`= R_2`(old)
| `x_1` | `x_2` | `S_1` | `S_2` | `RHS` |
| `R_2`(old) = | `0` | `1` | `0` | `1` | `2` |
| `R_2`(new)`= R_2`(old) | `0` | `1` | `0` | `1` | `2` |
`R_1`(new)`= R_1`(old) - `0.6667 R_2`(new)
| `x_1` | `x_2` | `S_1` | `S_2` | `RHS` |
| `R_1`(old) = | `1` | `0.6667` | `0.3333` | `0` | `1.6667` |
| `R_2`(new) = | `0` | `1` | `0` | `1` | `2` |
| `0.6667 xx R_2`(new) = | `0` | `0.6667` | `0` | `0.6667` | `1.3333` |
| `R_1`(new)`= R_1`(old) - `0.6667 R_2`(new) | `1` | `0` | `0.3333` | `-0.6667` | `0.3333` |
| Tableau-3 | `C_j` | `1` | `1` | `0` | `0` | | |
| `C_B` | `"Basis"` | `x_1` | `x_2` | `S_1` | `S_2` | `RHS` | `"Ratio"` |
| `R_1` `1` | `x_1` | `1` | `0` | `0.3333` | `-0.6667` | `0.3333` | |
| `R_2` `1` | `x_2` | `0` | `1` | `0` | `1` | `2` | |
| | `Z_j` | `1` | `1` | `0.3333` | `0.3333` | `Z=2.3333` | |
| | `C_j-Z_j` | `0` | `0` | `-0.3333` | `-0.3333` | | |
Since all `C_j-Z_j <= 0`
Hence, non-integer optimal solution is arrived with value of variables as :
`x_1=0.3333,x_2=2`
Max `Z=2.3333`
To obtain the integer valued solution, we proceed to construct Gomory's fractional cut, with the help of `x_1`-row as follows:
`0.3333= 1 x_1+0.3333 S_1 -0.6667 S_2`
`(0+0.3333)=(1+0) x_1+(0+0.3333) S_1+(-1+0.3333) S_2`
The fractional cut will become
`-0.3333 = Sg1 -0.3333 S_1 -0.3333 S_2 ->` (Cut-1)
Adding this additional constraint at the bottom of optimal simplex table. The new table so obtained is
| Tableau-1 | `C_j` | `1` | `1` | `0` | `0` | `0` | |
| `C_B` | `"Basis"` | `x_1` | `x_2` | `S_1` | `S_2` | `Sg1` | `RHS` |
| `R_1` `1` | `x_1` | `1` | `0` | `0.3333` | `-0.6667` | `0` | `0.3333` |
| `R_2` `1` | `x_2` | `0` | `1` | `0` | `1` | `0` | `2` |
| `R_3` `0` | `Sg1` | `0` | `0` | `(-0.3333)` | `-0.3333` | `1` | `-0.3333``->` |
| | `Z_j` | `1` | `1` | `0.3333` | `0.3333` | `0` | `Z=2.3333` |
| | `C_j-Z_j` | `0` | `0` | `-0.3333` | `-0.3333` | `0` | |
| | `"Ratio"=(C_j-Z_j)/(Sg1,j)` and `Sg1,j<0` | `(0)/(0)` `=`--- | `(0)/(0)` `=`--- | `(-0.3333)/(-0.3333)` `=1``uarr` | `(-0.3333)/(-0.3333)` `=1` | `(0)/(1)` `=`--- | |
Most negative `RHS` is `-0.3333` and its row index is `3`. So,
the leaving basis variable is `Sg1`.
Least positive ratio is `1` and its column index is `3`. So,
the entering variable is `S_1`.
`:.`
The pivot element is `-0.3333`.
Entering `=S_1`, Departing `=Sg1`, Key Element `=-0.3333`
`R_3`(new)`= R_3`(old) `-: -0.3333`
| `x_1` | `x_2` | `S_1` | `S_2` | `Sg1` | `RHS` |
| `R_3`(old) = | `0` | `0` | `-0.3333` | `-0.3333` | `1` | `-0.3333` |
| `R_3`(new)`= R_3`(old) `-: -0.3333` | `0` | `0` | `1` | `1` | `-3` | `1` |
`R_1`(new)`= R_1`(old) - `0.3333 R_3`(new)
| `x_1` | `x_2` | `S_1` | `S_2` | `Sg1` | `RHS` |
| `R_1`(old) = | `1` | `0` | `0.3333` | `-0.6667` | `0` | `0.3333` |
| `R_3`(new) = | `0` | `0` | `1` | `1` | `-3` | `1` |
| `0.3333 xx R_3`(new) = | `0` | `0` | `0.3333` | `0.3333` | `-1` | `0.3333` |
| `R_1`(new)`= R_1`(old) - `0.3333 R_3`(new) | `1` | `0` | `0` | `-1` | `1` | `0` |
`R_2`(new)`= R_2`(old)
| `x_1` | `x_2` | `S_1` | `S_2` | `Sg1` | `RHS` |
| `R_2`(old) = | `0` | `1` | `0` | `1` | `0` | `2` |
| `R_2`(new)`= R_2`(old) | `0` | `1` | `0` | `1` | `0` | `2` |
| Tableau-2 | `C_j` | `1` | `1` | `0` | `0` | `0` | |
| `C_B` | `"Basis"` | `x_1` | `x_2` | `S_1` | `S_2` | `Sg1` | `RHS` |
| `R_1` `1` | `x_1` | `1` | `0` | `0` | `-1` | `1` | `0` |
| `R_2` `1` | `x_2` | `0` | `1` | `0` | `1` | `0` | `2` |
| `R_3` `0` | `S_1` | `0` | `0` | `1` | `1` | `-3` | `1` |
| | `Z_j` | `1` | `1` | `0` | `0` | `1` | `Z=2` |
| | `C_j-Z_j` | `0` | `0` | `0` | `0` | `-1` | |
| | Ratio | | | | | | |
Since all `C_j-Z_j <= 0`
Hence, integer optimal solution is arrived with value of variables as :
`x_1=0,x_2=2`
Max `Z=2`
The integer optimal solution found after 1-cuts.
This material is intended as a summary. Use your textbook for detail explanation.
Any bug, improvement, feedback then