## Problem Description and Formulation

The problem is a linear programming optimization problem. The goal is to maximize profit by determining the number of regular rate tickets and concession rate tickets to sell, given certain constraints.

### Decision Variables

- $x_r$: Number of regular rate tickets sold
- $x_c$: Number of concession rate tickets sold

### Objective Function

The profit made on each regular rate ticket is $2, and on each concession rate ticket is $0.50. The objective is to maximize the total profit:

Maximize: $2x_r + 0.50x_c$

### Constraints

1. **Capacity Constraint**: The ferry can carry at most 120 people.
   - $x_r + x_c \leq 120$

2. **Concession Rate Tickets Reservation**: At least 15 tickets are reserved for concession rate.
   - $x_c \geq 15$

3. **Regular vs. Concession Rate Tickets Ratio**: At least 5 times as many tickets sold are regular rate tickets than concession rate tickets.
   - $x_r \geq 5x_c$

4. **Non-Negativity Constraints**: The number of tickets cannot be negative.
   - $x_r \geq 0, x_c \geq 0$

Given that $x_r$ and $x_c$ must be integers (as they represent the number of tickets), this problem is technically an integer programming problem. However, we will first approach it as a linear programming problem and then consider how to handle the integer requirement.

## Gurobi Code

```python
import gurobi

def solve_ferry_ticket_problem():
    # Create a new model
    m = gurobi.Model()

    # Decision variables
    x_r = m.addVar(name="regular_tickets", lb=0, vtype=gurobi.GRB.INTEGER)
    x_c = m.addVar(name="concession_tickets", lb=0, vtype=gurobi.GRB.INTEGER)

    # Objective function: Maximize profit
    m.setObjective(2 * x_r + 0.5 * x_c, gurobi.GRB.MAXIMIZE)

    # Constraints
    m.addConstr(x_r + x_c <= 120, name="capacity_constraint")
    m.addConstr(x_c >= 15, name="concession_reservation")
    m.addConstr(x_r >= 5 * x_c, name="regular_concession_ratio")

    # Solve the problem
    m.optimize()

    if m.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal Solution: Regular Tickets = {x_r.varValue}, Concession Tickets = {x_c.varValue}")
        print(f"Max Profit: {m.objVal}")
    else:
        print("The problem is infeasible")

solve_ferry_ticket_problem()
```

This code directly addresses the problem by formulating it as an integer programming problem in Gurobi, given the integer nature of the decision variables (number of tickets). It sets up the objective function and constraints as described and then solves the problem, outputting the optimal solution if one exists.