## Problem Description and Symbolic Representation

First, let's define the symbolic representation of the problem.

### Variables
- $x_1$ : security onions
- $x_2$ : pen testers

### Objective Function
The objective function to minimize is $7.64x_1 + 2.51x_2$.

### Constraints
1. Network integrity impact: $7x_1 + 11x_2 \geq 12$
2. Data integrity impact: $10x_1 + 5x_2 \geq 8$
3. Additional constraint: $3x_1 - 8x_2 \geq 0$
4. Network integrity impact upper bound: $7x_1 + 11x_2 \leq 74$
5. Data integrity impact upper bound: $10x_1 + 5x_2 \leq 33$
6. Non-fractional requirements: $x_1 \in \mathbb{Z}$, $x_2 \in \mathbb{Z}$

## Symbolic Representation in JSON

```json
{
  'sym_variables': [('x1', 'security onions'), ('x2', 'pen testers')],
  'objective_function': '7.64*x1 + 2.51*x2',
  'constraints': [
    '7*x1 + 11*x2 >= 12',
    '10*x1 + 5*x2 >= 8',
    '3*x1 - 8*x2 >= 0',
    '7*x1 + 11*x2 <= 74',
    '10*x1 + 5*x2 <= 33'
  ]
}
```

## Gurobi Code

```python
import gurobi

def solve_optimization_problem():
    # Create a new Gurobi model
    model = gurobi.Model()

    # Define variables
    x1 = model.addVar(name='security_onions', vtype=gurobi.GRB.INTEGER)
    x2 = model.addVar(name='pen_testers', vtype=gurobi.GRB.INTEGER)

    # Objective function
    model.setObjective(7.64 * x1 + 2.51 * x2, gurobi.GRB.MINIMIZE)

    # Constraints
    model.addConstr(7 * x1 + 11 * x2 >= 12, name='network_integrity_impact')
    model.addConstr(10 * x1 + 5 * x2 >= 8, name='data_integrity_impact')
    model.addConstr(3 * x1 - 8 * x2 >= 0, name='additional_constraint')
    model.addConstr(7 * x1 + 11 * x2 <= 74, name='network_integrity_impact_upper_bound')
    model.addConstr(10 * x1 + 5 * x2 <= 33, name='data_integrity_impact_upper_bound')

    # Optimize
    model.optimize()

    # Print solution
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal solution: security onions = {x1.varValue}, pen testers = {x2.varValue}")
    else:
        print("No optimal solution found")

solve_optimization_problem()
```