## Problem Description and Formulation

The problem requires minimizing the objective function: $9 \times \text{hours worked by John} + 6 \times \text{hours worked by Bobby}$, subject to several constraints.

### Variables and Resources

- Variables: 
  - $x_0$: hours worked by John
  - $x_1$: hours worked by Bobby

- Resources/Attributes:
  - $r_0$: productivity rating
    - $x_0$ coefficient: 1
    - $x_1$ coefficient: 1
    - Upper bound: 104
  - $r_1$: computer competence rating
    - $x_0$ coefficient: 6
    - $x_1$ coefficient: 9
    - Upper bound: 85

### Constraints

1. Individual productivity ratings: 
   - John's productivity rating: $1 \times x_0$
   - Bobby's productivity rating: $1 \times x_1$

2. Individual computer competence ratings:
   - John's computer competence rating: $6 \times x_0$
   - Bobby's computer competence rating: $9 \times x_1$

3. Combined ratings constraints:
   - Combined productivity rating: $1x_0 + 1x_1 \geq 21$
   - Combined computer competence rating: $6x_0 + 9x_1 \geq 24$
   - Upper bounds:
     - Combined productivity rating: $1x_0 + 1x_1 \leq 56$
     - Combined computer competence rating: $6x_0 + 9x_1 \leq 42$

4. Additional constraint:
   - $-7x_0 + 4x_1 \geq 0$

### Gurobi Code Formulation

```python
import gurobipy as gp

# Create a new model
model = gp.Model("optimization_problem")

# Define variables
hours_worked_by_John = model.addVar(name="hours_worked_by_John", lb=0)  # Assuming hours cannot be negative
hours_worked_by_Bobby = model.addVar(name="hours_worked_by_Bobby", lb=0)  # Assuming hours cannot be negative

# Objective function: Minimize 9 * hours_worked_by_John + 6 * hours_worked_by_Bobby
model.setObjective(9 * hours_worked_by_John + 6 * hours_worked_by_Bobby, gp.GRB.MINIMIZE)

# Constraints
model.addConstr(hours_worked_by_John + hours_worked_by_Bobby >= 21, name="productivity_rating_constraint")
model.addConstr(6 * hours_worked_by_John + 9 * hours_worked_by_Bobby >= 24, name="computer_competence_rating_constraint")
model.addConstr(hours_worked_by_John + hours_worked_by_Bobby <= 56, name="productivity_upper_bound_constraint")
model.addConstr(6 * hours_worked_by_John + 9 * hours_worked_by_Bobby <= 42, name="computer_competence_upper_bound_constraint")
model.addConstr(-7 * hours_worked_by_John + 4 * hours_worked_by_Bobby >= 0, name="additional_constraint")

# Solve the model
model.optimize()

# Print the solution
if model.status == gp.GRB.OPTIMAL:
    print("Optimal Solution:")
    print(f"Hours worked by John: {hours_worked_by_John.varValue}")
    print(f"Hours worked by Bobby: {hours_worked_by_Bobby.varValue}")
    print(f"Objective: {model.objVal}")
else:
    print("The model is infeasible or unbounded.")
```