## Problem Description and Formulation

The problem is an optimization problem with a linear objective function and linear constraints. The goal is to minimize the objective function subject to the given constraints.

### Variables

* `chicken breasts` (continuous)
* `potatoes` (continuous)
* `cherry pies` (continuous)
* `bowls of cereal` (continuous)

### Objective Function

Minimize: $1.55 \times \text{chicken breasts} + 1.56 \times \text{potatoes} + 1.55 \times \text{cherry pies} + 2.54 \times \text{bowls of cereal}$

### Constraints

1. $\text{umami index from chicken breasts} = 7 \times \text{chicken breasts}$
2. $\text{umami index from potatoes} = 1 \times \text{potatoes}$
3. $\text{umami index from cherry pies} = 19 \times \text{cherry pies}$
4. $\text{umami index from bowls of cereal} = 7 \times \text{bowls of cereal}$
5. $7 \times \text{chicken breasts} + 19 \times \text{cherry pies} \geq 49$
6. $1 \times \text{potatoes} + 19 \times \text{cherry pies} \geq 51$
7. $1 \times \text{potatoes} + 7 \times \text{bowls of cereal} \geq 22$
8. $19 \times \text{cherry pies} + 7 \times \text{bowls of cereal} \geq 18$
9. $7 \times \text{chicken breasts} + 1 \times \text{potatoes} \geq 35$
10. $7 \times \text{chicken breasts} + 1 \times \text{potatoes} + 19 \times \text{cherry pies} \geq 31$
11. $7 \times \text{chicken breasts} + 1 \times \text{potatoes} + 19 \times \text{cherry pies} + 7 \times \text{bowls of cereal} \geq 31$
12. $7 \times \text{chicken breasts} - 9 \times \text{cherry pies} \geq 0$
13. $5 \times \text{potatoes} - 5 \times \text{bowls of cereal} \geq 0$
14. $7 \times \text{chicken breasts} + 1 \times \text{potatoes} \leq 135$
15. $1 \times \text{potatoes} + 7 \times \text{bowls of cereal} \leq 53$
16. $7 \times \text{chicken breasts} + 7 \times \text{bowls of cereal} \leq 174$
17. $1 \times \text{potatoes} + 19 \times \text{cherry pies} + 7 \times \text{bowls of cereal} \leq 147$

## Gurobi Code

```python
import gurobipy as gp

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

# Define variables
chicken_breasts = m.addVar(name="chicken_breasts", lb=0)
potatoes = m.addVar(name="potatoes", lb=0)
cherry_pies = m.addVar(name="cherry_pies", lb=0)
bowls_of_cereal = m.addVar(name="bowls_of_cereal", lb=0)

# Objective function
m.setObjective(1.55 * chicken_breasts + 1.56 * potatoes + 1.55 * cherry_pies + 2.54 * bowls_of_cereal, gp.GRB.MINIMIZE)

# Constraints
m.addConstr(7 * chicken_breasts + 19 * cherry_pies >= 49, name="umami_chicken_cherry")
m.addConstr(potatoes + 19 * cherry_pies >= 51, name="umami_potatoes_cherry")
m.addConstr(potatoes + 7 * bowls_of_cereal >= 22, name="umami_potatoes_cereal")
m.addConstr(19 * cherry_pies + 7 * bowls_of_cereal >= 18, name="umami_cherry_cereal")
m.addConstr(7 * chicken_breasts + potatoes >= 35, name="umami_chicken_potatoes")
m.addConstr(7 * chicken_breasts + potatoes + 19 * cherry_pies >= 31, name="umami_chicken_potatoes_cherry")
m.addConstr(7 * chicken_breasts + potatoes + 19 * cherry_pies + 7 * bowls_of_cereal >= 31, name="umami_all")
m.addConstr(7 * chicken_breasts - 9 * cherry_pies >= 0, name="chicken_cherry_ratio")
m.addConstr(5 * potatoes - 5 * bowls_of_cereal >= 0, name="potatoes_cereal_ratio")
m.addConstr(7 * chicken_breasts + potatoes <= 135, name="umami_chicken_potatoes_max")
m.addConstr(potatoes + 7 * bowls_of_cereal <= 53, name="umami_potatoes_cereal_max")
m.addConstr(7 * chicken_breasts + 7 * bowls_of_cereal <= 174, name="umami_chicken_cereal_max")
m.addConstr(potatoes + 19 * cherry_pies + 7 * bowls_of_cereal <= 147, name="umami_potatoes_cherry_cereal_max")

# Solve the model
m.optimize()

# Print the solution
if m.status == gp.GRB.OPTIMAL:
    print("Optimal solution found.")
    print(f"Chicken breasts: {chicken_breasts.varValue}")
    print(f"Potatoes: {potatoes.varValue}")
    print(f"Cherry pies: {cherry_pies.varValue}")
    print(f"Bowls of cereal: {bowls_of_cereal.varValue}")
    print(f"Objective function value: {m.objVal}")
else:
    print("No optimal solution found.")
```