## Problem Description and Formulation

The problem is a classic example of a linear programming problem. The restaurant needs to decide how many servings of chicken curry and goat curry to make in order to maximize profit, given the available resources (tomatoes, curry paste, and water).

Let's define the decision variables:

* $x$: number of servings of chicken curry
* $y$: number of servings of goat curry

The objective function is to maximize profit:

* Profit per serving of chicken curry: $5
* Profit per serving of goat curry: $7
* Total profit: $5x + 7y$

The constraints are:

* Tomatoes: $1x + 2y \leq 20$
* Curry paste: $2x + 3y \leq 30$
* Water: $3x + 1y \leq 25$
* Non-negativity: $x \geq 0, y \geq 0$

## Gurobi Code

```python
import gurobipy as gp

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

# Define the decision variables
x = m.addVar(name="chicken_curry", lb=0, ub=None, obj=5)
y = m.addVar(name="goat_curry", lb=0, ub=None, obj=7)

# Define the constraints
m.addConstr(x + 2*y <= 20, name="tomatoes")
m.addConstr(2*x + 3*y <= 30, name="curry_paste")
m.addConstr(3*x + y <= 25, name="water")

# Solve the model
m.optimize()

# Print the results
if m.status == gp.GUROBI_OPTIMAL:
    print("Optimal solution found.")
    print(f"Chicken curry: {x.varValue}")
    print(f"Goat curry: {y.varValue}")
    print(f"Max profit: {m.objVal}")
else:
    print("No optimal solution found.")
```

This code defines the decision variables, objective function, and constraints, and then solves the model using Gurobi. The results are printed out, including the optimal values of the decision variables and the maximum profit. If no optimal solution is found, a message indicating this is printed out.