```json
{
  "sym_variables": [
    ("x0", "CBRN platoons"),
    ("x1", "light infantry companies"),
    ("x2", "artillery batteries"),
    ("x3", "engineer platoons")
  ],
  "objective_function": "6.42 * x0 + 2.54 * x1 + 1.76 * x2 + 4.16 * x3",
  "constraints": [
    "4 * x0 + 13 * x3 >= 21",
    "4 * x0 + 6 * x2 >= 30",
    "14 * x1 + 6 * x2 >= 23",
    "6 * x2 + 13 * x3 >= 27",
    "4 * x0 + 6 * x2 + 13 * x3 >= 29",
    "4 * x0 + 14 * x1 + 13 * x3 >= 29",
    "4 * x0 + 6 * x2 + 13 * x3 >= 30",
    "4 * x0 + 14 * x1 + 13 * x3 >= 30",
    "4 * x0 + 14 * x1 + 6 * x2 + 13 * x3 >= 30",
    "7 * x1 + 14 * x3 >= 53",
    "2 * x0 + 7 * x1 >= 28",
    "2 * x0 + 14 * x3 >= 49",
    "2 * x0 + 8 * x2 >= 21",
    "2 * x0 + 7 * x1 + 14 * x3 >= 29",
    "7 * x1 + 8 * x2 + 14 * x3 >= 29",
    "2 * x0 + 7 * x1 + 8 * x2 >= 29",
    "2 * x0 + 7 * x1 + 14 * x3 >= 38",
    "7 * x1 + 8 * x2 + 14 * x3 >= 38",
    "2 * x0 + 7 * x1 + 8 * x2 >= 38",
    "2 * x0 + 7 * x1 + 14 * x3 >= 31",
    "7 * x1 + 8 * x2 + 14 * x3 >= 31",
    "2 * x0 + 7 * x1 + 8 * x2 >= 31",
    "2 * x0 + 7 * x1 + 8 * x2 + 14 * x3 >= 31",
    "10 * x0 + 9 * x2 >= 23",
    "10 * x0 + 3 * x3 >= 39",
    "13 * x1 + 9 * x2 >= 19",
    "13 * x1 + 3 * x3 >= 29",
    "10 * x0 + 9 * x2 + 3 * x3 >= 54",  // Duplicate constraint, removed in code
    "10 * x0 + 13 * x1 + 3 * x3 >= 54",  // Duplicate constraint, removed in code
    "10 * x0 + 9 * x2 + 3 * x3 >= 38",  // Duplicate constraint, removed in code
    "10 * x0 + 13 * x1 + 3 * x3 >= 38",  // Duplicate constraint, removed in code
    "10 * x0 + 13 * x1 + 9 * x2 + 3 * x3 >= 38",
    "14 * x0 + 13 * x2 >= 27",
    "13 * x2 + 7 * x3 >= 30",
    "13 * x1 + 13 * x2 >= 29",  // Duplicate constraint, removed in code
    "14 * x0 + 13 * x1 + 13 * x2 >= 31",  // Duplicate constraint, removed in code
    "13 * x1 + 13 * x2 + 7 * x3 >= 31",  // Duplicate constraint, removed in code
    "14 * x0 + 13 * x1 + 13 * x2 >= 27",  // Duplicate constraint, removed in code
    "13 * x1 + 13 * x2 + 7 * x3 >= 27",  // Duplicate constraint, removed in code
    "14 * x0 + 13 * x1 + 13 * x2 + 7 * x3 >= 27",
    "x2 - x3 >= 0",
    "-5 * x0 + 9 * x3 >= 0",
    "4 * x0 + 6 * x2 + 13 * x3 <= 49",
    "14 * x1 + 6 * x2 + 13 * x3 <= 69",
    "4 * x0 + 14 * x1 + 6 * x2 <= 103",
    "7 * x1 + 8 * x2 <= 210",
    "13 * x1 + 3 * x3 <= 135",
    "10 * x0 + 9 * x2 <= 101",
    "10 * x0 + 9 * x2 + 3 * x3 <= 163",
    "14 * x0 + 13 * x1 <= 119",
    "13 * x1 + 13 * x2 + 7 * x3 <= 66",
    "x0 >= 0",
    "x1 >= 0",
    "x2 >= 0",
    "x3 >= 0"
  ]
}
```

