To solve the given optimization problem, we need to translate the natural language description into a symbolic representation that can be used in Gurobi code. The goal is to maximize profit from selling two types of tickets: premium and regular.

Let's define variables:
- \(P\) as the number of premium tickets sold,
- \(R\) as the number of regular tickets sold.

Given constraints:
1. Total tickets sold: \(P + R = 500\)
2. Minimum premium tickets reserved: \(P \geq 100\)
3. Preference for regular tickets over premium tickets: \(R \geq 3P\)

Objective function to maximize profit:
- Profit per premium ticket is $50,
- Profit per regular ticket is $30.

Thus, the objective function can be represented as:
\[Maximize: 50P + 30R\]

Now, let's translate this into Gurobi code using Python:

```python
from gurobipy import *

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

# Define variables
P = m.addVar(name='premium_tickets', vtype=GRB.INTEGER, lb=0)
R = m.addVar(name='regular_tickets', vtype=GRB.INTEGER, lb=0)

# Add constraints
m.addConstr(P + R == 500, name='total_tickets')
m.addConstr(P >= 100, name='min_premium_tickets')
m.addConstr(R >= 3*P, name='preference_regular')

# Set the objective function
m.setObjective(50*P + 30*R, GRB.MAXIMIZE)

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print('Optimal solution found:')
    print(f'Premium tickets: {P.x}')
    print(f'Regular tickets: {R.x}')
    print(f'Maximum profit: ${50*P.x + 30*R.x:.2f}')
else:
    print('No optimal solution found')
```