## Problem Description and Formulation

The company needs to determine the optimal number of washing machines and dryers to install in houses to maximize profit, given the limited availability of plumber and electrician time.

Let's define the decision variables:
- \(W\): the number of washing machines to install
- \(D\): the number of dryers to install

The objective is to maximize profit:
- Profit per washing machine installation: $200
- Profit per dryer installation: $150

The goal is to:
\[ \text{Maximize:} \quad 200W + 150D \]

Subject to the constraints:
1. Plumber time: \(20W + 10D \leq 2000\)
2. Electrician time: \(15W + 25D \leq 3000\)
3. Non-negativity: \(W \geq 0, D \geq 0\)
4. Integer solutions: \(W \in \mathbb{Z}, D \in \mathbb{Z}\) (though not explicitly stated, we'll assume integer solutions are required since fractional installations are not practical)

## Gurobi Code

To solve this linear programming problem (with an integer requirement), we can use Gurobi's Python interface. Note that while the problem as stated suggests an integer programming problem, the core issue presented fits within linear programming. However, to adhere strictly to practical interpretation (installing whole machines), we frame it as an integer programming problem.

```python
import gurobi

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

    # Define variables
    W = model.addVar(name="Washing_Machines", vtype=gurobi.GRB.INTEGER, lb=0)
    D = model.addVar(name="Dryers", vtype=gurobi.GRB.INTEGER, lb=0)

    # Objective: Maximize 200W + 150D
    model.setObjective(200 * W + 150 * D, sense=gurobi.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(20 * W + 10 * D <= 2000, name="Plumber_Time")
    model.addConstr(15 * W + 25 * D <= 3000, name="Electrician_Time")

    # Optimize
    model.optimize()

    # Print solution
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal washing machines to install: {W.varValue}")
        print(f"Optimal dryers to install: {D.varValue}")
        print(f"Max Profit: ${model.objVal}")
    else:
        print("No optimal solution found")

if __name__ == "__main__":
    solve_installation_problem()
```

This code sets up the problem with Gurobi, solving for the maximum profit under the given constraints and outputting the optimal number of washing machines and dryers to install.