## Problem Description and Symbolic Representation

The problem requires maximizing profit by determining the number of bottom deck seats and top deck seats to allocate on a double-decker bus. The bus can carry at most 50 passengers, with a profit of $25 per bottom deck seat and $35 per top deck seat. There must be at least 10 bottom deck seats, and at least twice as many passengers must be on the top deck as on the bottom deck.

### Symbolic Representation

Let's define the symbolic variables:
- $x_1$ = number of bottom deck seats
- $x_2$ = number of top deck seats

The objective function to maximize profit is: $25x_1 + 35x_2$

The constraints are:
1. Total seats constraint: $x_1 + x_2 \leq 50$
2. Minimum bottom deck seats constraint: $x_1 \geq 10$
3. Top deck vs bottom deck preference constraint: $x_2 \geq 2x_1$
4. Non-negativity constraints: $x_1 \geq 0, x_2 \geq 0$

Since $x_1$ and $x_2$ represent the number of seats, they must be integers.

## Symbolic Representation in JSON Format

```json
{
    'sym_variables': [('x1', 'bottom deck seats'), ('x2', 'top deck seats')],
    'objective_function': '25*x1 + 35*x2',
    'constraints': [
        'x1 + x2 <= 50',
        'x1 >= 10',
        'x2 >= 2*x1',
        'x1 >= 0',
        'x2 >= 0'
    ]
}
```

## Gurobi Code in Python

```python
import gurobi

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

    # Define the variables
    x1 = model.addVar(name="bottom_deck_seats", lb=0, ub=None, vtype=gurobi.GRB.INTEGER)
    x2 = model.addVar(name="top_deck_seats", lb=0, ub=None, vtype=gurobi.GRB.INTEGER)

    # Objective function: maximize 25*x1 + 35*x2
    model.setObjective(25*x1 + 35*x2, gurobi.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(x1 + x2 <= 50, name="total_seats")
    model.addConstr(x1 >= 10, name="min_bottom_deck_seats")
    model.addConstr(x2 >= 2*x1, name="top_vs_bottom_deck")

    # Solve the model
    model.optimize()

    # Print the solution
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal solution: bottom deck seats = {x1.varValue}, top deck seats = {x2.varValue}")
    else:
        print("No optimal solution found")

solve_bus_seating_problem()
```