## Problem Description and Formulation

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

\[ 4.03 \times \text{hours worked by Bill} + 7.68 \times \text{hours worked by John} \]

subject to several constraints.

## Constraints

1. **Individual Ratings Constraints**: These are given and do not directly limit the hours but are part of the combined constraints.
   - Bill's organization score: 6.44
   - Bill's productivity rating: 2.16
   - Bill's computer competence rating: 4.71
   - John's organization score: 5.84
   - John's productivity rating: 2.06
   - John's computer competence rating: 2.29

2. **Combined Constraints**:
   - Organization score: \(6.44 \times \text{hours worked by Bill} + 5.84 \times \text{hours worked by John} \geq 5\) and \(\leq 13\)
   - Productivity rating: \(2.16 \times \text{hours worked by Bill} + 2.06 \times \text{hours worked by John} \geq 39\) and \(\leq 78\)
   - Computer competence rating: \(4.71 \times \text{hours worked by Bill} + 2.29 \times \text{hours worked by John} \geq 7\) and \(\leq 15\)
   - Linear constraint: \(4 \times \text{hours worked by Bill} - 7 \times \text{hours worked by John} \geq 0\)

## Gurobi Code Formulation

```python
import gurobi

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

    # Define variables
    hours_worked_by_bill = model.addVar(name="hours_worked_by_bill", lb=0)
    hours_worked_by_john = model.addVar(name="hours_worked_by_john", lb=0)

    # Objective function
    model.setObjective(4.03 * hours_worked_by_bill + 7.68 * hours_worked_by_john, gurobi.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(6.44 * hours_worked_by_bill + 5.84 * hours_worked_by_john >= 5, name="org_score_min")
    model.addConstr(6.44 * hours_worked_by_bill + 5.84 * hours_worked_by_john <= 13, name="org_score_max")
    model.addConstr(2.16 * hours_worked_by_bill + 2.06 * hours_worked_by_john >= 39, name="productivity_min")
    model.addConstr(2.16 * hours_worked_by_bill + 2.06 * hours_worked_by_john <= 78, name="productivity_max")
    model.addConstr(4.71 * hours_worked_by_bill + 2.29 * hours_worked_by_john >= 7, name="computer_competence_min")
    model.addConstr(4.71 * hours_worked_by_bill + 2.29 * hours_worked_by_john <= 15, name="computer_competence_max")
    model.addConstr(4 * hours_worked_by_bill - 7 * hours_worked_by_john >= 0, name="linear_constraint")

    # Optimize
    model.optimize()

    # Print solution
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Hours worked by Bill: {hours_worked_by_bill.varValue}")
        print(f"Hours worked by John: {hours_worked_by_john.varValue}")
        print(f"Objective: {model.objVal}")
    else:
        print("The problem is infeasible")

solve_optimization_problem()
```