## Problem Description and Symbolic Representation

The problem involves a furniture company that produces chairs and shelves. The goal is to maximize profit given the available assembly and painting times.

### Symbolic Variables:
- $x_1$: chairs
- $x_2$: shelves

### Objective Function:
The profit per chair is $50, and the profit per shelf is $55. The objective function to maximize profit ($P$) is:
\[ P = 50x_1 + 55x_2 \]

### Constraints:
1. Assembly time: Each chair requires 30 minutes, and each shelf requires 20 minutes. The total available assembly time is 3000 minutes.
\[ 30x_1 + 20x_2 \leq 3000 \]
2. Painting time: Each chair requires 50 minutes, and each shelf requires 60 minutes. The total available painting time is 4000 minutes.
\[ 50x_1 + 60x_2 \leq 4000 \]
3. Non-negativity constraints:
\[ x_1 \geq 0, x_2 \geq 0 \]

## Symbolic Representation in JSON Format

```json
{
    'sym_variables': [('x1', 'chairs'), ('x2', 'shelves')],
    'objective_function': '50*x1 + 55*x2',
    'constraints': [
        '30*x1 + 20*x2 <= 3000',
        '50*x1 + 60*x2 <= 4000',
        'x1 >= 0',
        'x2 >= 0'
    ]
}
```

## Gurobi Code in Python

```python
import gurobipy as gp

def solve_furniture_problem():
    # Create a new model
    model = gp.Model("furniture_problem")

    # Define variables
    x1 = model.addVar(name="chairs", lb=0, vtype=gp.GRB.CONTINUOUS)
    x2 = model.addVar(name="shelves", lb=0, vtype=gp.GRB.CONTINUOUS)

    # Objective function: Maximize profit
    model.setObjective(50*x1 + 55*x2, gp.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(30*x1 + 20*x2 <= 3000, name="assembly_time")
    model.addConstr(50*x1 + 60*x2 <= 4000, name="painting_time")

    # Solve the model
    model.optimize()

    # Print the solution
    if model.status == gp.GRB.OPTIMAL:
        print(f"Optimal solution: chairs = {x1.varValue}, shelves = {x2.varValue}")
        print(f"Maximum profit: ${model.objVal:.2f}")
    else:
        print("The model is infeasible.")

solve_furniture_problem()
```

This Gurobi code defines the optimization problem as described, solves it, and prints out the optimal number of chairs and shelves to produce in order to maximize profit, along with the maximum achievable profit.