To solve this optimization problem, we need to define the variables and constraints involved. Let's denote the number of heated seats as `H` and the number of regular seats as `R`.

1. **Objective Function**: The goal is to maximize profit. Given that a profit of $30 is made on each heated seat and a profit of $20 is made on each regular seat, the objective function can be written as: Maximize `30H + 20R`.

2. **Constraints**:
   - **Capacity Constraint**: The total number of seats (heated and regular) cannot exceed 300. This gives us the constraint: `H + R <= 300`.
   - **Minimum Heated Seats Constraint**: At least 50 seats must be heated, which translates to: `H >= 50`.
   - **Preference Constraint**: At least 3 times as many people prefer to sit in regular seats compared to heated seats. This can be represented as: `R >= 3H`.

Given these constraints and the objective function, we aim to find the values of `H` and `R` that maximize profit while satisfying all conditions.

Here is how you could implement this problem using Gurobi in Python:

```python
from gurobipy import *

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

# Define variables
H = m.addVar(vtype=GRB.CONTINUOUS, name="Heated_Seats", lb=0)
R = m.addVar(vtype=GRB.CONTINUOUS, name="Regular_Seats", lb=0)

# Objective function: Maximize profit
m.setObjective(30*H + 20*R, GRB.MAXIMIZE)

# Constraints
m.addConstr(H + R <= 300, "Capacity")
m.addConstr(H >= 50, "Min_Heated_Seats")
m.addConstr(R >= 3*H, "Preference")

# Optimize model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Heated Seats: {H.x}")
    print(f"Regular Seats: {R.x}")
    print(f"Maximum Profit: {m.objVal}")
else:
    print("No optimal solution found")
```