## Problem Description and Symbolic Representation

The problem involves an appliance store that sells microwaves and vents. The goal is to maximize profit given certain constraints.

### Symbolic Variables:
- $x_1$ : Number of microwaves sold
- $x_2$ : Number of vents sold

### Objective Function:
The profit per microwave sold is $200, and the profit per vent sold is $300. Therefore, the objective function to maximize profit is:
\[ \text{Maximize:} \quad 200x_1 + 300x_2 \]

### Constraints:
1. The store can spend at most $20,000, with a microwave costing $300 and a vent costing $400:
\[ 300x_1 + 400x_2 \leq 20000 \]
2. The store sells at least 30 microwaves but at most 65 microwaves:
\[ 30 \leq x_1 \leq 65 \]
3. The number of vents sold is at most a third of the number of microwaves sold:
\[ x_2 \leq \frac{1}{3}x_1 \]

## Symbolic Representation in JSON Format

```json
{
    'sym_variables': [('x1', 'microwaves'), ('x2', 'vents')],
    'objective_function': '200*x1 + 300*x2',
    'constraints': [
        '300*x1 + 400*x2 <= 20000',
        '30 <= x1 <= 65',
        'x2 <= 1/3*x1'
    ]
}
```

## Gurobi Code in Python

```python
import gurobipy as gp

def solve_optimization_problem():
    # Create a new model
    model = gp.Model("appliance_store")

    # Define variables
    x1 = model.addVar(lb=30, ub=65, name="microwaves", vtype=gp.GRB.INTEGER)
    x2 = model.addVar(name="vents", vtype=gp.GRB.INTEGER)

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

    # Constraints
    model.addConstr(300*x1 + 400*x2 <= 20000, name="budget_constraint")
    model.addConstr(x2 <= (1/3)*x1, name="vent_microwave_ratio")

    # Solve the model
    model.optimize()

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

solve_optimization_problem()
```