## Problem Description and Symbolic Representation

The problem involves minimizing the weekly payroll for a company that employs engineers and interns. The goal is to formulate a linear programming (LP) problem to minimize wages under given constraints.

### Symbolic Representation

Let's define the symbolic variables as follows:
- $x_1$ = number of engineers
- $x_2$ = number of interns

The objective is to minimize the total weekly payroll, which can be represented as:
\[ \text{Minimize:} \quad 3000x_1 + 750x_2 \]

The constraints based on the problem description are:
1. Total workers must be at least 100: $x_1 + x_2 \geq 100$
2. At least 20 workers must be interns: $x_2 \geq 20$
3. The number of interns must be at least a third of the number of engineers: $x_2 \geq \frac{1}{3}x_1$
4. The weekly payroll must be at most $200,000: $3000x_1 + 750x_2 \leq 200,000$

## Symbolic Representation in JSON Format

```json
{
    'sym_variables': [('x1', 'engineers'), ('x2', 'interns')],
    'objective_function': '3000*x1 + 750*x2',
    'constraints': [
        'x1 + x2 >= 100',
        'x2 >= 20',
        'x2 >= (1/3)*x1',
        '3000*x1 + 750*x2 <= 200000'
    ]
}
```

## Gurobi Code in Python

```python
import gurobipy as gp

def solve_optimization_problem():
    # Create a new model
    model = gp.Model("Engineering_Firm_Optimization")

    # Define the variables
    x1 = model.addVar(name="engineers", obj=3000)  # Number of engineers
    x2 = model.addVar(name="interns", obj=750)     # Number of interns

    # Define the constraints
    model.addConstr(x1 + x2 >= 100, name="total_workers")
    model.addConstr(x2 >= 20, name="min_interns")
    model.addConstr(x2 >= (1/3)*x1, name="interns_to_engineers_ratio")
    model.addConstr(3000*x1 + 750*x2 <= 200000, name="max_payroll")

    # Set the objective to minimize the total payroll
    model.setObjective(x1.obj * x1 + x2.obj * x2, gp.GRB.MINIMIZE)

    # Solve the model
    model.optimize()

    # Print the solution
    if model.status == gp.GRB.OPTIMAL:
        print("Optimal Solution:")
        print(f"Number of Engineers: {x1.varValue}")
        print(f"Number of Interns: {x2.varValue}")
        print(f"Total Payroll: ${model.objVal:.2f}")
    else:
        print("The model is infeasible.")

solve_optimization_problem()
```