## Symbolic Representation

To solve the given optimization problem, we first need to convert the natural language description into a symbolic representation.

Let's define the symbolic variables as follows:

- $x_1$ represents the number of premium tickets sold.
- $x_2$ represents the number of regular tickets sold.

The objective is to maximize profit. Given that a profit of $50 is made on each premium ticket and a profit of $30 is made on each regular ticket, the objective function can be represented as:

Maximize $50x_1 + 30x_2$

The constraints based on the problem description are:

1. The Ferris wheel can take at most 250 people: $x_1 + x_2 \leq 250$
2. There are a minimum of 50 premium tickets available: $x_1 \geq 50$
3. At least 3 times as many people prefer to buy regular tickets than premium tickets: $x_2 \geq 3x_1$
4. Non-negativity constraints: $x_1 \geq 0, x_2 \geq 0$

However, since $x_1$ and $x_2$ represent the number of tickets, they should naturally be non-negative, so we focus on the explicitly mentioned constraints.

## Symbolic Representation in JSON Format

```json
{
    'sym_variables': [('x1', 'premium tickets'), ('x2', 'regular tickets')],
    'objective_function': '50*x1 + 30*x2',
    'constraints': [
        'x1 + x2 <= 250',
        'x1 >= 50',
        'x2 >= 3*x1'
    ]
}
```

## Gurobi Code in Python

```python
import gurobipy as gp

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

# Define variables
x1 = m.addVar(name="premium_tickets", lb=0, vtype=gp.GRB.INTEGER)  # Number of premium tickets
x2 = m.addVar(name="regular_tickets", lb=0, vtype=gp.GRB.INTEGER)  # Number of regular tickets

# Objective function: Maximize profit
m.setObjective(50*x1 + 30*x2, gp.GRB.MAXIMIZE)

# Constraints
m.addConstr(x1 + x2 <= 250, name="capacity_constraint")  # Total tickets do not exceed 250
m.addConstr(x1 >= 50, name="premium_min_constraint")  # Minimum of 50 premium tickets
m.addConstr(x2 >= 3*x1, name="regular_vs_premium_constraint")  # Regular tickets are at least 3 times premium tickets

# Solve the model
m.solve()

# Print the solution
if m.status == gp.GRB.OPTIMAL:
    print("Optimal Solution:")
    print(f"Premium Tickets: {x1.varValue}")
    print(f"Regular Tickets: {x2.varValue}")
    print(f"Max Profit: {50*x1.varValue + 30*x2.varValue}")
else:
    print("No optimal solution found.")
```