```json
{
  "sym_variables": [
    ("x0", "diapers"),
    ("x1", "toilet paper rolls"),
    ("x2", "candles"),
    ("x3", "rubber gloves"),
    ("x4", "dish soap bottles")
  ],
  "objective_function": "2*x0 + 5*x1 + 8*x2 + 6*x3 + 5*x4",
  "constraints": [
    "2*x1 + 11*x2 >= 26",
    "3*x0 + 11*x3 >= 43",
    "11*x2 + 11*x3 >= 16",
    "11*x2 + 12*x4 >= 39",
    "2*x1 + 12*x4 >= 31",
    "2*x1 + 11*x3 >= 40",
    "3*x0 + 2*x1 >= 20",
    "2*x1 + 11*x2 <= 121",
    "3*x0 + 2*x1 <= 100",
    "3*x0 + 11*x2 <= 62",
    "3*x0 + 2*x1 + 11*x3 <= 88",
    "3*x0 + 11*x3 + 12*x4 <= 179",
    "3*x0 + 2*x1 + 12*x4 <= 69",
    "3*x0 + 2*x1 + 11*x2 <= 152",
    "2*x1 + 11*x2 + 12*x4 <= 150",
    "3*x0 + 2*x1 + 11*x2 + 11*x3 + 12*x4 <= 150",
    "3*x0 + 2*x1 + 11*x2 + 11*x3 + 12*x4 <= 216" 
  ]
}
```

```python
import gurobipy as gp

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

    # Create variables
    diapers = m.addVar(vtype=gp.GRB.INTEGER, name="diapers")
    toilet_paper_rolls = m.addVar(vtype=gp.GRB.INTEGER, name="toilet_paper_rolls")
    candles = m.addVar(vtype=gp.GRB.INTEGER, name="candles")
    rubber_gloves = m.addVar(vtype=gp.GRB.INTEGER, name="rubber_gloves")
    dish_soap_bottles = m.addVar(vtype=gp.GRB.INTEGER, name="dish_soap_bottles")

    # Set objective function
    m.setObjective(2*diapers + 5*toilet_paper_rolls + 8*candles + 6*rubber_gloves + 5*dish_soap_bottles, gp.GRB.MAXIMIZE)

    # Add constraints
    m.addConstr(2*toilet_paper_rolls + 11*candles >= 26)
    m.addConstr(3*diapers + 11*rubber_gloves >= 43)
    m.addConstr(11*candles + 11*rubber_gloves >= 16)
    m.addConstr(11*candles + 12*dish_soap_bottles >= 39)
    m.addConstr(2*toilet_paper_rolls + 12*dish_soap_bottles >= 31)
    m.addConstr(2*toilet_paper_rolls + 11*rubber_gloves >= 40)
    m.addConstr(3*diapers + 2*toilet_paper_rolls >= 20)
    m.addConstr(2*toilet_paper_rolls + 11*candles <= 121)
    m.addConstr(3*diapers + 2*toilet_paper_rolls <= 100)
    m.addConstr(3*diapers + 11*candles <= 62)
    m.addConstr(3*diapers + 2*toilet_paper_rolls + 11*rubber_gloves <= 88)
    m.addConstr(3*diapers + 11*rubber_gloves + 12*dish_soap_bottles <= 179)
    m.addConstr(3*diapers + 2*toilet_paper_rolls + 12*dish_soap_bottles <= 69)
    m.addConstr(3*diapers + 2*toilet_paper_rolls + 11*candles <= 152)
    m.addConstr(2*toilet_paper_rolls + 11*candles + 12*dish_soap_bottles <= 150)
    m.addConstr(3*diapers + 2*toilet_paper_rolls + 11*candles + 11*rubber_gloves + 12*dish_soap_bottles <= 150)
    m.addConstr(3*diapers + 2*toilet_paper_rolls + 11*candles + 11*rubber_gloves + 12*dish_soap_bottles <= 216)


    # 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('Optimization problem is infeasible.')


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

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