## Problem Description and Formulation

The problem requires formulating a linear programming (LP) model to minimize the weekly wage bill for Iota Software while satisfying several constraints. The goal is to determine the optimal number of full-time and part-time employees.

### Decision Variables

- \(x\): Number of full-time employees
- \(y\): Number of part-time employees

### Objective Function

The objective is to minimize the total weekly wage bill. Full-time employees earn $800 per week, and part-time employees earn $400 per week. Therefore, the objective function can be formulated as:

\[ \text{Minimize:} \quad 800x + 400y \]

### Constraints

1. **Total Employees**: The projects require at least 60 employees.
   \[ x + y \geq 60 \]

2. **Full-time Employees Requirement**: At least 40 employees must be full-time.
   \[ x \geq 40 \]

3. **Full-time to Part-time Ratio**: The number of full-time employees should be at least a third of the number of part-time employees.
   \[ x \geq \frac{1}{3}y \]
   or equivalently,
   \[ 3x \geq y \]

4. **Weekly Wage Bill**: The weekly wage bill must be kept below $30,000.
   \[ 800x + 400y \leq 30000 \]

5. **Non-Negativity**: The number of employees cannot be negative.
   \[ x \geq 0, y \geq 0 \]
   However, given the constraints, \(x \geq 40\) and \(x + y \geq 60\), the non-negativity of \(x\) and \(y\) is implicitly satisfied.

## Gurobi Code

```python
import gurobi

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

    # Decision variables
    x = model.addVar(lb=0, vtype=gurobi.GRB.INTEGER, name="full_time_employees")
    y = model.addVar(lb=0, vtype=gurobi.GRB.INTEGER, name="part_time_employees")

    # Objective function: Minimize the wage bill
    model.setObjective(800*x + 400*y, gurobi.GRB.MINIMIZE)

    # Constraints
    model.addConstr(x + y >= 60, name="total_employees")
    model.addConstr(x >= 40, name="full_time_requirement")
    model.addConstr(3*x >= y, name="full_time_to_part_time_ratio")
    model.addConstr(800*x + 400*y <= 30000, name="wage_bill")

    # Optimize the model
    model.optimize()

    # Print the solution
    if model.status == gurobi.GRB.OPTIMAL:
        print("Optimal Solution:")
        print(f"Full-time employees: {x.varValue}")
        print(f"Part-time employees: {y.varValue}")
        print(f"Minimum wage bill: ${model.objVal:.2f}")
    else:
        print("The model is infeasible.")

solve_optimization_problem()
```

This Gurobi code captures the problem description, formulates it as a linear programming model, and solves it to find the optimal number of full-time and part-time employees that minimizes the wage bill while satisfying all given constraints.