## Problem Description and Formulation

The problem requires minimizing the objective function:

\[ 9 \times \text{hours worked by Bobby} + 8 \times \text{hours worked by Jean} + 2 \times \text{hours worked by Hank} + 6 \times \text{hours worked by George} \]

subject to several constraints.

## Constraints

1. **Individual dollar costs per hour**:
   - Bobby's dollar cost per hour is 3.
   - Jean's dollar cost per hour is 15.
   - Hank's dollar cost per hour is 12.
   - George's dollar cost per hour is 17.

2. **Combined dollar costs per hour**:
   - The total combined dollar cost per hour from hours worked by Jean plus hours worked by George must be 40 or more.
   - The total combined dollar cost per hour from hours worked by Bobby, hours worked by Jean, and hours worked by George must be as much or more than 38.
   - The total combined dollar cost per hour from hours worked by Bobby, hours worked by Jean, hours worked by Hank, and hours worked by George has to be 38 or more.

3. **Linear constraint**:
   - \(-3 \times \text{hours worked by Hank} + 10 \times \text{hours worked by George} \geq 0\).

4. **Upper bounds on combined dollar costs per hour**:
   - The total combined dollar cost per hour from hours worked by Bobby and hours worked by George should be 113 or less.
   - The total combined dollar cost per hour from hours worked by Bobby, hours worked by Hank, and hours worked by George has to be at maximum 52.

5. **Integer and fractional hour constraints**:
   - There may be a non-integer number of hours worked by Bobby.
   - You are allowed to use a non-whole number of hours worked by Jean.
   - There mustn't be a non-whole number of hours worked by Hank.
   - You may have a fractional number of hours worked by George.

## Gurobi Code Formulation

```python
import gurobi

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

    # Define variables
    bobby_hours = model.addVar(name="bobby_hours", lb=0)  # No lower bound specified, assuming 0
    jean_hours = model.addVar(name="jean_hours", lb=0)    # No lower bound specified, assuming 0
    hank_hours = model.addVar(name="hank_hours", lb=0, integrality=gurobi.GRB.INTEGER)
    george_hours = model.addVar(name="george_hours", lb=0)

    # Objective function
    model.setObjective(9 * bobby_hours + 8 * jean_hours + 2 * hank_hours + 6 * george_hours, gurobi.GRB.MINIMIZE)

    # Constraints
    # Individual dollar costs per hour (not directly constraints, but part of the problem description)
    # Combined dollar costs per hour
    model.addConstraint(15 * jean_hours + 17 * george_hours >= 40)
    model.addConstraint(3 * bobby_hours + 15 * jean_hours + 17 * george_hours >= 38)
    model.addConstraint(3 * bobby_hours + 15 * jean_hours + 12 * hank_hours + 17 * george_hours >= 38)

    # Linear constraint
    model.addConstraint(-3 * hank_hours + 10 * george_hours >= 0)

    # Upper bounds on combined dollar costs per hour
    model.addConstraint(3 * bobby_hours + 17 * george_hours <= 113)
    model.addConstraint(3 * bobby_hours + 12 * hank_hours + 17 * george_hours <= 52)

    # Solve the model
    model.optimize()

    # Print the solution
    if model.status == gurobi.GRB.OPTIMAL:
        print("Objective: ", model.objval)
        print("Bobby hours: ", bobby_hours.varValue)
        print("Jean hours: ", jean_hours.varValue)
        print("Hank hours: ", hank_hours.varValue)
        print("George hours: ", george_hours.varValue)
    else:
        print("The model is infeasible")

optimization_problem()
```