## Step 1: Define the symbolic variables
Let's define the symbolic variables as follows:
- $x_1$ represents the number of waiters.
- $x_2$ represents the number of managers.

## Step 2: Formulate the objective function
The objective is to minimize the weekly wage bill. Given that waiters earn $1200 per week and managers earn $2000 per week, the objective function can be written as:
\[ \text{Minimize:} \quad 1200x_1 + 2000x_2 \]

## 3: Define the constraints
Based on the problem description, we have the following constraints:
1. The restaurant requires a minimum of 50 workers: $x_1 + x_2 \geq 50$
2. At least 15 workers must be managers: $x_2 \geq 15$
3. The number of managers should be at least a third of the number of waiters: $x_2 \geq \frac{1}{3}x_1$
4. The restaurant wants to keep the weekly wage bill below $500000: $1200x_1 + 2000x_2 \leq 500000$

## 4: Convert the problem into a symbolic representation
The symbolic representation of the problem is:
```json
{
'sym_variables': [('x1', 'waiters'), ('x2', 'managers')],
'objective_function': '1200*x1 + 2000*x2',
'constraints': [
    'x1 + x2 >= 50',
    'x2 >= 15',
    'x2 >= (1/3)*x1',
    '1200*x1 + 2000*x2 <= 500000'
]
}
```

## 5: Implement the problem in Gurobi code
Now, let's implement this problem using Gurobi in Python:
```python
import gurobi

def solve_optimization_problem():
    # Create a new model
    model = gurobi.Model()

    # Define the variables
    x1 = model.addVar(lb=0, name="waiters", vtype=gurobi.GRB.INTEGER)
    x2 = model.addVar(lb=0, name="managers", vtype=gurobi.GRB.INTEGER)

    # Objective function: minimize 1200*x1 + 2000*x2
    model.setObjective(1200*x1 + 2000*x2, gurobi.GRB.MINIMIZE)

    # Constraints
    model.addConstr(x1 + x2 >= 50, name="min_workers")
    model.addConstr(x2 >= 15, name="min_managers")
    model.addConstr(x2 >= (1/3)*x1, name="manager_to_waiter_ratio")
    model.addConstr(1200*x1 + 2000*x2 <= 500000, name="wage_bill")

    # Optimize the model
    model.optimize()

    # Print the solution
    if model.status == gurobi.GRB.OPTIMAL:
        print("Optimal solution found.")
        print(f"Number of waiters: {x1.varValue}")
        print(f"Number of managers: {x2.varValue}")
        print(f"Weekly wage bill: {1200*x1.varValue + 2000*x2.varValue}")
    else:
        print("No optimal solution found.")

solve_optimization_problem()
```