## Problem Description and Symbolic Representation

The problem involves maximizing profit by determining the number of two types of decors (vase décor and wood canvas) to produce given certain constraints on carving and polishing time.

### Symbolic Representation:

Let's denote:
- \(x_1\) as the number of vase décors
- \(x_2\) as the number of wood canvases

The objective is to maximize profit \(P = 50x_1 + 85x_2\).

The constraints based on the given times are:
- Carving time: \(20x_1 + 18x_2 \leq 400\)
- Polishing time: \(14x_1 + 8x_2 \leq 640\)
- Non-negativity: \(x_1 \geq 0, x_2 \geq 0\)

## Symbolic Representation in JSON Format

```json
{
    'sym_variables': [('x1', 'vase décor'), ('x2', 'wood canvas')],
    'objective_function': '50*x1 + 85*x2',
    'constraints': [
        '20*x1 + 18*x2 <= 400',
        '14*x1 + 8*x2 <= 640',
        'x1 >= 0',
        'x2 >= 0'
    ]
}
```

## Gurobi Code in Python

```python
import gurobipy as gp

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

# Define variables
x1 = model.addVar(name="vase_decor", lb=0, vtype=gp.GRB.INTEGER)  # Number of vase décors
x2 = model.addVar(name="wood_canvas", lb=0, vtype=gp.GRB.INTEGER)  # Number of wood canvases

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

# Constraints
model.addConstr(20*x1 + 18*x2 <= 400, name="carving_time")  # Carving time constraint
model.addConstr(14*x1 + 8*x2 <= 640, name="polishing_time")  # Polishing time constraint

# Solve the model
model.optimize()

# Print the solution
if model.status == gp.GRB.OPTIMAL:
    print(f"Optimal solution: x1 = {x1.varValue}, x2 = {x2.varValue}")
    print(f"Maximum profit: ${50*x1.varValue + 85*x2.varValue}")
else:
    print("No optimal solution found.")
```