To solve this linear programming optimization problem, we first need to define the decision variables, objective function, and constraints based on the given information.

Let's denote:
- \(x\) as the number of crabs processed,
- \(y\) as the number of lobsters processed.

The objective is to maximize profit. The profit per crab is $14, and the profit per lobster is $18. Therefore, the objective function can be written as:
\[ \text{Maximize:} \quad 14x + 18y \]

The constraints are based on the time available for cleaning and shelling:
1. Cleaning time constraint: Each crab takes 4 minutes of cleaning, and each lobster takes 5 minutes of cleaning. The total cleaning time available is 400 minutes.
\[ 4x + 5y \leq 400 \]
2. Shelling time constraint: Each crab takes 15 minutes of shelling, and each lobster takes 12 minutes of shelling. The total shelling time available is 900 minutes.
\[ 15x + 12y \leq 900 \]

Additionally, \(x\) and \(y\) must be non-negative since they represent the number of crabs and lobsters.

Now, let's translate this problem into Gurobi code in Python:

```python
from gurobipy import *

# Create a new model
m = Model("Crab_and_Lobster_Processing")

# Define variables
x = m.addVar(name="crabs", vtype=GRB.INTEGER, lb=0)  # Number of crabs
y = m.addVar(name="lobsters", vtype=GRB.INTEGER, lb=0)  # Number of lobsters

# Objective function: Maximize profit
m.setObjective(14*x + 18*y, GRB.MAXIMIZE)

# Constraints
# 1. Cleaning time constraint
m.addConstr(4*x + 5*y <= 400, name="cleaning_time")

# 2. Shelling time constraint
m.addConstr(15*x + 12*y <= 900, name="shelling_time")

# Optimize model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution: x = {x.x}, y = {y.x}")
    print(f"Maximum profit: ${14*x.x + 18*y.x}")
else:
    print("No optimal solution found")
```