To solve the given optimization problem, we first need to convert the natural language description into a symbolic representation. Let's define:

- $x_1$ as the number of luxury tickets sold,
- $x_2$ as the number of regular tickets sold.

The objective function is to maximize profit. Given that a profit of $500 is made per luxury ticket and a profit of $300 is made per regular ticket, the objective function can be represented algebraically as:

\[ \text{Maximize:} \quad 500x_1 + 300x_2 \]

The constraints based on the problem description are:

1. The cruise ship can carry at most 500 passengers:
\[ x_1 + x_2 \leq 500 \]
2. At least 100 luxury tickets must be sold:
\[ x_1 \geq 100 \]
3. At least twice as many passengers prefer to buy regular tickets than luxury tickets:
\[ x_2 \geq 2x_1 \]

Non-negativity constraints are also implied for both $x_1$ and $x_2$, since the number of tickets cannot be negative:

\[ x_1, x_2 \geq 0 \]

Thus, in symbolic representation, our problem can be summarized as:

```json
{
    'sym_variables': [('x1', 'number of luxury tickets sold'), ('x2', 'number of regular tickets sold')],
    'objective_function': '500*x1 + 300*x2',
    'constraints': ['x1 + x2 <= 500', 'x1 >= 100', 'x2 >= 2*x1', 'x1 >= 0', 'x2 >= 0']
}
```

Now, let's implement this optimization problem using Gurobi in Python:

```python
from gurobipy import *

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

# Define the variables
x1 = m.addVar(lb=0, vtype=GRB.INTEGER, name="luxury_tickets")
x2 = m.addVar(lb=0, vtype=GRB.INTEGER, name="regular_tickets")

# Set the objective function
m.setObjective(500*x1 + 300*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(x1 + x2 <= 500, "total_passengers")
m.addConstr(x1 >= 100, "min_luxury_tickets")
m.addConstr(x2 >= 2*x1, "regular_vs_luxury")

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Luxury tickets: {x1.x}")
    print(f"Regular tickets: {x2.x}")
    print(f"Total profit: ${500*x1.x + 300*x2.x}")
else:
    print("No optimal solution found.")
```