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

Let's denote:
- \(S\) as the number of single rooms.
- \(C\) as the number of couple's rooms.

The profit made from each single room is $200, and from each couple's room is $1200. The objective is to maximize the total profit.

Given constraints are:
1. The total number of rooms is at most 800: \(S + C \leq 800\).
2. At least 125 rooms are reserved for single rooms: \(S \geq 125\).
3. A minimum of twice as many passengers prefer to travel as a couple (and thus stay in a couple's room) than stay in a single's room. Since each couple's room accommodates two passengers and each single room accommodates one passenger, this translates to: \(2C \geq 2S\), or simply \(C \geq S\).

The objective function to maximize is the total profit: \(200S + 1200C\).

Here is how we can represent this problem in Gurobi code:

```python
from gurobipy import *

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

# Define variables
S = m.addVar(vtype=GRB.INTEGER, name="single_rooms")
C = m.addVar(vtype=GRB.INTEGER, name="couple_rooms")

# Define the objective function
m.setObjective(200*S + 1200*C, GRB.MAXIMIZE)

# Add constraints
m.addConstr(S + C <= 800, "total_rooms")
m.addConstr(S >= 125, "min_single_rooms")
m.addConstr(C >= S, "couple_vs_single")

# Optimize model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print("Maximum Profit:", m.objVal)
    print("Single Rooms:", S.x)
    print("Couple Rooms:", C.x)
else:
    print("Model is infeasible")
```