## Step 1: Define the symbolic variables
Let's define the symbolic variables for the problem:
- $x_1$ represents the number of advertisements on Banana Livestream
- $x_2$ represents the number of advertisements on Durian TV
- $x_3$ represents the number of advertisements on Orange Premium Video

## Step 2: Convert the natural language description into a symbolic representation
The objective is to maximize the total audience. The audience attracted by each option is given:
- Banana Livestream attracts 300,000 viewers per ad
- Durian TV attracts 10,000 viewers per ad
- Orange Premium Video attracts 12,000 viewers per ad

So, the objective function to maximize is: $300,000x_1 + 10,000x_2 + 12,000x_3$

## 3: Define the constraints
1. The cost constraint: $1500x_1 + 300x_2 + 500x_3 \leq 20,000$
2. Durian TV advertisement limit: $x_2 \leq 15$
3. Orange Premium Video limit: $x_3 \leq \frac{1}{3}(x_1 + x_2 + x_3)$
4. Banana Livestream minimum: $x_1 \geq 0.05(x_1 + x_2 + x_3)$
5. Non-negativity constraints: $x_1, x_2, x_3 \geq 0$ and $x_1, x_2, x_3$ are integers

## 4: Simplify the constraints for clarity
- The Orange Premium Video limit can be rewritten as: $3x_3 \leq x_1 + x_2 + x_3$ or $2x_3 \leq x_1 + x_2$
- The Banana Livestream minimum can be rewritten as: $0.95x_1 - 0.05x_2 - 0.05x_3 \geq 0$

## 5: Symbolic Representation
```json
{
'sym_variables': [('x1', 'Banana Livestream ads'), ('x2', 'Durian TV ads'), ('x3', 'Orange Premium Video ads')],
'objective_function': '300000*x1 + 10000*x2 + 12000*x3',
'constraints': [
    '1500*x1 + 300*x2 + 500*x3 <= 20000',
    'x2 <= 15',
    '2*x3 <= x1 + x2',
    '0.95*x1 - 0.05*x2 - 0.05*x3 >= 0',
    'x1, x2, x3 >= 0 and are integers'
]
}
```

## 6: Gurobi Code
```python
import gurobipy as gp

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

# Define the variables
x1 = m.addVar(name="Banana Livestream ads", vtype=gp.GRB.INTEGER)
x2 = m.addVar(name="Durian TV ads", vtype=gp.GRB.INTEGER)
x3 = m.addVar(name="Orange Premium Video ads", vtype=gp.GRB.INTEGER)

# Objective function: maximize the total audience
m.setObjective(300000*x1 + 10000*x2 + 12000*x3, gp.GRB.MAXIMIZE)

# Constraints
m.addConstr(1500*x1 + 300*x2 + 500*x3 <= 20000, name="budget_constraint")
m.addConstr(x2 <= 15, name="durian_tv_limit")
m.addConstr(2*x3 <= x1 + x2, name="orange_premium_video_limit")
m.addConstr(0.95*x1 - 0.05*x2 - 0.05*x3 >= 0, name="banana_livestream_min")
m.addConstr(x1 >= 0, name="x1_non_negative")
m.addConstr(x2 >= 0, name="x2_non_negative")
m.addConstr(x3 >= 0, name="x3_non_negative")

# Solve the model
m.optimize()

# Print the solution
if m.status == gp.GRB.OPTIMAL:
    print("Optimal solution found.")
    print(f"Banana Livestream ads: {x1.varValue}")
    print(f"Durian TV ads: {x2.varValue}")
    print(f"Orange Premium Video ads: {x3.varValue}")
    print(f"Total audience: {300000*x1.varValue + 10000*x2.varValue + 12000*x3.varValue}")
else:
    print("No optimal solution found.")
```