```json
{
  "sym_variables": [
    ("x0", "water purification units"),
    ("x1", "reconnaissance troops"),
    ("x2", "logistics companies"),
    ("x3", "engineer platoons")
  ],
  "objective_function": "1*x0 + 8*x1 + 2*x2 + 6*x3",
  "constraints": [
    "2.47*x1 + 2.31*x2 >= 76",
    "2.47*x1 + 3.92*x3 >= 82",
    "2.85*x0 + 2.47*x1 >= 38",
    "2.31*x2 + 3.92*x3 >= 43",
    "2.85*x0 + 2.31*x2 + 3.92*x3 >= 66",
    "2.47*x1 + 2.31*x2 + 3.92*x3 >= 66",
    "2.85*x0 + 2.31*x2 + 3.92*x3 >= 83",
    "2.47*x1 + 2.31*x2 + 3.92*x3 >= 83",
    "2.85*x0 + 2.47*x1 + 2.31*x2 + 3.92*x3 >= 83",
    "3.17*x1 + 1.13*x2 >= 45",
    "2.63*x0 + 0.77*x3 >= 25",
    "1.13*x2 + 0.77*x3 >= 23",
    "2.63*x0 + 3.17*x1 + 1.13*x2 + 0.77*x3 >= 23",
    "0.81*x2 + 3.42*x3 >= 15",
    "0.3*x0 + 0.81*x2 >= 29",
    "0.3*x0 + 0.81*x2 + 3.42*x3 >= 40",
    "0.3*x0 + 3.42*x1 + 0.81*x2 + 3.42*x3 >= 40",
    "3.88*x0 + 2.23*x1 >= 61",
    "1.59*x2 + 1.29*x3 >= 47",
    "3.88*x0 + 2.23*x1 + 1.59*x2 + 1.29*x3 >= 47",
    "0.04*x2 + 0.66*x3 >= 102",
    "2.89*x1 + 0.04*x2 >= 75",
    "1.1*x0 + 0.66*x3 >= 80",
    "1.1*x0 + 2.89*x1 >= 55",
    "1.1*x0 + 2.89*x1 + 0.04*x2 >= 93",
    "2.89*x1 + 0.04*x2 + 0.66*x3 >= 93",
    "1.1*x0 + 2.89*x1 + 0.04*x2 >= 65",
    "2.89*x1 + 0.04*x2 + 0.66*x3 >= 65",
    "1.1*x0 + 2.89*x1 + 0.04*x2 + 0.66*x3 >= 65",
    "-2*x0 + 4*x3 >= 0",
    "9*x1 - 8*x2 >= 0",
    "2.31*x2 + 3.92*x3 <= 149",
    "2.85*x0 + 2.47*x1 <= 86",
    "2.85*x0 + 3.92*x3 <= 217",
    "2.63*x0 + 1.13*x2 <= 181",
    "1.13*x2 + 0.77*x3 <= 218",
    "3.17*x1 + 1.13*x2 <= 191",
    "0.3*x0 + 3.42*x1 + 0.81*x2 <= 184",
    "0.3*x0 + 0.81*x2 + 3.42*x3 <= 168",
    "1.1*x0 + 0.66*x3 <= 298",
    "2.89*x1 + 0.04*x2 <= 220",
    "1.1*x0 + 2.89*x1 + 0.66*x3 <= 339",
    "2.85*x0 + 2.47*x1 + 2.31*x2 + 3.92*x3 <= 341",  // logistics footprint
    "2.63*x0 + 3.17*x1 + 1.13*x2 + 0.77*x3 <= 285",  // logistical capacity
    "0.3*x0 + 3.42*x1 + 0.81*x2 + 3.42*x3 <= 189",  // mobility rating
    "3.88*x0 + 2.23*x1 + 1.59*x2 + 1.29*x3 <= 269",  // offensive capability rating
    "1.1*x0 + 2.89*x1 + 0.04*x2 + 0.66*x3 <= 436"  // fun factor

  ]
}
```

