## Problem Description and Formulation

The problem is an optimization problem with the goal to maximize the objective function: \(8 \times \text{milkshakes} + 4 \times \text{cheeseburgers} + 4 \times \text{bananas}\), subject to various constraints on resources (fiber and cost).

## Resources and Attributes

- **Variables**: 
  - milkshakes
  - cheeseburgers
  - bananas

- **Resources/Attributes**:
  - \(r0\): grams of fiber
    - Upper bound: 45
    - Coefficients: \(x0 = 11\), \(x1 = 1\), \(x2 = 5\)
  - \(r1\): dollar cost
    - Upper bound: 84
    - Coefficients: \(x0 = 1\), \(x1 = 3\), \(x2 = 1\)

## Constraints

1. Minimum spend: \(1 \times \text{milkshakes} + 3 \times \text{cheeseburgers} + 1 \times \text{bananas} \geq 16\)
2. Fiber from milkshakes and bananas: \(11 \times \text{milkshakes} + 5 \times \text{bananas} \leq 31\)
3. Fiber from milkshakes and cheeseburgers: \(11 \times \text{milkshakes} + 1 \times \text{cheeseburgers} \leq 42\)
4. Fiber from cheeseburgers and bananas: \(1 \times \text{cheeseburgers} + 5 \times \text{bananas} \leq 27\)
5. Total fiber: \(11 \times \text{milkshakes} + 1 \times \text{cheeseburgers} + 5 \times \text{bananas} \leq 27\)
6. Cost of milkshakes and cheeseburgers: \(1 \times \text{milkshakes} + 3 \times \text{cheeseburgers} \leq 69\)
7. Total cost: \(1 \times \text{milkshakes} + 3 \times \text{cheeseburgers} + 1 \times \text{bananas} \leq 69\)

## Gurobi Code

```python
import gurobi

def solve_optimization_problem():
    # Create a new model
    model = gurobi.Model()

    # Define variables
    milkshakes = model.addVar(lb=0, name="milkshakes", vtype=gurobi.GRB.CONTINUOUS)
    cheeseburgers = model.addVar(lb=0, name="cheeseburgers", vtype=gurobi.GRB.INTEGER)
    bananas = model.addVar(lb=0, name="bananas", vtype=gurobi.GRB.INTEGER)

    # Objective function
    model.setObjective(8 * milkshakes + 4 * cheeseburgers + 4 * bananas, gurobi.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(1 * milkshakes + 3 * cheeseburgers + 1 * bananas >= 16, name="min_spend")
    model.addConstr(11 * milkshakes + 5 * bananas <= 31, name="fiber_milkshakes_bananas")
    model.addConstr(11 * milkshakes + 1 * cheeseburgers <= 42, name="fiber_milkshakes_cheeseburgers")
    model.addConstr(1 * cheeseburgers + 5 * bananas <= 27, name="fiber_cheeseburgers_bananas")
    model.addConstr(11 * milkshakes + 1 * cheeseburgers + 5 * bananas <= 27, name="total_fiber")
    model.addConstr(1 * milkshakes + 3 * cheeseburgers <= 69, name="cost_milkshakes_cheeseburgers")
    model.addConstr(1 * milkshakes + 3 * cheeseburgers + 1 * bananas <= 69, name="total_cost")

    # Optimize
    model.optimize()

    # Print solution
    if model.status == gurobi.GRB.OPTIMAL:
        print("Optimal Solution:")
        print(f"Milkshakes: {milkshakes.varValue}")
        print(f"Cheeseburgers: {cheeseburgers.varValue}")
        print(f"Bananas: {bananas.varValue}")
        print(f"Objective: {model.objVal}")
    else:
        print("No optimal solution found.")

solve_optimization_problem()
```