To solve the given problem, we first need to define the variables and the objective function. Let's denote the number of waiters as \(W\) and the number of managers as \(M\). The objective is to minimize the total weekly wage bill, which can be represented as \(1200W + 2000M\).

The constraints given are:
1. The total number of workers must be at least 50: \(W + M \geq 50\)
2. There must be at least 15 managers: \(M \geq 15\)
3. The number of managers should be at least a third of the number of waiters: \(M \geq \frac{1}{3}W\)
4. The total weekly wage bill must not exceed $500,000: \(1200W + 2000M \leq 500,000\)

Now, let's formulate this problem in Gurobi using Python:

```python
from gurobipy import *

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

# Define the variables
W = m.addVar(vtype=GRB.INTEGER, name="waiters")
M = m.addVar(vtype=GRB.INTEGER, name="managers")

# Set the objective function to minimize the total wage bill
m.setObjective(1200*W + 2000*M, GRB.MINIMIZE)

# Add constraints
m.addConstr(W + M >= 50, "total_workers")
m.addConstr(M >= 15, "min_managers")
m.addConstr(M >= (1/3)*W, "manager_waiter_ratio")
m.addConstr(1200*W + 2000*M <= 500000, "max_wage_bill")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print("Waiters:", W.x)
    print("Managers:", M.x)
    print("Total Wage Bill: $", m.objVal)
else:
    print("No optimal solution found. Status:", m.status)

```