## Problem Description and Formulation

The problem is a linear optimization problem with integer and continuous variables. The goal is to minimize a linear objective function subject to various linear constraints.

### Variables

- $x_0$: hours worked by Mary (integer)
- $x_1$: hours worked by Laura (integer)
- $x_2$: hours worked by Peggy (continuous)
- $x_3$: hours worked by John (integer)

### Objective Function

Minimize: $6.59x_0 + 2.27x_1 + 9.41x_2 + 8.96x_3$

### Constraints

1. $x_0 \geq 0$
2. $x_1 \geq 0$
3. $x_2 \geq 0$
4. $x_3 \geq 0$
5. $1x_0 + 5x_1 \geq 21$
6. $1x_0 + 14x_2 \geq 39$
7. $5x_1 + 14x_2 + 1x_3 \geq 45$
8. $1x_0 + 5x_1 + 14x_2 + 1x_3 \geq 45$
9. $6x_1 + 4x_3 \geq 13$
10. $6x_2 + 4x_3 \geq 25$
11. $6x_1 + 6x_2 \geq 11$
12. $15x_0 + 6x_1 + 6x_2 + 4x_3 \geq 11$
13. $9x_2 - 4x_3 \geq 0$
14. $1x_0 + 5x_1 + 1x_3 \leq 216$
15. $5x_1 + 14x_2 + 1x_3 \leq 225$
16. $1x_0 + 5x_1 + 14x_2 \leq 134$
17. $15x_0 + 6x_1 + 6x_2 \leq 84$
18. $6x_1 + 6x_2 + 4x_3 \leq 112$

## Gurobi Code

```python
import gurobi

def solve_optimization_problem():
    # Create a new model
    model = gurobi.Model()

    # Define variables
    x0 = model.addVar(name="Mary", vtype=gurobi.GRB.INTEGER, lb=0)
    x1 = model.addVar(name="Laura", vtype=gurobi.GRB.INTEGER, lb=0)
    x2 = model.addVar(name="Peggy", vtype=gurobi.GRB.CONTINUOUS, lb=0)
    x3 = model.addVar(name="John", vtype=gurobi.GRB.INTEGER, lb=0)

    # Objective function
    model.setObjective(6.59 * x0 + 2.27 * x1 + 9.41 * x2 + 8.96 * x3, gurobi.GRB.MINIMIZE)

    # Constraints
    model.addConstr(1 * x0 + 5 * x1 >= 21, name="cost_constraint_1")
    model.addConstr(1 * x0 + 14 * x2 >= 39, name="cost_constraint_2")
    model.addConstr(5 * x1 + 14 * x2 + 1 * x3 >= 45, name="cost_constraint_3")
    model.addConstr(1 * x0 + 5 * x1 + 14 * x2 + 1 * x3 >= 45, name="cost_constraint_4")
    model.addConstr(6 * x1 + 4 * x3 >= 13, name="rating_constraint_1")
    model.addConstr(6 * x2 + 4 * x3 >= 25, name="rating_constraint_2")
    model.addConstr(6 * x1 + 6 * x2 >= 11, name="rating_constraint_3")
    model.addConstr(15 * x0 + 6 * x1 + 6 * x2 + 4 * x3 >= 11, name="rating_constraint_4")
    model.addConstr(9 * x2 - 4 * x3 >= 0, name="peggy_john_constraint")
    model.addConstr(1 * x0 + 5 * x1 + 1 * x3 <= 216, name="cost_upper_bound_1")
    model.addConstr(5 * x1 + 14 * x2 + 1 * x3 <= 225, name="cost_upper_bound_2")
    model.addConstr(1 * x0 + 5 * x1 + 14 * x2 <= 134, name="cost_upper_bound_3")
    model.addConstr(15 * x0 + 6 * x1 + 6 * x2 <= 84, name="rating_upper_bound_1")
    model.addConstr(6 * x1 + 6 * x2 + 4 * x3 <= 112, name="rating_upper_bound_2")

    # Optimize
    model.optimize()

    # Print solution
    if model.status == gurobi.GRB.OPTIMAL:
        print("Objective: ", model.objval)
        print("Mary: ", x0.varValue)
        print("Laura: ", x1.varValue)
        print("Peggy: ", x2.varValue)
        print("John: ", x3.varValue)
    else:
        print("No solution found")

solve_optimization_problem()
```