```json
{
  "sym_variables": [
    ("x0", "hours worked by Bill"),
    ("x1", "hours worked by John"),
    ("x2", "hours worked by Mary"),
    ("x3", "hours worked by Peggy")
  ],
  "objective_function": "3.85 * x0 + 5.18 * x1 + 2.03 * x2 + 3.6 * x3",
  "constraints": [
    "3 * x0 + 8 * x2 >= 33",
    "3 * x0 + 8 * x2 + 22 * x3 >= 82",
    "3 * x0 + 17 * x1 + 8 * x2 >= 82",
    "3 * x0 + 8 * x2 + 22 * x3 >= 53",
    "3 * x0 + 17 * x1 + 8 * x2 >= 53",
    "22 * x0 + 13 * x3 <= 186",
    "15 * x2 + 13 * x3 <= 217",
    "22 * x0 + 15 * x2 <= 262",
    "4 * x1 + 13 * x3 <= 162",
    "4 * x1 + 15 * x2 <= 255",
    "4 * x1 + 15 * x2 + 13 * x3 <= 247",
    "22 * x0 + 4 * x1 + 15 * x2 <= 200",
    "22 * x0 + 15 * x2 + 13 * x3 <= 192",
    "22 * x0 + 4 * x1 + 15 * x2 + 13 * x3 <= 192",
    "8 * x2 + 22 * x3 <= 254",
    "17 * x1 + 8 * x2 <= 209",
    "17 * x1 + 22 * x3 <= 242",
    "3 * x0 + 22 * x3 <= 192",
    "3 * x0 + 17 * x1 + 22 * x3 <= 329",
    "17 * x1 + 8 * x2 + 22 * x3 <= 291",
    "3 * x0 + 17 * x1 + 8 * x2 + 22 * x3 <= 291"
  ]
}
```

```python
import gurobipy as gp

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

# Create variables
bill_hours = model.addVar(vtype=gp.GRB.INTEGER, name="bill_hours")
john_hours = model.addVar(vtype=gp.GRB.INTEGER, name="john_hours")
mary_hours = model.addVar(vtype=gp.GRB.CONTINUOUS, name="mary_hours")
peggy_hours = model.addVar(vtype=gp.GRB.INTEGER, name="peggy_hours")


# Set objective function
model.setObjective(3.85 * bill_hours + 5.18 * john_hours + 2.03 * mary_hours + 3.6 * peggy_hours, gp.GRB.MAXIMIZE)

# Add constraints
model.addConstr(3 * bill_hours + 8 * mary_hours >= 33)
model.addConstr(3 * bill_hours + 8 * mary_hours + 22 * peggy_hours >= 82)
model.addConstr(3 * bill_hours + 17 * john_hours + 8 * mary_hours >= 82)
model.addConstr(3 * bill_hours + 8 * mary_hours + 22 * peggy_hours >= 53)
model.addConstr(3 * bill_hours + 17 * john_hours + 8 * mary_hours >= 53)
model.addConstr(22 * bill_hours + 13 * peggy_hours <= 186)
model.addConstr(15 * mary_hours + 13 * peggy_hours <= 217)
model.addConstr(22 * bill_hours + 15 * mary_hours <= 262)
model.addConstr(4 * john_hours + 13 * peggy_hours <= 162)
model.addConstr(4 * john_hours + 15 * mary_hours <= 255)
model.addConstr(4 * john_hours + 15 * mary_hours + 13 * peggy_hours <= 247)
model.addConstr(22 * bill_hours + 4 * john_hours + 15 * mary_hours <= 200)
model.addConstr(22 * bill_hours + 15 * mary_hours + 13 * peggy_hours <= 192)
model.addConstr(22 * bill_hours + 4 * john_hours + 15 * mary_hours + 13 * peggy_hours <= 192)
model.addConstr(8 * mary_hours + 22 * peggy_hours <= 254)
model.addConstr(17 * john_hours + 8 * mary_hours <= 209)
model.addConstr(17 * john_hours + 22 * peggy_hours <= 242)
model.addConstr(3 * bill_hours + 22 * peggy_hours <= 192)
model.addConstr(3 * bill_hours + 17 * john_hours + 22 * peggy_hours <= 329)
model.addConstr(17 * john_hours + 8 * mary_hours + 22 * peggy_hours <= 291)
model.addConstr(3 * bill_hours + 17 * john_hours + 8 * mary_hours + 22 * peggy_hours <= 291)


# Optimize model
model.optimize()

# Print results
if model.status == gp.GRB.OPTIMAL:
    print("Optimal solution found:")
    print("Bill's hours:", bill_hours.x)
    print("John's hours:", john_hours.x)
    print("Mary's hours:", mary_hours.x)
    print("Peggy's hours:", peggy_hours.x)
    print("Objective value:", model.objVal)
elif model.status == gp.GRB.INFEASIBLE:
    print("Model is infeasible.")
else:
    print("Optimization terminated with status:", model.status)

```
