```json
{
  "sym_variables": [
    ("x0", "3D printers"),
    ("x1", "paper clips"),
    ("x2", "office chairs"),
    ("x3", "lanyards")
  ],
  "objective_function": "2.05 * x0 + 6.16 * x1 + 8.22 * x2 + 8.27 * x3",
  "constraints": [
    "16 * x0 + 15 * x1 + 12 * x2 + 2 * x3 <= 192",
    "1 * x0 + 1 * x1 + 12 * x2 + 17 * x3 <= 129",
    "16 * x0 + 12 * x2 >= 47",
    "15 * x1 + 12 * x2 >= 19",
    "16 * x0 + 15 * x1 + 2 * x3 >= 39",
    "16 * x0 + 15 * x1 + 12 * x2 + 2 * x3 >= 39",
    "1 * x0 + 12 * x2 >= 30",
    "1 * x0 + 17 * x3 >= 29",
    "1 * x1 + 17 * x3 >= 16",
    "1 * x0 + 1 * x1 + 12 * x2 + 17 * x3 >= 16",
    "9 * x0 - 2 * x1 >= 0",
    "2 * x0 - 1 * x2 >= 0",
    "16 * x0 + 12 * x2 <= 182",
    "16 * x0 + 15 * x1 <= 126",
    "12 * x2 + 2 * x3 <= 137",
    "15 * x1 + 2 * x3 <= 118",
    "15 * x1 + 12 * x2 <= 190",
    "16 * x0 + 15 * x1 + 2 * x3 <= 140",
    "1 * x0 + 17 * x3 <= 42",
    "1 * x1 + 17 * x3 <= 114",
    "1 * x0 + 1 * x1 <= 112",
    "1 * x1 + 12 * x2 + 17 * x3 <= 104"
  ]
}
```

```python
import gurobipy as gp

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

# Create variables
x = m.addVars(4, vtype=gp.GRB.INTEGER, name=["3D_printers", "paper_clips", "office_chairs", "lanyards"])

# Set objective function
m.setObjective(2.05 * x[0] + 6.16 * x[1] + 8.22 * x[2] + 8.27 * x[3], gp.GRB.MINIMIZE)

# Add constraints
m.addConstr(16 * x[0] + 15 * x[1] + 12 * x[2] + 2 * x[3] <= 192, "storage_space")
m.addConstr(1 * x[0] + 1 * x[1] + 12 * x[2] + 17 * x[3] <= 129, "workplace_safety")
m.addConstr(16 * x[0] + 12 * x[2] >= 47, "storage_printers_chairs")
m.addConstr(15 * x[1] + 12 * x[2] >= 19, "storage_clips_chairs")
m.addConstr(16 * x[0] + 15 * x[1] + 2 * x[3] >= 39, "storage_printers_clips_lanyards")
m.addConstr(16 * x[0] + 15 * x[1] + 12 * x[2] + 2 * x[3] >= 39, "storage_all")
m.addConstr(1 * x[0] + 12 * x[2] >= 30, "safety_printers_chairs")
m.addConstr(1 * x[0] + 17 * x[3] >= 29, "safety_printers_lanyards")
m.addConstr(1 * x[1] + 17 * x[3] >= 16, "safety_clips_lanyards")
m.addConstr(1 * x[0] + 1 * x[1] + 12 * x[2] + 17 * x[3] >= 16, "safety_all")
m.addConstr(9 * x[0] - 2 * x[1] >= 0, "printers_clips_relation1")
m.addConstr(2 * x[0] - 1 * x[2] >= 0, "printers_chairs_relation")
m.addConstr(16 * x[0] + 12 * x[2] <= 182, "storage_printers_chairs_max")
m.addConstr(16 * x[0] + 15 * x[1] <= 126, "storage_printers_clips_max")
m.addConstr(12 * x[2] + 2 * x[3] <= 137, "storage_chairs_lanyards_max")
m.addConstr(15 * x[1] + 2 * x[3] <= 118, "storage_clips_lanyards_max")
m.addConstr(15 * x[1] + 12 * x[2] <= 190, "storage_clips_chairs_max")
m.addConstr(16 * x[0] + 15 * x[1] + 2 * x[3] <= 140, "storage_printers_clips_lanyards_max")
m.addConstr(1 * x[0] + 17 * x[3] <= 42, "safety_printers_lanyards_max")
m.addConstr(1 * x[1] + 17 * x[3] <= 114, "safety_clips_lanyards_max")
m.addConstr(1 * x[0] + 1 * x[1] <= 112, "safety_printers_clips_max")
m.addConstr(1 * x[1] + 12 * x[2] + 17 * x[3] <= 104, "safety_clips_chairs_lanyards_max")


# Optimize model
m.optimize()

# Print solution
if m.status == gp.GRB.OPTIMAL:
    for v in m.getVars():
        print(f"{v.varName}: {v.x}")
    print(f"Obj: {m.objVal}")
elif m.status == gp.GRB.INFEASIBLE:
    print("The problem is infeasible.")
```
