## Problem Description and Formulation

The company produces two products: hoodies and sweaters. The production of each product requires two resources: fabric and dye. The goal is to maximize profit given the limited availability of these resources.

### Decision Variables

- Let \(H\) be the number of hoodies produced.
- Let \(S\) be the number of sweaters produced.

### Objective Function

The profit per hoodie is $20, and the profit per sweater is $15. The objective is to maximize the total profit \(P\), which can be represented as:

\[P = 20H + 15S\]

### Constraints

1. **Fabric Constraint**: Each hoodie requires 3 units of fabric, and each sweater requires 2 units of fabric. There are 500 units of fabric available.

\[3H + 2S \leq 500\]

2. **Dye Constraint**: Each hoodie requires 2 units of dye, and each sweater requires 1.5 units of dye. There are 300 units of dye available.

\[2H + 1.5S \leq 300\]

3. **Non-Negativity Constraints**: The number of hoodies and sweaters produced cannot be negative.

\[H \geq 0, S \geq 0\]

## Gurobi Code

To solve this linear programming problem using Gurobi, we can use the following Python code:

```python
import gurobi

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

    # Define decision variables
    H = model.addVar(lb=0, name="Hoodies")
    S = model.addVar(lb=0, name="Sweaters")

    # Objective function: Maximize profit
    model.setObjective(20 * H + 15 * S, gurobi.GRB.MAXIMIZE)

    # Fabric constraint
    model.addConstr(3 * H + 2 * S <= 500, name="Fabric_Constraint")

    # Dye constraint
    model.addConstr(2 * H + 1.5 * S <= 300, name="Dye_Constraint")

    # Optimize the model
    model.optimize()

    # Print the status of the optimization
    if model.status == gurobi.GRB.Status.OPTIMAL:
        print("Optimal solution found.")
        print(f"Number of hoodies to produce: {H.varValue}")
        print(f"Number of sweaters to produce: {S.varValue}")
        print(f"Maximum profit: ${model.objVal:.2f}")
    else:
        print("No optimal solution found.")

# Run the function
solve_production_problem()
```

This code defines the optimization problem using Gurobi's Python interface, solves it, and prints out the optimal production levels for hoodies and sweaters, along with the maximum achievable profit.