In [1]:
# Let's give an algorithm to solve an LP by direct enumeration.
using Combinatorics # for combinations

# Check if a given point is a basic feasible point.
function basic_feasible_point(A::Matrix,b::Vector,set::Vector)
    m,n = size(A)
    @assert length(set) == m "need more indices to define a BFP"
    binds = set # basic variable indices
    ninds = setdiff(1:size(A,1),binds) # non-basic
    B = A[:,binds]
    N = A[:,ninds]
    #cb = c[binds]
    #cn = c[ninds]
    
    if rank(B) != m
        return (:Infeasible, 0)
    end
    
    xb = B\b
    x = zeros(eltype(xb),n)
    x[binds] = xb
    x[ninds] = zero(eltype(xb))    
    
    if any(xb .< 0)
        return (:Infeasible, x)
    else
        #lam = B'\cb
        #sn = cn - N'*lam
        return (:Feasible, x)
    end
end

function exhaustive_linprog(c::Vector, A::Matrix, b::Vector)
    m,n = size(A)
    for inds in combinations(1:n,m) # for all combinations
        bfp = basic_feasible_point(A,b,inds)
        if bfp[1] == :Feasible
            # compute the objective
            x = bfp[2]
            obj = (c'*x)[1]
            @show (obj, inds, x)
        end
    end
end

A1 = [-2.0 1; 
      -1 2; 
       1 0]
b = [2.0; 7; 3]

A = [A1 eye(3)] # form the problem with slacks.
exhaustive_linprog([-1.0,-2.0,0.0,0.0,0.0],A,b)


(obj,inds,x) = (-13.0,[1,2,3],[3.0,5.0,3.0,0.0,0.0])
(obj,inds,x) = (-9.0,[1,2,5],[1.0,4.0,0.0,0.0,2.0])
(obj,inds,x) = (-3.0,[1,3,4],[3.0,0.0,8.0,10.0,0.0])
(obj,inds,x) = (-4.0,[2,4,5],[0.0,2.0,0.0,3.0,3.0])
(obj,inds,x) = (0.0,[3,4,5],[0.0,0.0,2.0,7.0,3.0])