## Problem Description and Formulation

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

\[ 6.81 \times \text{hours worked by Laura} + 3.82 \times \text{hours worked by Hank} + 7.83 \times \text{hours worked by Bobby} \]

subject to several constraints related to the likelihood to quit index and organization score for each individual.

## Constraints

1. Individual constraints:
   - Laura's likelihood to quit index: 2
   - Laura's organization score: 16
   - Hank's likelihood to quit index: 19
   - Hank's organization score: 16
   - Bobby's likelihood to quit index: 9
   - Bobby's organization score: 15

2. Combined constraints:
   - \( \text{Laura} \times r0_{x0} + \text{Hank} \times r0_{x1} \geq 60 \)
   - \( \text{Hank} \times r0_{x1} + \text{Bobby} \times r0_{x2} \leq 192 \)
   - \( \text{Laura} \times r0_{x0} + \text{Bobby} \times r0_{x2} \leq 98 \)
   - \( \text{Laura} \times r0_{x0} + \text{Hank} \times r0_{x1} \leq 109 \)
   - \( \text{Laura} \times r0_{x0} + \text{Hank} \times r0_{x1} + \text{Bobby} \times r0_{x2} \leq 109 \)
   - \( \text{Laura} \times r1_{x0} + \text{Bobby} \times r1_{x2} \leq 139 \)
   - \( \text{Laura} \times r1_{x0} + \text{Hank} \times r1_{x1} \leq 74 \)
   - \( \text{Laura} \times r1_{x0} + \text{Hank} \times r1_{x1} + \text{Bobby} \times r1_{x2} \leq 74 \)

## Gurobi Code

```python
import gurobipy as gp

# Define resources/attributes
resources = {
    'r0': {'x0': 2, 'x1': 19, 'x2': 9, 'upper_bound': 197},
    'r1': {'x0': 16, 'x1': 16, 'x2': 15, 'upper_bound': 146}
}

# Define model
model = gp.Model("optimization_problem")

# Define variables
laura_hours = model.addVar(name="laura_hours", lb=0)  # Non-negative hours
hank_hours = model.addVar(name="hank_hours", lb=0)   # Non-negative hours
bobby_hours = model.addVar(name="bobby_hours", lb=0) # Non-negative hours

# Objective function
model.setObjective(6.81 * laura_hours + 3.82 * hank_hours + 7.83 * bobby_hours, gp.GRB.MAXIMIZE)

# Constraints
model.addConstr(laura_hours * resources['r0']['x0'] + hank_hours * resources['r0']['x1'] >= 60)
model.addConstr(hank_hours * resources['r0']['x1'] + bobby_hours * resources['r0']['x2'] <= 192)
model.addConstr(laura_hours * resources['r0']['x0'] + bobby_hours * resources['r0']['x2'] <= 98)
model.addConstr(laura_hours * resources['r0']['x0'] + hank_hours * resources['r0']['x1'] <= 109)
model.addConstr(laura_hours * resources['r0']['x0'] + hank_hours * resources['r0']['x1'] + bobby_hours * resources['r0']['x2'] <= 109)
model.addConstr(laura_hours * resources['r1']['x0'] + bobby_hours * resources['r1']['x2'] <= 139)
model.addConstr(laura_hours * resources['r1']['x0'] + hank_hours * resources['r1']['x1'] <= 74)
model.addConstr(laura_hours * resources['r1']['x0'] + hank_hours * resources['r1']['x1'] + bobby_hours * resources['r1']['x2'] <= 74)

# Solve model
model.optimize()

# Print solution
if model.status == gp.GRB.OPTIMAL:
    print("Optimal Solution:")
    print(f"Laura's hours: {laura_hours.varValue}")
    print(f"Hank's hours: {hank_hours.varValue}")
    print(f"Bobby's hours: {bobby_hours.varValue}")
    print(f"Objective: {model.objVal}")
else:
    print("No optimal solution found.")
```