## Problem Description and Formulation

The problem is an optimization problem with the goal of minimizing a linear objective function subject to several linear constraints. The variables are the hours worked by Jean, George, and Bill. The objective function to minimize is $7.52 \times \text{hours worked by Jean} + 9.79 \times \text{hours worked by George} + 6.1 \times \text{hours worked by Bill}$.

The constraints are as follows:
- The likelihood to quit index for Jean is 3.
- The likelihood to quit index for George is 2.
- The likelihood to quit index for Bill is 8.
- $3 \times \text{hours worked by Jean} + 8 \times \text{hours worked by Bill} \geq 14$
- $2 \times \text{hours worked by George} + 8 \times \text{hours worked by Bill} \geq 19$
- $3 \times \text{hours worked by Jean} + 2 \times \text{hours worked by George} \geq 13$
- $3 \times \text{hours worked by Jean} + 2 \times \text{hours worked by George} + 8 \times \text{hours worked by Bill} \geq 22$
- $9 \times \text{hours worked by Jean} - 3 \times \text{hours worked by Bill} \geq 0$
- $7 \times \text{hours worked by Jean} - 2 \times \text{hours worked by George} \geq 0$
- $2 \times \text{hours worked by George} + 8 \times \text{hours worked by Bill} \leq 48$
- $3 \times \text{hours worked by Jean} + 8 \times \text{hours worked by Bill} \leq 38$
- $\text{hours worked by Jean}$ and $\text{hours worked by George}$ can be non-integer, but $\text{hours worked by Bill}$ must be an integer.

## Gurobi Code Formulation

```python
import gurobi as gp

# Create a new model
m = gp.Model()

# Define the variables
jean = m.addVar(lb=0, name="jean")  # hours worked by Jean
george = m.addVar(lb=0, name="george")  # hours worked by George
bill = m.addVar(lb=0, vtype=gp.GRB.INTEGER, name="bill")  # hours worked by Bill

# Define the objective function
m.setObjective(7.52 * jean + 9.79 * george + 6.1 * bill, gp.GRB.MINIMIZE)

# Define the constraints
m.addConstr(jean >= 0, name="jean_non_negative")
m.addConstr(george >= 0, name="george_non_negative")
m.addConstr(bill >= 0, name="bill_non_negative")

# Likelihood to quit index constraints
m.addConstr(3 * jean + 8 * bill >= 14, name="likelihood_jean_bill")
m.addConstr(2 * george + 8 * bill >= 19, name="likelihood_george_bill")
m.addConstr(3 * jean + 2 * george >= 13, name="likelihood_jean_george")
m.addConstr(3 * jean + 2 * george + 8 * bill >= 22, name="likelihood_all")

# Additional constraints
m.addConstr(9 * jean - 3 * bill >= 0, name="jean_bill_constraint")
m.addConstr(7 * jean - 2 * george >= 0, name="jean_george_constraint")
m.addConstr(2 * george + 8 * bill <= 48, name="george_bill_upper_bound")
m.addConstr(3 * jean + 8 * bill <= 38, name="jean_bill_upper_bound")

# Solve the model
m.optimize()

# Print the solution
if m.status == gp.GRB.OPTIMAL:
    print("Optimal solution found.")
    print(f"Hours worked by Jean: {jean.varValue}")
    print(f"Hours worked by George: {george.varValue}")
    print(f"Hours worked by Bill: {bill.varValue}")
    print(f"Objective: {m.objVal}")
else:
    print("No optimal solution found.")
```