```json
{
  "sym_variables": [
    ("x0", "roses"),
    ("x1", "chili plants"),
    ("x2", "chrysanthemums"),
    ("x3", "pansies"),
    ("x4", "tomato vines")
  ],
  "objective_function": "6.17 * x0 + 2.7 * x1 + 5.24 * x2 + 9.67 * x3 + 1.02 * x4",
  "constraints": [
    "14 * x0 + 2 * x3 >= 22",
    "17 * x1 + 2 * x3 >= 21",
    "14 * x0 + 11 * x4 >= 26",
    "14 * x0 + 17 * x1 >= 12",
    "14 * x0 + 13 * x2 >= 13",
    "14 * x0 + 17 * x1 + 13 * x2 + 2 * x3 + 11 * x4 >= 13",
    "11 * x1 + 4 * x4 >= 41",
    "2 * x0 + 7 * x3 >= 39",
    "2 * x0 + 11 * x1 >= 23",
    "11 * x1 + 17 * x2 >= 39",
    "11 * x1 + 7 * x3 >= 49",
    "2 * x0 + 4 * x4 >= 33",
    "17 * x2 + 7 * x3 >= 20",
    "7 * x3 + 4 * x4 >= 38",
    "11 * x1 + 17 * x2 + 7 * x3 >= 38",
    "11 * x1 + 17 * x2 + 4 * x4 >= 38",
    "2 * x0 + 11 * x1 + 17 * x2 >= 38",
    "17 * x2 + 7 * x3 + 4 * x4 >= 38",
    "2 * x0 + 17 * x2 + 4 * x4 >= 38",
    "2 * x0 + 17 * x2 + 7 * x3 >= 38",
    "2 * x0 + 11 * x1 + 4 * x4 >= 38",
    "11 * x1 + 17 * x2 + 7 * x3 >= 45",
    "11 * x1 + 17 * x2 + 4 * x4 >= 45",
    "2 * x0 + 11 * x1 + 17 * x2 >= 45",
    "17 * x2 + 7 * x3 + 4 * x4 >= 45",
    "2 * x0 + 17 * x2 + 4 * x4 >= 45",
    "2 * x0 + 17 * x2 + 7 * x3 >= 45",
    "2 * x0 + 11 * x1 + 4 * x4 >= 45",
    "11 * x1 + 17 * x2 + 7 * x3 >= 41",
    "11 * x1 + 17 * x2 + 4 * x4 >= 41",
    "2 * x0 + 11 * x1 + 17 * x2 >= 41",
    "17 * x2 + 7 * x3 + 4 * x4 >= 41",
    "2 * x0 + 17 * x2 + 4 * x4 >= 41",
    "2 * x0 + 17 * x2 + 7 * x3 >= 41",
    "2 * x0 + 11 * x1 + 4 * x4 >= 41",

    "11 * x1 + 17 * x2 + 7 * x3 >= 31",
    "11 * x1 + 17 * x2 + 4 * x4 >= 31",
    "2 * x0 + 11 * x1 + 17 * x2 >= 31",
    "17 * x2 + 7 * x3 + 4 * x4 >= 31",
    "2 * x0 + 17 * x2 + 4 * x4 >= 31",
    "2 * x0 + 17 * x2 + 7 * x3 >= 31",
    "2 * x0 + 11 * x1 + 4 * x4 >= 31",
    "11 * x1 + 17 * x2 + 7 * x3 >= 50",
    "11 * x1 + 17 * x2 + 4 * x4 >= 50",
    "2 * x0 + 11 * x1 + 17 * x2 >= 50",
    "17 * x2 + 7 * x3 + 4 * x4 >= 50",
    "2 * x0 + 17 * x2 + 4 * x4 >= 50",
    "2 * x0 + 17 * x2 + 7 * x3 >= 50",
    "2 * x0 + 11 * x1 + 4 * x4 >= 50",
    "11 * x1 + 17 * x2 + 7 * x3 >= 36",
    "11 * x1 + 17 * x2 + 4 * x4 >= 36",
    "2 * x0 + 11 * x1 + 17 * x2 >= 36",
    "17 * x2 + 7 * x3 + 4 * x4 >= 36",
    "2 * x0 + 17 * x2 + 4 * x4 >= 36",
    "2 * x0 + 17 * x2 + 7 * x3 >= 36",
    "2 * x0 + 11 * x1 + 4 * x4 >= 36",
    "2 * x0 + 11 * x1 + 17 * x2 + 7 * x3 + 4 * x4 >= 36",
    "8 * x1 - 3 * x3 >= 0",
    "10 * x2 - 9 * x3 >= 0",
    "13 * x2 + 2 * x3 <= 65",
    "13 * x2 + 11 * x4 <= 89",
    "17 * x1 + 13 * x2 <= 41",
    "17 * x1 + 2 * x3 <= 35",
    "14 * x0 + 17 * x1 <= 97",
    "17 * x1 + 11 * x4 <= 32",
    "2 * x0 + 11 * x1 + 17 * x2 <= 51"

    
  ]
}
```

