To solve the optimization problem described, we first need to define the decision variables and the objective function, as well as any constraints that apply.

Let's denote:
- \(x\) as the number of trips using freight trains,
- \(y\) as the number of trips using cargo ships.

The objective is to maximize the total number of fish transported. Given that each freight train can take 2000 fish and each cargo ship can take 7000 fish, the objective function can be formulated as:
\[ \text{Maximize} \quad 2000x + 7000y \]

There are two main constraints:
1. The budget constraint: The total cost must not exceed $1500. Given that the cost per trip for freight trains is $100 and for cargo ships is $180, we have:
\[ 100x + 180y \leq 1500 \]
2. The constraint on the number of trips: The number of freight train trips must be less than the number of cargo ship trips, which gives us:
\[ x < y \]

However, since \(x\) and \(y\) represent numbers of trips, they should also be non-negative integers. For simplicity in solving as a linear program, we'll consider them as continuous variables but keep in mind that in practice, the solution would need to be rounded to the nearest whole number if it's not already integer.

To handle the inequality \(x < y\), we can introduce a small positive value \(\epsilon\) to ensure \(x\) is strictly less than \(y\), but since our main goal here is to maximize fish transportation under given constraints and we are solving this as an LP, we focus on the budget and capacity constraints primarily.

Here's how we can implement this problem using Gurobi in Python:

```python
from gurobipy import *

# Create a model
m = Model("Fish_Transportation")

# Define decision variables
x = m.addVar(vtype=GRB.CONTINUOUS, name="freight_trains")
y = m.addVar(vtype=GRB.CONTINUOUS, name="cargo_ships")

# Objective function: Maximize the total number of fish transported
m.setObjective(2000*x + 7000*y, GRB.MAXIMIZE)

# Constraint 1: Budget constraint
m.addConstr(100*x + 180*y <= 1500, "budget_constraint")

# Constraint 2: Number of freight train trips is less than cargo ship trips
m.addConstr(x <= y - 0.001, "trip_constraint")  # Using a small epsilon value

# Solve the model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print(f"Maximum fish transported: {m.objVal}")
    print(f"Number of freight train trips: {x.x}")
    print(f"Number of cargo ship trips: {y.x}")
else:
    print("Model is infeasible")
```