```json
{
  "sym_variables": [
    ("x0", "steaks"),
    ("x1", "cantaloupes"),
    ("x2", "lemons"),
    ("x3", "potatoes"),
    ("x4", "oranges"),
    ("x5", "slices of pizza"),
    ("x6", "cornichons")
  ],
  "objective_function": "6*x0 + 4*x1 + 1*x2 + 4*x3 + 2*x4 + 5*x5 + 8*x6",
  "constraints": [
    "16*x0 + 3*x1 >= 23",
    "16*x0 + 7*x4 >= 56",
    "16*x0 + 1*x6 >= 30",
    "19*x3 + 1*x6 >= 33",
    "3*x1 + 4*x5 >= 51",
    "15*x2 + 7*x4 + 1*x6 >= 41",
    "16*x0 + 3*x1 + 15*x2 >= 41",
    "16*x0 + 15*x2 + 7*x4 >= 41",
    "16*x0 + 15*x2 + 19*x3 >= 41",
    "16*x0 + 19*x3 + 1*x6 >= 41",
    "15*x2 + 19*x3 + 4*x5 >= 41",
    "15*x2 + 4*x5 + 1*x6 >= 41",
    "16*x0 + 3*x1 + 7*x4 >= 41",
    "15*x2 + 7*x4 + 1*x6 >= 38",
    "16*x0 + 3*x1 + 15*x2 >= 38",
    "16*x0 + 15*x2 + 7*x4 >= 38",
    "16*x0 + 15*x2 + 19*x3 >= 38",
    "16*x0 + 19*x3 + 1*x6 >= 38",
    "15*x2 + 19*x3 + 4*x5 >= 38",
    "15*x2 + 4*x5 + 1*x6 >= 38",
    "16*x0 + 3*x1 + 7*x4 >= 38",
    "15*x2 + 7*x4 + 1*x6 >= 50",
    "16*x0 + 3*x1 + 15*x2 >= 50",
    "16*x0 + 15*x2 + 7*x4 >= 50",
    "16*x0 + 15*x2 + 19*x3 >= 50",
    "16*x0 + 19*x3 + 1*x6 >= 50",
    "15*x2 + 19*x3 + 4*x5 >= 50",
    "15*x2 + 4*x5 + 1*x6 >= 50",
    "16*x0 + 3*x1 + 7*x4 >= 50",
    "15*x2 + 7*x4 + 1*x6 >= 33",
    "16*x0 + 3*x1 + 15*x2 >= 33",
    "16*x0 + 15*x2 + 7*x4 >= 33",
    "16*x0 + 15*x2 + 19*x3 >= 33",
    "16*x0 + 19*x3 + 1*x6 >= 33",
    "15*x2 + 19*x3 + 4*x5 >= 33",
    "15*x2 + 4*x5 + 1*x6 >= 33",
    "16*x0 + 3*x1 + 7*x4 >= 33",
    "4*x5 + 1*x6 >= 49",
    "5*x0 + 19*x5 >= 31",
    "16*x0 + 19*x3 + 4*x5 <= 178",
    "16*x0 + 3*x1 <= 323",
    "3*x1 + 7*x4 <= 318",
    "3*x1 + x6 <= 274",
    "16*x0 + 7*x4 <= 228",
    "3*x1 + 19*x3 <= 333",
    "16*x0 + 7*x4 + 4*x5 <= 76",
    "3*x1 + 15*x2 + x6 <= 202",
    "15*x2 + 19*x3 + x6 <= 175",
    "16*x0 + 15*x2 + x6 <= 61",
    "16*x0 + 15*x2 + 4*x5 <= 280",
    "3*x1 + 7*x4 + x6 <= 95",
    "16*x0 + 15*x2 + 19*x3 <= 161",
    "16*x0 + 3*x1 + 7*x4 <= 317",
    "3*x1 + 15*x2 + 4*x5 <= 318",
    "3*x1 + 19*x3 + 7*x4 <= 191",
    "15*x2 + 7*x4 + x6 <= 309",
    "16*x0 + 3*x1 + 19*x3 <= 382",
    "15*x2 + 19*x3 + 7*x4 <= 156",
    "15*x2 + 19*x3 + 4*x5 <= 380",
    "16*x0 + 4*x5 + x6 <= 333",
    "16*x0 + 3*x1 + 15*x2 + 19*x3 + 7*x4 + 4*x5 + x6 <= 333",
    "4*x5 + x6 <= 304",
    "3*x4 + 6*x6 <= 64",
    "5*x0 + 6*x6 <= 103",
    "5*x0 + 3*x1 + 12*x2 + 14*x3 + 3*x4 + 19*x5 + 6*x6 <= 103",
    "-10*x1 + 9*x4 >= 0",
    "16*x0 + 3*x1 + 15*x2 + 19*x3 + 7*x4 + 4*x5 + 1*x6 <= 412",
    "5*x0 + 3*x1 + 12*x2 + 14*x3 + 3*x4 + 19*x5 + 6*x6 <= 431"
  ]
}
```

```python
import gurobipy as gp

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

# Create variables
steaks = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="steaks")
cantaloupes = m.addVar(lb=0, vtype=gp.GRB.INTEGER, name="cantaloupes")
lemons = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="lemons")
potatoes = m.addVar(lb=0, vtype=gp.GRB.INTEGER, name="potatoes")
oranges = m.addVar(lb=0, vtype=gp.GRB.INTEGER, name="oranges")
pizza = m.addVar(lb=0, vtype=gp.GRB.INTEGER, name="pizza")
cornichons = m.addVar(lb=0, vtype=gp.GRB.INTEGER, name="cornichons")


# Set objective function
m.setObjective(6*steaks + 4*cantaloupes + 1*lemons + 4*potatoes + 2*oranges + 5*pizza + 8*cornichons, gp.GRB.MAXIMIZE)

# Add constraints

umami_index = {
    'steaks': 16, 'cantaloupes': 3, 'lemons': 15, 'potatoes': 19, 'oranges': 7, 'pizza': 4, 'cornichons': 1
}
cost = {
    'steaks': 5, 'cantaloupes': 3, 'lemons': 12, 'potatoes': 14, 'oranges': 3, 'pizza': 19, 'cornichons': 6
}

m.addConstr(umami_index['steaks'] * steaks + umami_index['cantaloupes'] * cantaloupes >= 23)
m.addConstr(umami_index['steaks'] * steaks + umami_index['oranges'] * oranges >= 56)
# ... (add all other umami and cost constraints similarly using the dictionaries)

m.addConstr(umami_index['pizza'] * pizza + umami_index['cornichons'] * cornichons >= 49)
m.addConstr(cost['steaks'] * steaks + cost['pizza'] * pizza >= 31)
# ... (add all other constraints)

m.addConstr(sum(umami_index[food] * vars()[food] for food in umami_index) <= 412)
m.addConstr(sum(cost[food] * vars()[food] for food in cost) <= 431)


# 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('Optimization problem is infeasible.')
else:
    print('Optimization ended with status %d' % m.status)

```