To tackle the given optimization problem, let's break down the components:

1. **Variables**:
   - 'CBRN platoons' (let's denote this as `x0`)
   - 'airborne infantry companies' (denoted as `x1`)

2. **Resources/Attributes**:
   - Each CBRN platoon has an offensive capability rating of 17 and a deployment weight of 2 metric tons.
   - Each airborne infantry company has an offensive capability rating of 16 and a deployment weight of 17 metric tons.

3. **Objective Function**:
   - Minimize `3*x0 + 6*x1`

4. **Constraints**:
   - The total combined offensive capability rating must be equal to or greater than 11: `17*x0 + 16*x1 >= 11`
   - The minimum deployment weight for both must be at least 12 metric tons: `2*x0 + 17*x1 >= 12`
   - `2*x0 - 8*x1 >= 0`
   - The total combined offensive capability rating must not exceed 36: `17*x0 + 16*x1 <= 36`
   - The total deployment weight must not exceed 27 metric tons: `2*x0 + 17*x1 <= 27`
   - Both `x0` and `x1` are restricted to whole numbers.

Given these components, we can now construct the symbolic representation of the problem:

```json
{
  'sym_variables': [('x0', 'CBRN platoons'), ('x1', 'airborne infantry companies')],
  'objective_function': '3*x0 + 6*x1',
  'constraints': [
    '17*x0 + 16*x1 >= 11',
    '2*x0 + 17*x1 >= 12',
    '2*x0 - 8*x1 >= 0',
    '17*x0 + 16*x1 <= 36',
    '2*x0 + 17*x1 <= 27'
  ]
}
```

And here's how we can solve this problem using Gurobi in Python:

```python
from gurobipy import *

# Create a new model
m = Model("Optimization_Problem")

# Add variables to the model, restricted to whole numbers
x0 = m.addVar(vtype=GRB.INTEGER, name="CBRN_platoons")
x1 = m.addVar(vtype=GRB.INTEGER, name="airborne_infantry_companies")

# Set the objective function
m.setObjective(3*x0 + 6*x1, GRB.MINIMIZE)

# Add constraints to the model
m.addConstr(17*x0 + 16*x1 >= 11, "offensive_capability_min")
m.addConstr(2*x0 + 17*x1 >= 12, "deployment_weight_min")
m.addConstr(2*x0 - 8*x1 >= 0, "platoon_company_ratio")
m.addConstr(17*x0 + 16*x1 <= 36, "offensive_capability_max")
m.addConstr(2*x0 + 17*x1 <= 27, "deployment_weight_max")

# Optimize the model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"CBRN platoons: {x0.x}")
    print(f"Airborne infantry companies: {x1.x}")
    print(f"Objective function value: {m.objVal}")
else:
    print("No optimal solution found")
```