To solve this problem, we first need to define the decision variables and the objective function. Let's denote the number of luxury tickets as \(L\) and the number of regular tickets as \(R\). The objective is to maximize profit, with a profit of $500 per luxury ticket and $300 per regular ticket.

The constraints given are:
1. The total number of passengers (luxury and regular tickets combined) cannot exceed 500.
2. At least 100 luxury tickets must be sold.
3. The number of regular tickets sold must be at least twice the number of luxury tickets sold.

Mathematically, these constraints can be represented as:
- \(L + R \leq 500\)
- \(L \geq 100\)
- \(R \geq 2L\)

The objective function to maximize profit (\(P\)) is:
- \(P = 500L + 300R\)

Given these definitions, we can now translate this problem into Gurobi code in Python. 

```python
from gurobipy import *

# Create a new model
m = Model("Cruise Ship Ticket Optimization")

# Define the decision variables
L = m.addVar(lb=0, vtype=GRB.INTEGER, name="Luxury_Tickets")
R = m.addVar(lb=0, vtype=GRB.INTEGER, name="Regular_Tickets")

# Set the objective function to maximize profit
m.setObjective(500*L + 300*R, GRB.MAXIMIZE)

# Add constraints
m.addConstr(L + R <= 500, "Total_Passengers")
m.addConstr(L >= 100, "Minimum_Luxury_Tickets")
m.addConstr(R >= 2*L, "Regular_vs_Luxury_Tickets")

# Optimize the model
m.optimize()

# Print out the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Luxury Tickets: {L.x}")
    print(f"Regular Tickets: {R.x}")
    print(f"Maximum Profit: ${500*L.x + 300*R.x}")
else:
    print("No optimal solution found")
```