To solve this optimization problem, we first need to define our decision variables and the constraints based on the given information. Let's denote:

- \(L\) as the number of long-term cruise tickets sold.
- \(W\) as the number of week-long cruise tickets sold.

The objective is to maximize profit. The profit from selling long-term cruise tickets is $500 per ticket, and the profit from selling week-long cruise tickets is $150 per ticket. Thus, our objective function can be written as:

\[ \text{Maximize: } 500L + 150W \]

Now, let's consider the constraints:

1. **Total Capacity Constraint**: The total number of people (from both types of tickets) cannot exceed 1500.
   \[ L + W \leq 1500 \]

2. **Minimum Long-term Tickets Constraint**: There must be at least 35 long-term cruise tickets available.
   \[ L \geq 35 \]

3. **Preference Ratio Constraint**: At least 4 times as many people prefer to buy week-long cruise tickets than long-term cruise tickets.
   \[ W \geq 4L \]

Given these constraints and the objective function, we can now formulate this problem in Gurobi using Python.

```python
from gurobipy import *

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

# Define decision variables
L = m.addVar(vtype=GRB.INTEGER, name="Long-term_Tickets")
W = m.addVar(vtype=GRB.INTEGER, name="Week-long_Tickets")

# Set the objective function: Maximize profit
m.setObjective(500*L + 150*W, GRB.MAXIMIZE)

# Add constraints
m.addConstr(L + W <= 1500, "Total_Capacity")
m.addConstr(L >= 35, "Minimum_Long-term_Tickets")
m.addConstr(W >= 4*L, "Preference_Ratio")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Long-term Tickets: {L.x}")
    print(f"Week-long Tickets: {W.x}")
    print(f"Maximum Profit: ${500*L.x + 150*W.x}")
else:
    print("No optimal solution found")
```