## Symbolic Representation

To solve the given optimization problem, we first need to convert the natural language description into a symbolic representation. Let's define the variables and the objective function, as well as the constraints.

### Variables
- $x_1$ represents the number of ads on planes
- $x_2$ represents the number of ads on blimps
- $x_3$ represents the number of ads on hot air balloons

### Objective Function
The objective is to maximize viewership. Given that:
- An ad on a plane reaches 100,000 viewers,
- An ad on a blimp reaches 50,000 viewers,
- An ad on a hot air balloon reaches 20,000 viewers,

The objective function can be represented as:
\[ \text{Maximize:} \quad 100,000x_1 + 50,000x_2 + 20,000x_3 \]

### Constraints
1. **Cost Constraint**: The total cost must not exceed $50,000.
\[ 5000x_1 + 2000x_2 + 1000x_3 \leq 50,000 \]

2. **Ad Limit per Platform**: The number of ads from the same company on each platform is limited to 5.
\[ x_1 \leq 5, \quad x_2 \leq 5, \quad x_3 \leq 5 \]

3. **Hot Air Balloon Limit**: At most half of the total number of ads can occur on hot air balloons.
\[ x_3 \leq 0.5(x_1 + x_2 + x_3) \]
\[ 0.5x_1 + 0.5x_2 - 0.5x_3 \geq 0 \]
Or equivalently:
\[ x_3 \leq x_1 + x_2 \]

4. **Blimp Minimum**: At least 20% of the ads should occur on blimps.
\[ x_2 \geq 0.2(x_1 + x_2 + x_3) \]
\[ 0.8x_2 - 0.2x_1 - 0.2x_3 \geq 0 \]

5. **Non-Negativity**: The number of ads cannot be negative.
\[ x_1 \geq 0, \quad x_2 \geq 0, \quad x_3 \geq 0 \]
And since $x_1, x_2, x_3$ represent the number of ads, they must be integers.

## Symbolic Representation in JSON Format

```json
{
    'sym_variables': [('x1', 'ads on planes'), ('x2', 'ads on blimps'), ('x3', 'ads on hot air balloons')],
    'objective_function': '100000*x1 + 50000*x2 + 20000*x3',
    'constraints': [
        '5000*x1 + 2000*x2 + 1000*x3 <= 50000',
        'x1 <= 5',
        'x2 <= 5',
        'x3 <= 5',
        'x3 <= x1 + x2',
        '0.8*x2 - 0.2*x1 - 0.2*x3 >= 0',
        'x1 >= 0',
        'x2 >= 0',
        'x3 >= 0'
    ]
}
```

## Gurobi Code in Python

```python
import gurobipy as gp
from gurobipy import GRB

def solve_advertisement_problem():
    # Create a new model
    model = gp.Model("advertisement_problem")

    # Define variables
    x1 = model.addVar(name="ads_on_planes", vtype=GRB.INTEGER, lb=0)
    x2 = model.addVar(name="ads_on_blimps", vtype=GRB.INTEGER, lb=0)
    x3 = model.addVar(name="ads_on_hot_air_balloons", vtype=GRB.INTEGER, lb=0)

    # Objective function: Maximize viewership
    model.setObjective(100000*x1 + 50000*x2 + 20000*x3, GRB.MAXIMIZE)

    # Cost constraint
    model.addConstr(5000*x1 + 2000*x2 + 1000*x3 <= 50000, name="cost_constraint")

    # Ad limit per platform
    model.addConstr(x1 <= 5, name="plane_limit")
    model.addConstr(x2 <= 5, name="blimp_limit")
    model.addConstr(x3 <= 5, name="hot_air_balloon_limit")

    # Hot air balloon limit
    model.addConstr(x3 <= x1 + x2, name="hot_air_balloon_vs_others")

    # Blimp minimum
    model.addConstr(0.8*x2 - 0.2*x1 - 0.2*x3 >= 0, name="blimp_minimum")

    # Solve the model
    model.optimize()

    # Print the solution
    if model.status == GRB.OPTIMAL:
        print("Optimal Solution:")
        print(f"Ads on planes: {x1.varValue}")
        print(f"Ads on blimps: {x2.varValue}")
        print(f"Ads on hot air balloons: {x3.varValue}")
        print(f"Max viewership: {model.objVal}")
    else:
        print("No optimal solution found.")

solve_advertisement_problem()
```