## Problem Description and Formulation

The problem is a linear programming optimization problem. John wants to mix two brands of cereal, A and B, to meet his nutritional requirements while minimizing costs. The requirements are:

- At least 400 units of iron
- At least 450 units of fiber

The nutritional content of each cereal brand per serving is:

- Cereal A: 25 units of iron, 30 units of fiber, and costs $0.45 per serving
- Cereal B: 20 units of iron, 40 units of fiber, and costs $0.55 per serving

Let's denote:
- \(x\) as the number of servings of cereal A
- \(y\) as the number of servings of cereal B

The objective is to minimize the total cost \(C = 0.45x + 0.55y\).

The constraints based on the nutritional requirements are:

1. \(25x + 20y \geq 400\) (for iron)
2. \(30x + 40y \geq 450\) (for fiber)
3. \(x \geq 0, y \geq 0\) (non-negativity constraints, as servings cannot be negative)

## Gurobi Code

To solve this problem using Gurobi in Python, we can use the following code:

```python
import gurobi as gp

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

# Define variables
x = m.addVar(name="cereal_A", lb=0)  # Servings of cereal A
y = m.addVar(name="cereal_B", lb=0)  # Servings of cereal B

# Objective: Minimize cost
m.setObjective(0.45 * x + 0.55 * y, gp.GRB.MINIMIZE)

# Constraints
m.addConstr(25 * x + 20 * y >= 400, name="iron_requirement")
m.addConstr(30 * x + 40 * y >= 450, name="fiber_requirement")

# Optimize
m.optimize()

# Print solution
if m.status == gp.GRB.OPTIMAL:
    print(f"Optimal servings of cereal A: {x.varValue}")
    print(f"Optimal servings of cereal B: {y.varValue}")
    print(f"Minimum cost: ${m.objVal:.2f}")
else:
    print("The problem is infeasible.")
```