To solve the given optimization problem, we first need to convert the natural language description into a symbolic representation. This involves defining variables and translating the objective function and constraints into algebraic terms.

Let's define:
- $x_1$ as the number of premium seats.
- $x_2$ as the number of regular seats.

The objective function aims to maximize profit, which is given by $150x_1 + 50x_2$, since each premium seat makes a profit of $150 and each regular seat makes a profit of $50.

The constraints are:
1. The total number of seats is 300: $x_1 + x_2 \leq 300$.
2. At least 50 seats will be assigned as premium seats: $x_1 \geq 50$.
3. At least 3 times as many people prefer the regular seats to the premium seats, which can be interpreted as $x_2 \geq 3x_1$.

However, the constraint $x_2 \geq 3x_1$ might not be correctly interpreted from the problem statement, as it implies that for every premium seat, there must be at least three regular seats preferred, which seems to misunderstand the preference relation. A more accurate interpretation of "at least 3 times as many people prefer the regular seats" in terms of seating allocation could be considered as $x_2 \geq 3x_1$, but this needs clarification. For the purpose of solving with the provided information, we will proceed with this understanding.

Given these definitions and constraints, the symbolic representation of the problem is:
```json
{
    'sym_variables': [('x1', 'number of premium seats'), ('x2', 'number of regular seats')],
    'objective_function': '150*x1 + 50*x2',
    'constraints': ['x1 + x2 <= 300', 'x1 >= 50', 'x2 >= 3*x1']
}
```

To solve this linear programming problem using Gurobi in Python, we will write the following code:

```python
from gurobipy import *

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

# Define variables
x1 = m.addVar(vtype=GRB.INTEGER, name="premium_seats")
x2 = m.addVar(vtype=GRB.INTEGER, name="regular_seats")

# Set the objective function
m.setObjective(150*x1 + 50*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(x1 + x2 <= 300, "total_seats")
m.addConstr(x1 >= 50, "premium_min")
m.addConstr(x2 >= 3*x1, "regular_preferred")

# Optimize the model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Premium seats: {x1.x}")
    print(f"Regular seats: {x2.x}")
    print(f"Maximum profit: {m.objVal}")
else:
    print("No optimal solution found")
```