## Problem Description and Symbolic Representation

The company wants to maximize earnings by washing cars and buses. The problem can be broken down into:

- **Variables:**
  - $x_1$ : Number of cars to be washed
  - $x_2$ : Number of buses to be washed

- **Objective Function:**
  The company earns $50 per car and $75 per bus. Therefore, the objective function to maximize earnings is:
  $50x_1 + 75x_2$

- **Constraints:**
  - Watering time: $30x_1 + 50x_2 \leq 5000$ (in minutes)
  - Soap cost: $10x_1 + 20x_2 \leq 1500$ (in dollars)
  - Non-negativity: $x_1 \geq 0, x_2 \geq 0$ (number of cars and buses cannot be negative)

## Symbolic Representation in JSON Format

```json
{
  'sym_variables': [('x1', 'cars'), ('x2', 'buses')],
  'objective_function': '50*x1 + 75*x2',
  'constraints': [
    '30*x1 + 50*x2 <= 5000',
    '10*x1 + 20*x2 <= 1500',
    'x1 >= 0',
    'x2 >= 0'
  ]
}
```

## Gurobi Code in Python

```python
import gurobi

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

    # Define variables
    x1 = model.addVar(name="cars", lb=0, ub=None)  # Number of cars
    x2 = model.addVar(name="buses", lb=0, ub=None)  # Number of buses

    # Objective function: Maximize earnings
    model.setObjective(50*x1 + 75*x2, gurobi.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(30*x1 + 50*x2 <= 5000, name="watering_time")  # Watering time constraint
    model.addConstr(10*x1 + 20*x2 <= 1500, name="soap_cost")  # Soap cost constraint

    # Optimize
    model.optimize()

    # Print solution
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal solution: cars = {x1.varValue}, buses = {x2.varValue}")
        print(f"Maximum earnings: ${50*x1.varValue + 75*x2.varValue:.2f}")
    else:
        print("No optimal solution found.")

solve_optimization_problem()
```