## Problem Description and Formulation

The problem is an optimization problem with the goal to minimize a linear objective function subject to several linear constraints. The variables are the hours worked by Jean, Dale, and Paul. The objective function to minimize is $4.5J + 9.58D + 5.64P$, where $J$, $D$, and $P$ represent the hours worked by Jean, Dale, and Paul, respectively.

## Constraints

1. The total combined dollar cost per hour from hours worked by Dale plus hours worked by Paul has to be 32 at minimum: $6D + 10P \geq 32$.
2. The total combined dollar cost per hour from hours worked by Jean plus hours worked by Dale must be 54 at a minimum: $16J + 6D \geq 54$.
3. The total combined dollar cost per hour from hours worked by Jean plus hours worked by Dale plus hours worked by Paul has to be at minimum 54: $16J + 6D + 10P \geq 54$.
4. The total combined productivity rating from hours worked by Dale, and hours worked by Paul has to be equal to or greater than 41: $23D + 20P \geq 41$.
5. The total combined productivity rating from hours worked by Jean plus hours worked by Dale plus hours worked by Paul must be at minimum 41: $12J + 23D + 20P \geq 41$.
6. Six times the number of hours worked by Dale, plus -7 times the number of hours worked by Paul must be no less than zero: $6D - 7P \geq 0$.
7. 6 times the number of hours worked by Jean, plus -5 times the number of hours worked by Paul must be greater than or equal to zero: $6J - 5P \geq 0$.
8. The total combined dollar cost per hour from hours worked by Dale and hours worked by Paul should be 169 at maximum: $6D + 10P \leq 169$.
9. The total combined dollar cost per hour from hours worked by Jean and hours worked by Paul should be at maximum 148: $16J + 10P \leq 148$.
10. The total combined productivity rating from hours worked by Jean and hours worked by Dale should be 116 or less: $12J + 23D \leq 116$.

## Gurobi Code

```python
import gurobi

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

    # Define the variables
    J = model.addVar(name="hours_worked_by_Jean", lb=0)
    D = model.addVar(name="hours_worked_by_Dale", lb=0)
    P = model.addVar(name="hours_worked_by_Paul", lb=0)

    # Define the objective function
    model.setObjective(4.5 * J + 9.58 * D + 5.64 * P, gurobi.GRB.MINIMIZE)

    # Add constraints
    model.addConstr(6 * D + 10 * P >= 32, name="min_dollar_cost_D_P")
    model.addConstr(16 * J + 6 * D >= 54, name="min_dollar_cost_J_D")
    model.addConstr(16 * J + 6 * D + 10 * P >= 54, name="min_dollar_cost_J_D_P")
    model.addConstr(23 * D + 20 * P >= 41, name="min_productivity_D_P")
    model.addConstr(12 * J + 23 * D + 20 * P >= 41, name="min_productivity_J_D_P")
    model.addConstr(6 * D - 7 * P >= 0, name="D_P_constraint")
    model.addConstr(6 * J - 5 * P >= 0, name="J_P_constraint")
    model.addConstr(6 * D + 10 * P <= 169, name="max_dollar_cost_D_P")
    model.addConstr(16 * J + 10 * P <= 148, name="max_dollar_cost_J_P")
    model.addConstr(12 * J + 23 * D <= 116, name="max_productivity_J_D")

    # Optimize the model
    model.optimize()

    # Print the status of the model
    if model.status == gurobi.GRB.OPTIMAL:
        print("Optimal solution found.")
        print(f"Hours worked by Jean: {J.varValue}")
        print(f"Hours worked by Dale: {D.varValue}")
        print(f"Hours worked by Paul: {P.varValue}")
        print(f"Objective function value: {model.objVal}")
    elif model.status == gurobi.GRB.INFEASIBLE:
        print("The model is infeasible.")
    else:
        print("The model has a non-optimal status.")

solve_optimization_problem()
```