```python
import gurobipy as gp

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

# Create variables
water_purification_units = m.addVar(vtype=gp.GRB.INTEGER, name="x0")
reconnaissance_troops = m.addVar(vtype=gp.GRB.INTEGER, name="x1")
logistics_companies = m.addVar(vtype=gp.GRB.INTEGER, name="x2")
engineer_platoons = m.addVar(vtype=gp.GRB.INTEGER, name="x3")


# Set objective function
m.setObjective(1 * water_purification_units + 8 * reconnaissance_troops + 2 * logistics_companies + 6 * engineer_platoons, gp.GRB.MINIMIZE)

# Add constraints
m.addConstr(2.47 * reconnaissance_troops + 2.31 * logistics_companies >= 76)
m.addConstr(2.47 * reconnaissance_troops + 3.92 * engineer_platoons >= 82)
m.addConstr(2.85 * water_purification_units + 2.47 * reconnaissance_troops >= 38)
m.addConstr(2.31 * logistics_companies + 3.92 * engineer_platoons >= 43)
m.addConstr(2.85 * water_purification_units + 2.31 * logistics_companies + 3.92 * engineer_platoons >= 66)
m.addConstr(2.47 * reconnaissance_troops + 2.31 * logistics_companies + 3.92 * engineer_platoons >= 66)
m.addConstr(2.85 * water_purification_units + 2.31 * logistics_companies + 3.92 * engineer_platoons >= 83)
m.addConstr(2.47 * reconnaissance_troops + 2.31 * logistics_companies + 3.92 * engineer_platoons >= 83)
m.addConstr(2.85 * water_purification_units + 2.47 * reconnaissance_troops + 2.31 * logistics_companies + 3.92 * engineer_platoons >= 83)
m.addConstr(3.17 * reconnaissance_troops + 1.13 * logistics_companies >= 45)
m.addConstr(2.63 * water_purification_units + 0.77 * engineer_platoons >= 25)
m.addConstr(1.13 * logistics_companies + 0.77 * engineer_platoons >= 23)
m.addConstr(2.63 * water_purification_units + 3.17 * reconnaissance_troops + 1.13 * logistics_companies + 0.77 * engineer_platoons >= 23)
m.addConstr(0.81 * logistics_companies + 3.42 * engineer_platoons >= 15)
m.addConstr(0.3 * water_purification_units + 0.81 * logistics_companies >= 29)
m.addConstr(0.3 * water_purification_units + 0.81 * logistics_companies + 3.42 * engineer_platoons >= 40)
m.addConstr(0.3 * water_purification_units + 3.42 * reconnaissance_troops + 0.81 * logistics_companies + 3.42 * engineer_platoons >= 40)
m.addConstr(3.88 * water_purification_units + 2.23 * reconnaissance_troops >= 61)
m.addConstr(1.59 * logistics_companies + 1.29 * engineer_platoons >= 47)
m.addConstr(3.88 * water_purification_units + 2.23 * reconnaissance_troops + 1.59 * logistics_companies + 1.29 * engineer_platoons >= 47)
m.addConstr(0.04 * logistics_companies + 0.66 * engineer_platoons >= 102)
m.addConstr(2.89 * reconnaissance_troops + 0.04 * logistics_companies >= 75)
m.addConstr(1.1 * water_purification_units + 0.66 * engineer_platoons >= 80)
m.addConstr(1.1 * water_purification_units + 2.89 * reconnaissance_troops >= 55)
m.addConstr(1.1 * water_purification_units + 2.89 * reconnaissance_troops + 0.04 * logistics_companies >= 93)
m.addConstr(2.89 * reconnaissance_troops + 0.04 * logistics_companies + 0.66 * engineer_platoons >= 93)
m.addConstr(1.1 * water_purification_units + 2.89 * reconnaissance_troops + 0.04 * logistics_companies >= 65)
m.addConstr(2.89 * reconnaissance_troops + 0.04 * logistics_companies + 0.66 * engineer_platoons >= 65)
m.addConstr(1.1 * water_purification_units + 2.89 * reconnaissance_troops + 0.04 * logistics_companies + 0.66 * engineer_platoons >= 65)
m.addConstr(-2 * water_purification_units + 4 * engineer_platoons >= 0)
m.addConstr(9 * reconnaissance_troops - 8 * logistics_companies >= 0)
m.addConstr(2.31 * logistics_companies + 3.92 * engineer_platoons <= 149)
m.addConstr(2.85 * water_purification_units + 2.47 * reconnaissance_troops <= 86)
m.addConstr(2.85 * water_purification_units + 3.92 * engineer_platoons <= 217)
m.addConstr(2.63 * water_purification_units + 1.13 * logistics_companies <= 181)
m.addConstr(1.13 * logistics_companies + 0.77 * engineer_platoons <= 218)
m.addConstr(3.17 * reconnaissance_troops + 1.13 * logistics_companies <= 191)
m.addConstr(0.3 * water_purification_units + 3.42 * reconnaissance_troops + 0.81 * logistics_companies <= 184)
m.addConstr(0.3 * water_purification_units + 0.81 * logistics_companies + 3.42 * engineer_platoons <= 168)
m.addConstr(1.1 * water_purification_units + 0.66 * engineer_platoons <= 298)
m.addConstr(2.89 * reconnaissance_troops + 0.04 * logistics_companies <= 220)
m.addConstr(1.1 * water_purification_units + 2.89 * reconnaissance_troops + 0.66 * engineer_platoons <= 339)

# Resource Constraints
m.addConstr(2.85 * water_purification_units + 2.47 * reconnaissance_troops + 2.31 * logistics_companies + 3.92 * engineer_platoons <= 341)
m.addConstr(2.63 * water_purification_units + 3.17 * reconnaissance_troops + 1.13 * logistics_companies + 0.77 * engineer_platoons <= 285)
m.addConstr(0.3 * water_purification_units + 3.42 * reconnaissance_troops + 0.81 * logistics_companies + 3.42 * engineer_platoons <= 189)
m.addConstr(3.88 * water_purification_units + 2.23 * reconnaissance_troops + 1.59 * logistics_companies + 1.29 * engineer_platoons <= 269)
m.addConstr(1.1 * water_purification_units + 2.89 * reconnaissance_troops + 0.04 * logistics_companies + 0.66 * engineer_platoons <= 436)


# Optimize model
m.optimize()

# Print results
if m.status == gp.GRB.OPTIMAL:
    print('Obj: %g' % m.objVal)
    for v in m.getVars():
        print('%s %g' % (v.varName, v.x))
elif m.status == gp.GRB.INFEASIBLE:
    print("The model is infeasible.")
else:
    print("Optimization ended with status:", m.status)

```