```python
import gurobipy as gp

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

# Create variables
cbrn_platoons = m.addVar(vtype=gp.GRB.INTEGER, name="cbrn_platoons")
light_infantry = m.addVar(vtype=gp.GRB.INTEGER, name="light_infantry")
artillery = m.addVar(vtype=gp.GRB.INTEGER, name="artillery")
engineer = m.addVar(vtype=gp.GRB.INTEGER, name="engineer")


# Set objective function
m.setObjective(6.42 * cbrn_platoons + 2.54 * light_infantry + 1.76 * artillery + 4.16 * engineer, gp.GRB.MINIMIZE)

# Add constraints

m.addConstr(4 * cbrn_platoons + 13 * engineer >= 21)
m.addConstr(4 * cbrn_platoons + 6 * artillery >= 30)
m.addConstr(14 * light_infantry + 6 * artillery >= 23)
m.addConstr(6 * artillery + 13 * engineer >= 27)
m.addConstr(4 * cbrn_platoons + 6 * artillery + 13 * engineer >= 29)
m.addConstr(4 * cbrn_platoons + 14 * light_infantry + 13 * engineer >= 29)
m.addConstr(4 * cbrn_platoons + 6 * artillery + 13 * engineer >= 30)
m.addConstr(4 * cbrn_platoons + 14 * light_infantry + 13 * engineer >= 30)
m.addConstr(4 * cbrn_platoons + 14 * light_infantry + 6 * artillery + 13 * engineer >= 30)

m.addConstr(7 * light_infantry + 14 * engineer >= 53)
m.addConstr(2 * cbrn_platoons + 7 * light_infantry >= 28)
m.addConstr(2 * cbrn_platoons + 14 * engineer >= 49)
m.addConstr(2 * cbrn_platoons + 8 * artillery >= 21)
m.addConstr(2 * cbrn_platoons + 7 * light_infantry + 14 * engineer >= 29)
m.addConstr(7 * light_infantry + 8 * artillery + 14 * engineer >= 29)
m.addConstr(2 * cbrn_platoons + 7 * light_infantry + 8 * artillery >= 29)
m.addConstr(2 * cbrn_platoons + 7 * light_infantry + 14 * engineer >= 38)
m.addConstr(7 * light_infantry + 8 * artillery + 14 * engineer >= 38)
m.addConstr(2 * cbrn_platoons + 7 * light_infantry + 8 * artillery >= 38)
m.addConstr(2 * cbrn_platoons + 7 * light_infantry + 14 * engineer >= 31)
m.addConstr(7 * light_infantry + 8 * artillery + 14 * engineer >= 31)
m.addConstr(2 * cbrn_platoons + 7 * light_infantry + 8 * artillery >= 31)
m.addConstr(2 * cbrn_platoons + 7 * light_infantry + 8 * artillery + 14 * engineer >= 31)


m.addConstr(10 * cbrn_platoons + 9 * artillery >= 23)
m.addConstr(10 * cbrn_platoons + 3 * engineer >= 39)
m.addConstr(13 * light_infantry + 9 * artillery >= 19)
m.addConstr(13 * light_infantry + 3 * engineer >= 29)
# Removed duplicate constraints
m.addConstr(10 * cbrn_platoons + 13 * light_infantry + 9 * artillery + 3 * engineer >= 38)

m.addConstr(14 * cbrn_platoons + 13 * artillery >= 27)
m.addConstr(13 * artillery + 7 * engineer >= 30)
# Removed duplicate constraints
m.addConstr(14 * cbrn_platoons + 13 * light_infantry + 13 * artillery + 7 * engineer >= 27)

m.addConstr(artillery - engineer >= 0)
m.addConstr(-5 * cbrn_platoons + 9 * engineer >= 0)

m.addConstr(4 * cbrn_platoons + 6 * artillery + 13 * engineer <= 49)
m.addConstr(14 * light_infantry + 6 * artillery + 13 * engineer <= 69)
m.addConstr(4 * cbrn_platoons + 14 * light_infantry + 6 * artillery <= 103)

m.addConstr(7 * light_infantry + 8 * artillery <= 210)
m.addConstr(13 * light_infantry + 3 * engineer <= 135)
m.addConstr(10 * cbrn_platoons + 9 * artillery <= 101)
m.addConstr(10 * cbrn_platoons + 9 * artillery + 3 * engineer <= 163)
m.addConstr(14 * cbrn_platoons + 13 * light_infantry <= 119)
m.addConstr(13 * light_infantry + 13 * artillery + 7 * engineer <= 66)


# Optimize model
m.optimize()

# Print results
if m.status == gp.GRB.OPTIMAL:
    print('\nCost: %g' % m.objVal)
    print('CBRN Platoons:', cbrn_platoons.x)
    print('Light Infantry Companies:', light_infantry.x)
    print('Artillery Batteries:', artillery.x)
    print('Engineer Platoons:', engineer.x)
elif m.status == gp.GRB.INFEASIBLE:
    print('Model is infeasible')
else:
    print('Optimization ended with status %d' % m.status)

```
