## Problem Description and Formulation

The problem requires determining the number of premium and regular seats to sell on a tour bus to maximize profit. The bus has 100 seats in total. The profit on each premium seat is $40, and on each regular seat is $20. At least 10 seats must be reserved as premium seats. Additionally, at least 5 times as many people prefer regular seats to premium seats.

## Symbolic Representation

Let's denote:
- \(P\) as the number of premium seats to sell,
- \(R\) as the number of regular seats to sell.

The objective is to maximize profit: \(40P + 20R\).

Subject to the constraints:
1. \(P + R \leq 100\) (total seats constraint),
2. \(P \geq 10\) (minimum premium seats constraint),
3. \(R \geq 5P\) (preference for regular seats over premium seats),
4. \(P \geq 0\) and \(R \geq 0\) (non-negativity constraints, as the number of seats cannot be negative).

## Gurobi Code

```python
import gurobipy as gp

# Create a new model
m = gp.Model("Tour_Bus_Problem")

# Define variables
P = m.addVar(name="Premium_Seats", lb=0, ub=100, vtype=gp.GRB.INTEGER)
R = m.addVar(name="Regular_Seats", lb=0, ub=100, vtype=gp.GRB.INTEGER)

# Objective function: maximize profit
m.setObjective(40 * P + 20 * R, gp.GRB.MAXIMIZE)

# Constraints
m.addConstr(P + R <= 100, name="Total_Seats")
m.addConstr(P >= 10, name="Min_Premium_Seats")
m.addConstr(R >= 5 * P, name="Preference_Regular")

# Optimize the model
m.optimize()

# Print the results
if m.status == gp.GRB.OPTIMAL:
    print(f"Optimal Solution: Premium Seats = {P.varValue}, Regular Seats = {R.varValue}")
    print(f"Max Profit: ${40 * P.varValue + 20 * R.varValue}")
else:
    print("The model is infeasible")
```