It is required to perform all tasks by assigning exactly one agent to each task and exactly one task to each agent in such a way that the total cost of the assignment is minimized.
If the numbers of agents and tasks are equal, and the total cost of the assignment for all tasks is equal to the sum of the costs for each agent (or the sum of the costs for each task, which is the same thing in this case), then the problem is called the linear assignment problem.
In the above example, suppose that there are four taxis available, but still only three customers.
Then a fourth dummy task can be invented, perhaps called "sitting still doing nothing", with a cost of 0 for the taxi assigned to it.
The assignment problem is a fundamental combinatorial optimization problem.
It consists of finding, in a weighted bipartite graph, a matching in which the sum of weights of the edges is as large as possible.
This is because the constraint matrix of the fractional LP is totally unimodular - it satisfies the four conditions of Hoffman and Gale. By similar considerations we move from one vertex to another, collecting edges with fractional values.
Since the graph is finite, at some point we must have a cycle.
These weights should exceed the weights of all existing matchings to prevent appearance of artificial edges in the possible solution.
As shown by Mulmuley, Vazirani and Vazirani, the problem of minimum weight perfect matching is converted to finding minors in the adjacency matrix of a graph.