## Problem Description and Formulation

The problem is a classic example of a linear programming problem. The goal is to maximize the profit of a collector's shop that sells oval and rectangular rocks, given the constraints on washing and polishing times.

Let's define the decision variables:

* $x$: number of oval rocks
* $y$: number of rectangular rocks

The objective function to maximize is the total profit:

* $7x + 9y$

The constraints are:

* Washing time: $10x + 15y \leq 2000$
* Polishing time: $12x + 12y \leq 2500$
* Non-negativity: $x \geq 0, y \geq 0$

## Gurobi Code

```python
import gurobi

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

    # Define the decision variables
    x = model.addVar(lb=0, name="oval_rocks")
    y = model.addVar(lb=0, name="rectangular_rocks")

    # Define the objective function
    model.setObjective(7 * x + 9 * y, gurobi.GRB.MAXIMIZE)

    # Define the constraints
    model.addConstr(10 * x + 15 * y <= 2000, name="washing_time")
    model.addConstr(12 * x + 12 * y <= 2500, name="polishing_time")

    # Optimize the model
    model.optimize()

    # Print the solution
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal solution: x = {x.varValue}, y = {y.varValue}")
        print(f"Maximum profit: ${7 * x.varValue + 9 * y.varValue:.2f}")
    else:
        print("No optimal solution found")

if __name__ == "__main__":
    solve_problem()
```

This code defines a Gurobi model, adds the decision variables and constraints, sets the objective function, and optimizes the model. The solution is then printed to the console. If no optimal solution is found, a message indicating this is printed instead.