```json
{
  "sym_variables": [
    ("x0", "hours worked by Dale"),
    ("x1", "hours worked by Laura"),
    ("x2", "hours worked by John"),
    ("x3", "hours worked by Peggy"),
    ("x4", "hours worked by Hank")
  ],
  "objective_function": "1.88 * x0 + 7.5 * x1 + 9.6 * x2 + 3.92 * x3 + 6.52 * x4",
  "constraints": [
    "18 * x1 + 17 * x3 >= 116",
    "13 * x0 + 9 * x2 >= 105",
    "13 * x0 + 11 * x4 >= 88",
    "18 * x1 + 11 * x4 >= 80",
    "9 * x2 + 17 * x3 >= 96",
    "13 * x0 + 18 * x1 + 9 * x2 >= 92",
    "9 * x2 + 17 * x3 + 11 * x4 >= 92",
    "13 * x0 + 18 * x1 + 9 * x2 >= 84",
    "9 * x2 + 17 * x3 + 11 * x4 >= 84",
    "18 * x1 + 11 * x4 <= 294",
    "17 * x3 + 11 * x4 <= 265",
    "18 * x1 + 17 * x3 <= 451",
    "13 * x0 + 9 * x2 <= 176",
    "13 * x0 + 18 * x1 <= 481",
    "13 * x0 + 11 * x4 <= 300",
    "9 * x2 + 11 * x4 <= 575",
    "13 * x0 + 18 * x1 + 9 * x2 + 17 * x3 + 11 * x4 <= 575"
  ]
}
```

```python
import gurobipy as gp

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

    # Create variables
    dale = m.addVar(vtype=gp.GRB.CONTINUOUS, name="dale")
    laura = m.addVar(vtype=gp.GRB.CONTINUOUS, name="laura")
    john = m.addVar(vtype=gp.GRB.CONTINUOUS, name="john")
    peggy = m.addVar(vtype=gp.GRB.CONTINUOUS, name="peggy")
    hank = m.addVar(vtype=gp.GRB.CONTINUOUS, name="hank")


    # Set objective function
    m.setObjective(1.88 * dale + 7.5 * laura + 9.6 * john + 3.92 * peggy + 6.52 * hank, gp.GRB.MAXIMIZE)

    # Add constraints
    m.addConstr(18 * laura + 17 * peggy >= 116)
    m.addConstr(13 * dale + 9 * john >= 105)
    m.addConstr(13 * dale + 11 * hank >= 88)
    m.addConstr(18 * laura + 11 * hank >= 80)
    m.addConstr(9 * john + 17 * peggy >= 96)
    m.addConstr(13 * dale + 18 * laura + 9 * john >= 92)
    m.addConstr(9 * john + 17 * peggy + 11 * hank >= 92)
    m.addConstr(13 * dale + 18 * laura + 9 * john >= 84)
    m.addConstr(9 * john + 17 * peggy + 11 * hank >= 84)
    m.addConstr(18 * laura + 11 * hank <= 294)
    m.addConstr(17 * peggy + 11 * hank <= 265)
    m.addConstr(18 * laura + 17 * peggy <= 451)
    m.addConstr(13 * dale + 9 * john <= 176)
    m.addConstr(13 * dale + 18 * laura <= 481)
    m.addConstr(13 * dale + 11 * hank <= 300)
    m.addConstr(9 * john + 11 * hank <= 575)
    m.addConstr(13 * dale + 18 * laura + 9 * john + 17 * peggy + 11 * hank <= 575)


    # Optimize model
    m.optimize()

    if m.status == gp.GRB.OPTIMAL:
        print('Obj: %g' % m.objVal)
        for v in m.getVars():
            print('%s %g' % (v.varName, v.x))
    elif m.status == gp.GRB.INFEASIBLE:
        print("The model is infeasible.")
    else:
        print("Optimization ended with status:", m.status)


except gp.GurobiError as e:
    print('Error code ' + str(e.errno) + ': ' + str(e))

except AttributeError:
    print('Encountered an attribute error')
```