## Problem Description and Formulation

The problem requires formulating a linear programming (LP) model to minimize the weekly wage bill for an engineering company. The company has two types of engineers: new grad engineers earning $1000 a week and senior engineers earning $3000 a week. The constraints are as follows:

1. The weekly wage bill must not exceed $100,000.
2. There must be a minimum of 50 engineers in total.
3. At least 10 of the engineers must be senior engineers.
4. The number of senior engineers should be at least a third of the number of new grad engineers.

## LP Formulation

Let's denote:
- \(x\) as the number of new grad engineers.
- \(y\) as the number of senior engineers.

The objective function to minimize the total weekly wage bill is:
\[ \text{Minimize:} \quad 1000x + 3000y \]

Subject to:
1. \( 1000x + 3000y \leq 100000 \) (Weekly wage bill constraint)
2. \( x + y \geq 50 \) (Minimum total engineers constraint)
3. \( y \geq 10 \) (Minimum senior engineers constraint)
4. \( y \geq \frac{1}{3}x \) (Senior engineers proportion constraint)
5. \( x \geq 0, y \geq 0 \) (Non-negativity constraints)

## Gurobi Code

```python
import gurobi

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

    # Define variables
    x = model.addVar(lb=0, name="new_grad_engineers")  # Number of new grad engineers
    y = model.addVar(lb=0, name="senior_engineers")  # Number of senior engineers

    # Objective function: Minimize the total weekly wage bill
    model.setObjective(1000*x + 3000*y, gurobi.GRB.MINIMIZE)

    # Constraints
    model.addConstr(1000*x + 3000*y <= 100000, name="wage_bill_constraint")  # Weekly wage bill constraint
    model.addConstr(x + y >= 50, name="total_engineers_constraint")  # Minimum total engineers constraint
    model.addConstr(y >= 10, name="senior_engineers_min_constraint")  # Minimum senior engineers constraint
    model.addConstr(y >= (1/3)*x, name="senior_to_new_grad_ratio_constraint")  # Senior engineers proportion constraint

    # Optimize the model
    model.optimize()

    # Check if the model is optimized
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal Solution:")
        print(f"New Grad Engineers: {x.varValue}")
        print(f"Senior Engineers: {y.varValue}")
        print(f"Minimum Wage Bill: ${model.objVal:.2f}")
    else:
        print("The model is infeasible.")

solve_engineering_company_problem()
```