## Problem Description and Symbolic Representation

The company wants to maximize profit by producing small and large chessboards. The goal is to determine the number of small and large chessboards to produce given the available cutting and assembly times.

### Symbolic Representation

Let's define the symbolic variables:
- $x_1$ = number of small chessboards
- $x_2$ = number of large chessboards

The objective function to maximize profit is:
\[ \text{Maximize:} \quad 4x_1 + 8x_2 \]

The constraints based on the available times are:
- Cutting time: $5x_1 + 10x_2 \leq 400$
- Assembly time: $10x_1 + 20x_2 \leq 700$
- Non-negativity: $x_1 \geq 0, x_2 \geq 0$

## Symbolic Representation in JSON Format

```json
{
    'sym_variables': [('x1', 'small chessboards'), ('x2', 'large chessboards')],
    'objective_function': '4*x1 + 8*x2',
    'constraints': [
        '5*x1 + 10*x2 <= 400',
        '10*x1 + 20*x2 <= 700',
        'x1 >= 0',
        'x2 >= 0'
    ]
}
```

## Gurobi Code in Python

```python
import gurobipy as gp

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

# Define the variables
x1 = model.addVar(name="small_chessboards", lb=0, vtype=gp.GRB.INTEGER)
x2 = model.addVar(name="large_chessboards", lb=0, vtype=gp.GRB.INTEGER)

# Define the objective function
model.setObjective(4 * x1 + 8 * x2, gp.GRB.MAXIMIZE)

# Add constraints
model.addConstr(5 * x1 + 10 * x2 <= 400, name="cutting_time")
model.addConstr(10 * x1 + 20 * x2 <= 700, name="assembly_time")

# Solve the model
model.optimize()

# Print the results
if model.status == gp.GRB.OPTIMAL:
    print(f"Optimal solution: small chessboards = {x1.varValue}, large chessboards = {x2.varValue}")
    print(f"Maximal profit: ${model.objVal:.2f}")
else:
    print("No optimal solution found.")
```