To solve the optimization problem described, we need to define the decision variables and the constraints based on the given information. Let's denote:

- $x$ as the number of business class tickets sold,
- $y$ as the number of coach class tickets sold.

The objective function aims to maximize profit, which is calculated as $300x + 150y$, since each business class ticket yields a $300 profit and each coach class ticket yields a $150 profit.

The constraints are:

1. The total number of passengers cannot exceed 600: $x + y \leq 600$.
2. At least 45 seats are reserved for business class passengers: $x \geq 45$.
3. More than 4 times as many passengers prefer to travel by coach seating than by business class: $y > 4x$. However, since we're dealing with linear programming and need to ensure the problem can be solved efficiently, we'll adjust this constraint to $y \geq 4x + 1$ to maintain the "more than" relationship while making it suitable for linear programming formulation.

Now, let's formulate the Gurobi code in Python:

```python
from gurobipy import *

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

# Define decision variables
x = m.addVar(lb=45, vtype=GRB.INTEGER, name="business_class_tickets")
y = m.addVar(vtype=GRB.INTEGER, name="coach_class_tickets")

# Define the objective function: Maximize profit
m.setObjective(300*x + 150*y, GRB.MAXIMIZE)

# Add constraints
m.addConstr(x + y <= 600, "total_passengers")
m.addConstr(y >= 4*x + 1, "coach_vs_business_ratio")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print(f"Business class tickets to sell: {x.x}")
    print(f"Coach class tickets to sell: {y.x}")
    print(f"Maximum profit: ${m.objVal}")
else:
    print("The model is infeasible.")
```