To solve this optimization problem, we need to define the decision variables, the objective function, and the constraints. Let's denote:

- $x$ as the number of bottom deck seats.
- $y$ as the number of top deck seats.

The profit made from each bottom deck seat is $25, and from each top deck seat is $35. The total profit can be represented by the objective function: $25x + 35y$.

There are several constraints:

1. **Total Capacity Constraint**: The bus can carry at most 50 passengers. Therefore, $x + y \leq 50$.
2. **Minimum Bottom Deck Seats Constraint**: At least 10 seats must be reserved as bottom deck seats. So, $x \geq 10$.
3. **Preference Constraint**: A minimum of 2 times as many passengers prefer to travel on top deck seats than on bottom deck seats. This gives us $y \geq 2x$.

To maximize profit, we want to solve the following linear programming problem:

Maximize: $25x + 35y$

Subject to:
- $x + y \leq 50$
- $x \geq 10$
- $y \geq 2x$
- $x, y \geq 0$ (since negative seats do not make sense)

Now, let's translate this problem into Gurobi code in Python:

```python
from gurobipy import *

# Create a new model
m = Model("Bus_Seat_Optimization")

# Define the decision variables
x = m.addVar(lb=0, vtype=GRB.INTEGER, name="bottom_deck_seats")
y = m.addVar(lb=0, vtype=GRB.INTEGER, name="top_deck_seats")

# Set the objective function
m.setObjective(25*x + 35*y, GRB.MAXIMIZE)

# Add constraints
m.addConstr(x + y <= 50, "total_capacity")
m.addConstr(x >= 10, "min_bottom_deck")
m.addConstr(y >= 2*x, "passenger_preference")

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Bottom deck seats: {x.x}")
    print(f"Top deck seats: {y.x}")
    print(f"Maximum profit: ${25*x.x + 35*y.x}")
else:
    print("No optimal solution found")
```