```python
import gurobipy as gp

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

# Create variables
roses = m.addVar(vtype=gp.GRB.INTEGER, name="roses")
chili_plants = m.addVar(vtype=gp.GRB.INTEGER, name="chili_plants")
chrysanthemums = m.addVar(vtype=gp.GRB.INTEGER, name="chrysanthemums")
pansies = m.addVar(vtype=gp.GRB.INTEGER, name="pansies")
tomato_vines = m.addVar(vtype=gp.GRB.INTEGER, name="tomato_vines")


# Set objective function
m.setObjective(6.17 * roses + 2.7 * chili_plants + 5.24 * chrysanthemums + 9.67 * pansies + 1.02 * tomato_vines, gp.GRB.MINIMIZE)

# Add constraints
m.addConstr(14 * roses + 2 * pansies >= 22)
m.addConstr(17 * chili_plants + 2 * pansies >= 21)
m.addConstr(14 * roses + 11 * tomato_vines >= 26)
m.addConstr(14 * roses + 17 * chili_plants >= 12)
m.addConstr(14 * roses + 13 * chrysanthemums >= 13)
m.addConstr(14 * roses + 17 * chili_plants + 13 * chrysanthemums + 2 * pansies + 11 * tomato_vines >= 13)
m.addConstr(11 * chili_plants + 4 * tomato_vines >= 41)
m.addConstr(2 * roses + 7 * pansies >= 39)
m.addConstr(2 * roses + 11 * chili_plants >= 23)
m.addConstr(11 * chili_plants + 17 * chrysanthemums >= 39)
m.addConstr(11 * chili_plants + 7 * pansies >= 49)
m.addConstr(2 * roses + 4 * tomato_vines >= 33)
m.addConstr(17 * chrysanthemums + 7 * pansies >= 20)
m.addConstr(7 * pansies + 4 * tomato_vines >= 38)

# ... (add all remaining constraints similarly)


m.addConstr(8 * chili_plants - 3 * pansies >= 0)
m.addConstr(10 * chrysanthemums - 9 * pansies >= 0)
m.addConstr(13 * chrysanthemums + 2 * pansies <= 65)
m.addConstr(13 * chrysanthemums + 11 * tomato_vines <= 89)
m.addConstr(17 * chili_plants + 13 * chrysanthemums <= 41)
m.addConstr(17 * chili_plants + 2 * pansies <= 35)
m.addConstr(14 * roses + 17 * chili_plants <= 97)
m.addConstr(17 * chili_plants + 11 * tomato_vines <= 32)
m.addConstr(2 * roses + 11 * chili_plants + 17 * chrysanthemums <= 51)



# Optimize model
m.optimize()

# Print results
if m.status == gp.GRB.OPTIMAL:
    print('Objective Value:', m.objVal)
    for v in m.getVars():
        print(f'{v.varName}: {v.x}')
elif m.status == gp.GRB.INFEASIBLE:
    print("The model is infeasible.")
else:
    print(f"Optimization ended with status {m.status}")

```
