## Problem Description and Formulation

The steel company produces 120 tons of iron ore and 70 tons of zinc ore each month. The goal is to determine the optimal production levels of three types of vessels - general purpose vessels, pharmaceutical vessels, and pressure vessels - to maximize profit. The production requirements and profits for each type of vessel are given.

## Decision Variables

Let \(x_1\), \(x_2\), and \(x_3\) be the number of sets of general purpose vessels, pharmaceutical vessels, and pressure vessels to be produced, respectively.

## Objective Function

The profit per set from selling the vessels are $2000, $3000, and $4500 for the general purpose, pharmaceutical, and pressure vessels, respectively. The objective is to maximize the total profit:

\[ \text{Maximize:} \quad 2000x_1 + 3000x_2 + 4500x_3 \]

## Constraints

1. **Iron Ore Constraint:** 3.5 tons of iron ore are required for 1 set of general purpose vessels, 4 tons for 1 set of pharmaceutical vessels, and 2 tons for 1 set of pressure vessels. The total available iron ore is 120 tons.

\[ 3.5x_1 + 4x_2 + 2x_3 \leq 120 \]

2. **Zinc Ore Constraint:** 2 tons of zinc ore are required for 1 set of general purpose vessels, 5 tons for 1 set of pharmaceutical vessels, and 3.5 tons for 1 set of pressure vessels. The total available zinc ore is 70 tons.

\[ 2x_1 + 5x_2 + 3.5x_3 \leq 70 \]

3. **Non-Negativity Constraints:** The number of sets of vessels to be produced cannot be negative.

\[ x_1 \geq 0, \quad x_2 \geq 0, \quad x_3 \geq 0 \]

## Gurobi Code

```python
import gurobipy as gp

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

# Decision variables
x1 = model.addVar(name="general_purpose_vessels", lb=0, vtype=gp.GRB.CONTINUOUS)
x2 = model.addVar(name="pharmaceutical_vessels", lb=0, vtype=gp.GRB.CONTINUOUS)
x3 = model.addVar(name="pressure_vessels", lb=0, vtype=gp.GRB.CONTINUOUS)

# Objective function
model.setObjective(2000*x1 + 3000*x2 + 4500*x3, gp.GRB.MAXIMIZE)

# Constraints
model.addConstr(3.5*x1 + 4*x2 + 2*x3 <= 120, name="iron_ore_constraint")
model.addConstr(2*x1 + 5*x2 + 3.5*x3 <= 70, name="zinc_ore_constraint")

# Solve the model
model.optimize()

# Print the results
if model.status == gp.GRB.OPTIMAL:
    print("Optimal Solution:")
    print(f"General Purpose Vessels: {x1.varValue}")
    print(f"Pharmaceutical Vessels: {x2.varValue}")
    print(f"Pressure Vessels: {x3.varValue}")
    print(f"Max Profit: {model.objVal}")
else:
    print("The model is infeasible or unbounded.")
```