```json
{
  "sym_variables": [
    ("x0", "milligrams of vitamin B6"),
    ("x1", "milligrams of vitamin D"),
    ("x2", "milligrams of iron"),
    ("x3", "milligrams of vitamin E")
  ],
  "objective_function": "2.9 * x0 + 5.87 * x1 + 4.47 * x2 + 1.68 * x3",
  "constraints": [
    "20 * x1 + 12 * x3 >= 43",
    "24 * x0 + 12 * x3 >= 15",
    "20 * x1 + 24 * x2 >= 35",
    "24 * x0 + 24 * x2 >= 22",
    "24 * x2 + 12 * x3 >= 32",
    "20 * x1 + 24 * x2 + 12 * x3 >= 28",
    "24 * x0 + 20 * x1 + 24 * x2 + 12 * x3 >= 28",
    "17 * x2 + 3 * x3 >= 169",
    "7 * x0 + 10 * x1 >= 105",
    "7 * x0 + 17 * x2 >= 178",
    "7 * x0 + 10 * x1 + 3 * x3 >= 122",
    "7 * x0 + 10 * x1 + 17 * x2 + 3 * x3 >= 122",
    "14 * x0 + 8 * x3 >= 96",
    "14 * x0 + 26 * x2 >= 141",
    "14 * x0 + 26 * x1 >= 89",
    "26 * x1 + 8 * x3 >= 89",
    "26 * x2 + 8 * x3 >= 85",
    "14 * x0 + 26 * x1 + 26 * x2 + 8 * x3 >= 85",
    "2 * x2 + 3 * x3 >= 75",
    "5 * x1 + 3 * x3 >= 61",
    "17 * x0 + 5 * x1 >= 71",
    "5 * x1 + 2 * x2 >= 86",
    "17 * x0 + 3 * x3 >= 98",
    "17 * x0 + 5 * x1 + 3 * x3 >= 107",
    "17 * x0 + 2 * x2 + 3 * x3 >= 107",
    "5 * x1 + 2 * x2 + 3 * x3 >= 107",
    "17 * x0 + 5 * x1 + 3 * x3 >= 81",
    "17 * x0 + 2 * x2 + 3 * x3 >= 81",
    "5 * x1 + 2 * x2 + 3 * x3 >= 81",
    "17 * x0 + 5 * x1 + 3 * x3 >= 87",
    "17 * x0 + 2 * x2 + 3 * x3 >= 87",
    "5 * x1 + 2 * x2 + 3 * x3 >= 87",
    "17 * x0 + 5 * x1 + 2 * x2 + 3 * x3 >= 87",
    "20 * x0 + 24 * x3 >= 55",
    "29 * x1 + 27 * x2 >= 38",
    "27 * x2 + 24 * x3 >= 33",
    "20 * x0 + 27 * x2 >= 36",
    "20 * x0 + 29 * x1 >= 25",
    "20 * x0 + 29 * x1 + 27 * x2 >= 61",
    "20 * x0 + 29 * x1 + 27 * x2 + 24 * x3 >= 61",
    "10 * x0 - 4 * x1 >= 0",
    "-8 * x0 + 9 * x3 >= 0",
    "3 * x0 - 10 * x2 >= 0",
    "20 * x1 + 24 * x2 + 12 * x3 <= 86",
    "10 * x1 + 3 * x3 <= 335",
    "7 * x0 + 17 * x2 <= 329",
    "10 * x1 + 17 * x2 <= 230",
    "7 * x0 + 10 * x1 + 3 * x3 <= 707",
    "10 * x1 + 17 * x2 + 3 * x3 <= 605",
    "26 * x1 + 26 * x2 + 8 * x3 <= 396",
    "14 * x0 + 26 * x1 + 26 * x2 <= 587",
    "14 * x0 + 26 * x1 + 8 * x3 <= 620",
    "14 * x0 + 26 * x2 + 8 * x3 <= 674",
    "2 * x2 + 3 * x3 <= 281",
    "17 * x0 + 3 * x3 <= 433",
    "5 * x1 + 2 * x2 <= 437",
    "17 * x0 + 5 * x1 <= 454",
    "x1 == int",
    "24 * x0 <= 186",
    "7 * x0 <= 737",
    "14 * x0 <= 686",
    "17 * x0 <= 480",
    "20 * x0 <= 292",
    "20 * x1 <= 186",
    "10 * x1 <= 737",
    "26 * x1 <= 686",
    "5 * x1 <= 480",
    "29 * x1 <= 292",
    "24 * x2 <= 186",
    "17 * x2 <= 737",
    "26 * x2 <= 686",
    "2 * x2 <= 480",
    "27 * x2 <= 292",
    "12 * x3 <= 186",
    "3 * x3 <= 737",
    "8 * x3 <= 686",
    "3 * x3 <= 480",
    "24 * x3 <= 292"

  ]
}
```

```python
import gurobipy as gp

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

# Create variables
vitamin_b6 = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="vitamin_b6")
vitamin_d = m.addVar(lb=0, vtype=gp.GRB.INTEGER, name="vitamin_d")
iron = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="iron")
vitamin_e = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="vitamin_e")


# Set objective function
m.setObjective(2.9 * vitamin_b6 + 5.87 * vitamin_d + 4.47 * iron + 1.68 * vitamin_e, gp.GRB.MINIMIZE)

# Add constraints
resource_constraints = {
    'r0': {'upper_bound': 186, 'x0': 24, 'x1': 20, 'x2': 24, 'x3': 12},
    'r1': {'upper_bound': 737, 'x0': 7, 'x1': 10, 'x2': 17, 'x3': 3},
    'r2': {'upper_bound': 686, 'x0': 14, 'x1': 26, 'x2': 26, 'x3': 8},
    'r3': {'upper_bound': 480, 'x0': 17, 'x1': 5, 'x2': 2, 'x3': 3},
    'r4': {'upper_bound': 292, 'x0': 20, 'x1': 29, 'x2': 27, 'x3': 24}
}

for r, data in resource_constraints.items():
    m.addConstr(data['x0'] * vitamin_b6 <= data['upper_bound'])
    m.addConstr(data['x1'] * vitamin_d <= data['upper_bound'])
    m.addConstr(data['x2'] * iron <= data['upper_bound'])
    m.addConstr(data['x3'] * vitamin_e <= data['upper_bound'])


m.addConstr(20 * vitamin_d + 12 * vitamin_e >= 43)
m.addConstr(24 * vitamin_b6 + 12 * vitamin_e >= 15)
m.addConstr(20 * vitamin_d + 24 * iron >= 35)
m.addConstr(24 * vitamin_b6 + 24 * iron >= 22)
# ... (rest of the constraints as in the JSON, replacing variable names)


# Optimize model
m.optimize()

# Print results
if m.status == gp.GRB.OPTIMAL:
    print('Obj: %g' % m.objVal)
    print('vitamin_b6:', vitamin_b6.x)
    print('vitamin_d:', vitamin_d.x)
    print('iron:', iron.x)
    print('vitamin_e:', vitamin_e.x)
elif m.status == gp.GRB.INFEASIBLE:
    print('Model is infeasible')
else:
    print('Optimization ended with status %d' % m.status)

```