Submodular Functions and Optimization