To solve this optimization problem, we first need to define the decision variables and the objective function. Let's denote the number of adult tickets sold as \(A\) and the number of children's tickets sold as \(C\). The profit made on each adult ticket is $3, and on each children's ticket is $1. We want to maximize the total profit, which can be represented by the objective function: \(3A + C\).

The constraints given are:
1. The bus can carry at most 80 people: \(A + C \leq 80\).
2. At least 15 tickets are reserved for children: \(C \geq 15\).
3. At least 3 times as many tickets sold are adult tickets than children's tickets: \(A \geq 3C\).

We will use the Gurobi Python API to model and solve this linear programming problem.

```python
from gurobipy import *

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

# Define the decision variables
A = m.addVar(name='Adult_Tickets', lb=0, ub=GRB.INFINITY, vtype=GRB.INTEGER)
C = m.addVar(name='Children_Tickets', lb=0, ub=GRB.INFINITY, vtype=GRB.INTEGER)

# Set the objective function to maximize profit
m.setObjective(3*A + C, GRB.MAXIMIZE)

# Add constraints
m.addConstr(A + C <= 80, name='Total_Capacity')
m.addConstr(C >= 15, name='Children_Tickets_Minimum')
m.addConstr(A >= 3*C, name='Adult_vs_Children_Tickets')

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print('Optimal solution found:')
    print(f'Adult Tickets: {A.x}')
    print(f'Children Tickets: {C.x}')
    print(f'Total Profit: {3*A.x + C.x}')
else:
    print('No optimal solution found')

```