## Problem Description and Formulation

The problem is a classic example of a linear programming problem. The goal is to maximize the profit of a lighting company that produces glass and brass chandeliers. The company has limited resources in terms of crafting and installation hours.

Let's define the decision variables:

- \(G\): The number of glass chandeliers to be crafted and installed.
- \(B\): The number of brass chandeliers to be crafted and installed.

The objective function to maximize profit (\(P\)) is given by:

\[P = 400G + 300B\]

The constraints based on the available crafting and installation hours are:

1. Crafting hours: \(2G + 1.5B \leq 750\)
2. Installation hours: \(G + 0.75B \leq 500\)

Additionally, \(G \geq 0\) and \(B \geq 0\), as the number of chandeliers cannot be negative.

## Gurobi Code

To solve this problem using Gurobi in Python, we will first install the Gurobi library if it's not already installed. You can install it using pip:

```bash
pip install gurobi
```

Now, let's formulate and solve the problem using Gurobi:

```python
import gurobi as gp

# Create a new model
m = gp.Model("Chandelier_Problem")

# Define the decision variables
G = m.addVar(name="Glass_Chandeliers", lb=0, vtype=gp.GRB.CONTINUOUS)
B = m.addVar(name="Brass_Chandeliers", lb=0, vtype=gp.GRB.CONTINUOUS)

# Define the objective function
m.setObjective(400 * G + 300 * B, gp.GRB.MAXIMIZE)

# Add the constraints
m.addConstr(2 * G + 1.5 * B <= 750, name="Crafting_Hours")
m.addConstr(G + 0.75 * B <= 500, name="Installation_Hours")

# Solve the model
m.optimize()

# Check if the model is optimized
if m.status == gp.GRB.OPTIMAL:
    print(f"Optimal Solution: Glass Chandeliers = {G.varValue}, Brass Chandeliers = {B.varValue}")
    print(f"Maximum Profit: ${m.objVal:.2f}")
else:
    print("The model is infeasible or has an error.")
```