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

- \(x_p\) as the number of premium seats sold.
- \(x_r\) as the number of regular seats sold.

The profit made from selling each type of seat is given as $40 for premium seats and $20 for regular seats. The total profit (\(P\)) can be represented by the equation:

\[ P = 40x_p + 20x_r \]

We are also given several constraints:
1. The bus has a total of 100 seats, so \(x_p + x_r \leq 100\).
2. At least 10 seats must be premium, so \(x_p \geq 10\).
3. At least 5 times as many people prefer regular seats to premium seats, which can be represented as \(x_r \geq 5x_p\).

To maximize profit under these conditions, we'll use the Gurobi solver in Python.

```python
from gurobipy import *

# Create a model
m = Model("Tour_Bus_Profit")

# Define decision variables
x_p = m.addVar(vtype=GRB.CONTINUOUS, name="premium_seats")
x_r = m.addVar(vtype=GRB.CONTINUOUS, name="regular_seats")

# Objective function: Maximize profit
m.setObjective(40*x_p + 20*x_r, GRB.MAXIMIZE)

# Constraints
m.addConstr(x_p + x_r <= 100, "total_seats")
m.addConstr(x_p >= 10, "min_premium_seats")
m.addConstr(x_r >= 5*x_p, "regular_to_premium_ratio")

# Solve the model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution found: Sell {x_p.x} premium seats and {x_r.x} regular seats.")
else:
    print("No optimal solution found.")

```