## Problem Description and Formulation

The problem is a linear programming optimization problem. The goal is to maximize the profit of an ice cream truck by determining the optimal number of strawberry and mint ice cream cakes to produce, given certain constraints.

### Decision Variables

- $x_1$: The number of strawberry ice cream cakes to make.
- $x_2$: The number of mint ice cream cakes to make.

### Objective Function

The profit per strawberry ice cream cake is $2.5, and the profit per mint ice cream cake is $4. The objective function to maximize the total profit $P$ is:

\[ P = 2.5x_1 + 4x_2 \]

### Constraints

1. The ice cream truck must make at least 10 cakes of strawberry ice cream: $x_1 \geq 10$.
2. The ice cream truck cannot make more than 20 cakes of strawberry ice cream: $x_1 \leq 20$.
3. The ice cream truck must make at least 20 cakes of mint ice cream: $x_2 \geq 20$.
4. The ice cream truck cannot make more than 40 cakes of mint ice cream: $x_2 \leq 40$.
5. In total, the ice cream truck can make at most 50 total cakes: $x_1 + x_2 \leq 50$.

## Gurobi Code

```python
import gurobi

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

    # Define the decision variables
    x1 = model.addVar(lb=10, ub=20, name="strawberry_cakes")
    x2 = model.addVar(lb=20, ub=40, name="mint_cakes")

    # Objective function: Maximize profit
    model.setObjective(2.5 * x1 + 4 * x2, gurobi.GRB.MAXIMIZE)

    # Constraint: Total cakes cannot exceed 50
    model.addConstr(x1 + x2 <= 50, name="total_cakes")

    # Solve the model
    model.optimize()

    # Check if the model is optimized
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal solution found. Profit: {model.objVal}")
        print(f"Strawberry cakes: {x1.x}, Mint cakes: {x2.x}")
    else:
        print("No optimal solution found.")

# Run the function
solve_ice_cream_problem()
```