## Problem Description and Formulation

The problem is an optimization problem where we need to maximize the objective function:

\[ 5.91 \times \text{hours worked by Bill} + 2.81 \times \text{hours worked by Jean} + 9.29 \times \text{hours worked by Paul} \]

subject to various constraints related to organization score, paperwork competence rating, and work quality rating.

## Constraints

The constraints can be summarized as follows:

### Individual Ratings

- Bill: organization score = 4.56, paperwork competence rating = 2.68, work quality rating = 2.54
- Jean: organization score = 3.6, paperwork competence rating = 0.38, work quality rating = 5.16
- Paul: organization score = 0.22, paperwork competence rating = 0.18, work quality rating = 0.83

### Combined Ratings

- Organization score (Bill, Paul) ≥ 13
- Paperwork competence rating (Bill, Paul) ≥ 19
- Paperwork competence rating (Jean, Paul) ≥ 11
- Work quality rating (Jean, Paul) ≥ 9
- Work quality rating (Bill, Jean) ≥ 12
- Organization score (Jean, Paul) ≤ 22
- Organization score (Bill, Jean, Paul) ≤ 22
- Paperwork competence rating (Bill, Paul) ≤ 50
- Paperwork competence rating (Bill, Jean, Paul) ≤ 50
- Work quality rating (Bill, Paul) ≤ 26
- Work quality rating (Jean, Paul) ≤ 25
- Work quality rating (Bill, Jean, Paul) ≤ 25

### Hours Worked

- Bill: whole number of hours
- Jean: fractional number of hours
- Paul: integer number of hours

## Gurobi Code Formulation

```python
import gurobi

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

    # Define variables
    bill_hours = model.addVar(name="bill_hours", lb=0, ub=gurobi.GRB.INFINITY, integrality=1)  # Whole number of hours
    jean_hours = model.addVar(name="jean_hours", lb=0, ub=gurobi.GRB.INFINITY)  # Fractional number of hours
    paul_hours = model.addVar(name="paul_hours", lb=0, ub=gurobi.GRB.INFINITY, integrality=1)  # Integer number of hours

    # Objective function
    model.setObjective(5.91 * bill_hours + 2.81 * jean_hours + 9.29 * paul_hours, gurobi.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(4.56 * bill_hours + 0.22 * paul_hours >= 13)  # Organization score (Bill, Paul)
    model.addConstr(2.68 * bill_hours + 0.18 * paul_hours >= 19)  # Paperwork competence rating (Bill, Paul)
    model.addConstr(0.38 * jean_hours + 0.18 * paul_hours >= 11)  # Paperwork competence rating (Jean, Paul)
    model.addConstr(5.16 * jean_hours + 0.83 * paul_hours >= 9)  # Work quality rating (Jean, Paul)
    model.addConstr(2.54 * bill_hours + 5.16 * jean_hours >= 12)  # Work quality rating (Bill, Jean)
    model.addConstr(3.6 * jean_hours + 0.22 * paul_hours <= 22)  # Organization score (Jean, Paul)
    model.addConstr(4.56 * bill_hours + 3.6 * jean_hours + 0.22 * paul_hours <= 22)  # Organization score (Bill, Jean, Paul)
    model.addConstr(2.68 * bill_hours + 0.18 * paul_hours <= 50)  # Paperwork competence rating (Bill, Paul)
    model.addConstr(2.68 * bill_hours + 0.38 * jean_hours + 0.18 * paul_hours <= 50)  # Paperwork competence rating (Bill, Jean, Paul)
    model.addConstr(2.54 * bill_hours + 0.83 * paul_hours <= 26)  # Work quality rating (Bill, Paul)
    model.addConstr(5.16 * jean_hours + 0.83 * paul_hours <= 25)  # Work quality rating (Jean, Paul)
    model.addConstr(2.54 * bill_hours + 5.16 * jean_hours + 0.83 * paul_hours <= 25)  # Work quality rating (Bill, Jean, Paul)

    # Optimize
    model.optimize()

    # Print solution
    if model.status == gurobi.GRB.OPTIMAL:
        print("Objective: ", model.objVal)
        print("Bill hours: ", bill_hours.varValue)
        print("Jean hours: ", jean_hours.varValue)
        print("Paul hours: ", paul_hours.varValue)
    else:
        print("No optimal solution found")

optimization_problem()
```