```json
{
  "sym_variables": [
    ("x0", "security engineers"),
    ("x1", "system administrators"),
    ("x2", "network administrators"),
    ("x3", "pen testers")
  ],
  "objective_function": "2*x0 + 1*x1 + 7*x2 + 6*x3",
  "constraints": [
    "1*x0 + 11*x1 >= 13",
    "1*x0 + 7*x3 >= 15",
    "5*x2 + 7*x3 >= 15",
    "1*x0 + 11*x1 + 5*x2 + 7*x3 >= 15",
    "1*x2 + 7*x3 >= 15",
    "4*x1 + 1*x2 >= 20",
    "9*x0 + 1*x2 >= 16",
    "9*x0 + 1*x2 + 7*x3 >= 22",
    "9*x0 + 4*x1 + 1*x2 + 7*x3 >= 22",
    "14*x0 + 12*x1 >= 13",
    "14*x0 + 4*x2 >= 11",
    "12*x1 + 4*x3 >= 11",
    "14*x0 + 4*x3 >= 21",
    "14*x0 + 12*x1 + 4*x3 >= 18",
    "12*x1 + 4*x2 + 4*x3 >= 18",
    "14*x0 + 12*x1 + 4*x3 >= 18",
    "12*x1 + 4*x2 + 4*x3 >= 18",
    "14*x0 + 12*x1 + 4*x2 + 4*x3 >= 18",
    "10*x1 - 7*x3 >= 0",
    "5*x2 - 6*x3 >= 0",
    "5*x2 + 7*x3 <= 104",
    "1*x0 + 7*x3 <= 54",
    "1*x0 + 11*x1 + 5*x2 <= 49",
    "11*x1 + 5*x2 + 7*x3 <= 75",
    "9*x0 + 7*x3 <= 34",
    "9*x0 + 4*x1 + 7*x3 <= 36",
    "12*x1 + 4*x3 <= 74",
    "12*x1 + 4*x2 <= 70",
    "x0 <= 113/1",
    "x1 <= 99/4",
    "x2 <= 88/4",
    "x3 <= 113/7"

  ]
}
```

```python
import gurobipy as gp

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

# Create variables
security_engineers = m.addVar(vtype=gp.GRB.INTEGER, name="security_engineers")
system_administrators = m.addVar(vtype=gp.GRB.INTEGER, name="system_administrators")
network_administrators = m.addVar(vtype=gp.GRB.INTEGER, name="network_administrators")
pen_testers = m.addVar(vtype=gp.GRB.INTEGER, name="pen_testers")


# Set objective function
m.setObjective(2*security_engineers + 1*system_administrators + 7*network_administrators + 6*pen_testers, gp.GRB.MINIMIZE)

# Add constraints
m.addConstr(1*security_engineers + 11*system_administrators >= 13)
m.addConstr(1*security_engineers + 7*pen_testers >= 15)
m.addConstr(5*network_administrators + 7*pen_testers >= 15)
m.addConstr(1*security_engineers + 11*system_administrators + 5*network_administrators + 7*pen_testers >= 15)
m.addConstr(1*network_administrators + 7*pen_testers >= 15)
m.addConstr(4*system_administrators + 1*network_administrators >= 20)
m.addConstr(9*security_engineers + 1*network_administrators >= 16)
m.addConstr(9*security_engineers + 1*network_administrators + 7*pen_testers >= 22)
m.addConstr(9*security_engineers + 4*system_administrators + 1*network_administrators + 7*pen_testers >= 22)
m.addConstr(14*security_engineers + 12*system_administrators >= 13)
m.addConstr(14*security_engineers + 4*network_administrators >= 11)
m.addConstr(12*system_administrators + 4*pen_testers >= 11)
m.addConstr(14*security_engineers + 4*pen_testers >= 21)
m.addConstr(14*security_engineers + 12*system_administrators + 4*pen_testers >= 18)
m.addConstr(12*system_administrators + 4*network_administrators + 4*pen_testers >= 18)
m.addConstr(14*security_engineers + 12*system_administrators + 4*pen_testers >= 18)
m.addConstr(12*system_administrators + 4*network_administrators + 4*pen_testers >= 18)
m.addConstr(14*security_engineers + 12*system_administrators + 4*network_administrators + 4*pen_testers >= 18)
m.addConstr(10*system_administrators - 7*pen_testers >= 0)
m.addConstr(5*network_administrators - 6*pen_testers >= 0)
m.addConstr(5*network_administrators + 7*pen_testers <= 104)
m.addConstr(1*security_engineers + 7*pen_testers <= 54)
m.addConstr(1*security_engineers + 11*system_administrators + 5*network_administrators <= 49)
m.addConstr(11*system_administrators + 5*network_administrators + 7*pen_testers <= 75)
m.addConstr(9*security_engineers + 7*pen_testers <= 34)
m.addConstr(9*security_engineers + 4*system_administrators + 7*pen_testers <= 36)
m.addConstr(12*system_administrators + 4*pen_testers <= 74)
m.addConstr(12*system_administrators + 4*network_administrators <= 70)


# Resource Constraints
m.addConstr(security_engineers <= 113)
m.addConstr(system_administrators <= 24)
m.addConstr(network_administrators <= 22)
m.addConstr(pen_testers <= 16)



# Optimize model
m.optimize()

# Print solution
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 %d" % m.status)

```