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

- $R$ as the number of regular rooms.
- $P$ as the number of premium rooms.

The profit made from each type of room is given as:
- Profit per regular room: $100
- Profit per premium room: $500

The hotel has a total of 500 rooms, so we have our first constraint:
\[ R + P \leq 500 \]

It's also given that the hotel reserves at least 100 rooms for regular rooms, giving us another constraint:
\[ R \geq 100 \]

Furthermore, there's a preference constraint where at least twice as many customers prefer to stay in a premium room than in a regular room. This translates to:
\[ P \geq 2R \]

Our objective is to maximize the profit, which can be represented by the function:
\[ \text{Maximize:} \quad 100R + 500P \]

Given these constraints and the objective function, we aim to find the optimal values of $R$ and $P$ that maximize the hotel's profit.

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

```python
from gurobipy import *

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

# Define variables
R = m.addVar(vtype=GRB.INTEGER, name="Regular_Rooms")
P = m.addVar(vtype=GRB.INTEGER, name="Premium_Rooms")

# Constraints
m.addConstr(R + P <= 500, "Total_Rooms")
m.addConstr(R >= 100, "Minimum_Regular_Rooms")
m.addConstr(P >= 2 * R, "Preference_Constraint")

# Objective function
m.setObjective(100 * R + 500 * P, GRB.MAXIMIZE)

# Solve the model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Regular Rooms: {R.x}")
    print(f"Premium Rooms: {P.x}")
    print(f"Maximum Profit: {m.objVal}")
else:
    print("No optimal solution found")

```