## Problem Description and Formulation

The problem is a linear programming (LP) optimization problem. The goal is to maximize the profit of a tech company that produces phones and laptops, given limitations on silicon chip availability, engineering time, and assembly time.

### Decision Variables

Let \(P\) be the number of phones produced and \(L\) be the number of laptops produced.

### Objective Function

The profit per phone is $300, and the profit per laptop is $500. The objective is to maximize the total profit:

\[ \text{Maximize:} \quad 300P + 500L \]

### Constraints

1. **Silicon Chip Availability:** Each phone requires 2 silicon chips, and each laptop requires 4 silicon chips. The company can buy 200 silicon chips per week.

\[ 2P + 4L \leq 200 \]

2. **Engineering Time:** Each phone requires 5 hours of engineering time, and each laptop requires 6 hours of engineering time. The company has 250 hours of engineering time available.

\[ 5P + 6L \leq 250 \]

3. **Assembly Time:** Each phone requires 3 hours of assembly time, and each laptop requires 1 hour of assembly time. The company has 300 hours of assembly time available.

\[ 3P + L \leq 300 \]

4. **Minimum Production Requirements:** The company wants to produce at least 30 units of phones and at least 30 units of laptops each week.

\[ P \geq 30 \]
\[ L \geq 30 \]

5. **Non-Negativity Constraints:** The number of phones and laptops produced cannot be negative.

\[ P \geq 0 \]
\[ L \geq 0 \]

However, since we have the constraints \( P \geq 30 \) and \( L \geq 30 \), the non-negativity constraints are implicitly satisfied.

## Gurobi Code

```python
import gurobi

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

    # Define the decision variables
    P = model.addVar(lb=30, name="P")  # Number of phones
    L = model.addVar(lb=30, name="L")  # Number of laptops

    # Objective function: Maximize profit
    model.setObjective(300 * P + 500 * L, gurobi.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(2 * P + 4 * L <= 200, name="silicon_chips")
    model.addConstr(5 * P + 6 * L <= 250, name="engineering_time")
    model.addConstr(3 * P + L <= 300, name="assembly_time")

    # Solve the model
    model.optimize()

    # Check if the model is optimized
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal profit: ${model.objVal}")
        print(f"Phones produced: {P.varValue}")
        print(f"Laptops produced: {L.varValue}")
    else:
        print("The model is infeasible.")

solve_optimization_problem()
```

This Gurobi code defines the LP problem as described, with the objective to maximize profit under the given constraints. It then solves the problem and prints out the optimal profit and production levels if the model is feasible.