```json
{
  "sym_variables": [
    ("x0", "eggs"),
    ("x1", "strips of bacon"),
    ("x2", "peanutbutter sandwiches"),
    ("x3", "chicken breasts")
  ],
  "objective_function": "6*x0 + 3*x1 + 6*x2 + 9*x3",
  "constraints": [
    "8*x0 + 17*x1 >= 31",
    "8*x0 + 14*x3 >= 36",
    "17*x1 + 8*x2 >= 18",
    "17*x1 + 8*x2 + 14*x3 >= 35",
    "8*x0 + 8*x2 + 14*x3 >= 35",
    "8*x0 + 17*x1 + 14*x3 >= 35",
    "17*x1 + 8*x2 + 14*x3 >= 38",
    "8*x0 + 8*x2 + 14*x3 >= 38",
    "8*x0 + 17*x1 + 14*x3 >= 38",
    "17*x1 + 8*x2 + 14*x3 >= 36",
    "8*x0 + 8*x2 + 14*x3 >= 36",
    "8*x0 + 17*x1 + 14*x3 >= 36",
    "8*x0 + 17*x1 + 8*x2 + 14*x3 >= 36",
    "3*x1 + 6*x3 >= 15",
    "7*x0 + 10*x2 >= 45",
    "10*x2 + 6*x3 >= 32",
    "7*x0 + 3*x1 + 6*x3 >= 22",
    "7*x0 + 3*x1 + 10*x2 + 6*x3 >= 22",
    "13*x2 + 8*x3 >= 21",
    "8*x0 + 6*x1 >= 15",
    "8*x0 + 8*x3 >= 18",
    "6*x1 + 13*x2 >= 11",
    "8*x0 + 6*x1 + 13*x2 + 8*x3 >= 11",
    "9*x1 - x2 >= 0",
    "8*x2 + 14*x3 <= 60",
    "10*x2 + 6*x3 <= 151",
    "8*x0 <= 167",
    "7*x0 <= 183",
    "8*x0 <= 118",
    "17*x1 <= 167",
    "3*x1 <= 183",
    "6*x1 <= 118",
    "8*x2 <= 167",
    "10*x2 <= 183",
    "13*x2 <= 118",
    "14*x3 <= 167",
    "6*x3 <= 183",
    "8*x3 <= 118",
    "x0 == int(x0)",  
    "x2 == int(x2)",
    "x3 == int(x3)"
  ]
}
```

```python
import gurobipy as gp

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

# Create variables
eggs = m.addVar(vtype=gp.GRB.INTEGER, name="eggs")
bacon = m.addVar(vtype=gp.GRB.CONTINUOUS, name="bacon")
sandwiches = m.addVar(vtype=gp.GRB.INTEGER, name="sandwiches")
chicken = m.addVar(vtype=gp.GRB.INTEGER, name="chicken")

# Set objective function
m.setObjective(6*eggs + 3*bacon + 6*sandwiches + 9*chicken, gp.GRB.MINIMIZE)

# Add constraints
m.addConstr(8*eggs + 17*bacon >= 31)
m.addConstr(8*eggs + 14*chicken >= 36)
m.addConstr(17*bacon + 8*sandwiches >= 18)
m.addConstr(17*bacon + 8*sandwiches + 14*chicken >= 35)
m.addConstr(8*eggs + 8*sandwiches + 14*chicken >= 35)
m.addConstr(8*eggs + 17*bacon + 14*chicken >= 35)
m.addConstr(17*bacon + 8*sandwiches + 14*chicken >= 38)
m.addConstr(8*eggs + 8*sandwiches + 14*chicken >= 38)
m.addConstr(8*eggs + 17*bacon + 14*chicken >= 38)
m.addConstr(17*bacon + 8*sandwiches + 14*chicken >= 36)
m.addConstr(8*eggs + 8*sandwiches + 14*chicken >= 36)
m.addConstr(8*eggs + 17*bacon + 14*chicken >= 36)
m.addConstr(8*eggs + 17*bacon + 8*sandwiches + 14*chicken >= 36)
m.addConstr(3*bacon + 6*chicken >= 15)
m.addConstr(7*eggs + 10*sandwiches >= 45)
m.addConstr(10*sandwiches + 6*chicken >= 32)
m.addConstr(7*eggs + 3*bacon + 6*chicken >= 22)
m.addConstr(7*eggs + 3*bacon + 10*sandwiches + 6*chicken >= 22)
m.addConstr(13*sandwiches + 8*chicken >= 21)
m.addConstr(8*eggs + 6*bacon >= 15)
m.addConstr(8*eggs + 8*chicken >= 18)
m.addConstr(6*bacon + 13*sandwiches >= 11)
m.addConstr(8*eggs + 6*bacon + 13*sandwiches + 8*chicken >= 11)
m.addConstr(9*bacon - sandwiches >= 0)
m.addConstr(8*sandwiches + 14*chicken <= 60)
m.addConstr(10*sandwiches + 6*chicken <= 151)

# Resource Constraints
m.addConstr(8*eggs <= 167)
m.addConstr(7*eggs <= 183)
m.addConstr(8*eggs <= 118)
m.addConstr(17*bacon <= 167)
m.addConstr(3*bacon <= 183)
m.addConstr(6*bacon <= 118)
m.addConstr(8*sandwiches <= 167)
m.addConstr(10*sandwiches <= 183)
m.addConstr(13*sandwiches <= 118)
m.addConstr(14*chicken <= 167)
m.addConstr(6*chicken <= 183)
m.addConstr(8*chicken <= 118)


# Optimize model
m.optimize()

# Print results
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 %d" % m.status)

```
