Goal Programming is a fancy name for a very simple idea: the line between objectives and constraints is not completely solid. In particular, when there are a number of objectives, it is normally a good idea to treat some or all of them as constraints instead of objectives.
Again, a particular example will illustrate this best. Suppose we are developing an advertising campaign. We would like to reach three groups of people: High Income Women (HIW), Teenage Boys (TB), and Retired Men (RM) (the product is obvious). We can advertise on TV and/or in a magazine. An ad in each of these gives the following audience:
Our budget is $600,000.
Now, if we did not need to worry about TB and RM, then we would have a simple linear program to optimize the number or HIW reached:
with solution x=6, y=0, reaching 42 million HIW. Similar calculations show that the maximum number of TB is 60 million, and the maximum number of RM is 40 million. We could take each of the values as ``goals'' and try to find a solution that comes close to all of the goals. Since it is impossible to reach all of the goals simultaneously, we would penalize ourselves for not reaching a goal. This penalty (probably an artificial value) would depend on the importance of reaching a particular group. So, if we value HIW more than TB more than RM, we could end up with penalties of 200, 100 and 50 respectively. We create new variables to represent our failure in meeting a goal, and create a new linear program
The solution to this is . We meet the first two goals, and fall short on the third. We could experiment with other weights to see if we can find a ``better'' solution.
That is really all there is to goal programming: change some objectives into constraints by adding slack and/or surplus variables to represent deviation from a goal. There are some algorithmic changes possible to allow a more effective solution, but for the majority of applications, simply using a linear programming package like Solver is completely adequate.