## Step 1: Define the symbolic representation of the variables
The variables are 'cheeseburgers', 'sashimi', and 'milkshakes', which can be represented symbolically as $x_0$, $x_1$, and $x_2$ respectively.

## Step 2: Convert the objective function into symbolic notation
The objective function to minimize is $5x_0 + 5x_1 + 3x_2$.

## Step 3: Define the constraints in symbolic notation
The constraints given are:
- $3x_0 \leq 57$
- $2x_0 \leq 47$
- $9x_1 \leq 57$
- $10x_1 \leq 47$
- $6x_2 \leq 57$
- $8x_2 \leq 47$
- $3x_0 + 6x_2 \geq 19$
- $3x_0 + 9x_1 \geq 14$
- $3x_0 + 9x_1 + 6x_2 \geq 14$
- $2x_0 + 8x_2 \geq 5$
- $10x_1 + 8x_2 \geq 5$
- $2x_0 + 10x_1 \geq 6$
- $2x_0 + 10x_1 + 8x_2 \geq 6$
- $5x_0 - 4x_1 \geq 0$
- $-8x_1 + x_2 \geq 0$
- $-9x_0 + 8x_2 \geq 0$
- $3x_0 + 9x_1 + 6x_2 \leq 39$
- $10x_1 + 8x_2 \leq 41$
- $x_2$ is an integer.

## 4: Create the symbolic representation of the problem
```json
{
'sym_variables': [('x0', 'cheeseburgers'), ('x1', 'sashimi'), ('x2', 'milkshakes')],
'objective_function': '5*x0 + 5*x1 + 3*x2',
'constraints': [
    '3*x0 <= 57',
    '2*x0 <= 47',
    '9*x1 <= 57',
    '10*x1 <= 47',
    '6*x2 <= 57',
    '8*x2 <= 47',
    '3*x0 + 6*x2 >= 19',
    '3*x0 + 9*x1 >= 14',
    '3*x0 + 9*x1 + 6*x2 >= 14',
    '2*x0 + 8*x2 >= 5',
    '10*x1 + 8*x2 >= 5',
    '2*x0 + 10*x1 >= 6',
    '2*x0 + 10*x1 + 8*x2 >= 6',
    '5*x0 - 4*x1 >= 0',
    '-8*x1 + x2 >= 0',
    '-9*x0 + 8*x2 >= 0',
    '3*x0 + 9*x1 + 6*x2 <= 39',
    '10*x1 + 8*x2 <= 41'
]
}
```

## 5: Write the Gurobi code to solve the optimization problem
```python
import gurobi

def solve_optimization_problem():
    model = gurobi.Model()
    
    # Define variables
    x0 = model.addVar(name="cheeseburgers", lb=0)  # Fractional amount allowed
    x1 = model.addVar(name="sashimi", lb=0)      # Fractional amount allowed
    x2 = model.addVar(name="milkshakes", lb=0, integrality=gurobi.GRB.INTEGER)  # Integer amount required
    
    # Objective function
    model.setObjective(5*x0 + 5*x1 + 3*x2, gurobi.GRB.MINIMIZE)
    
    # Constraints
    model.addConstr(3*x0 <= 57)
    model.addConstr(2*x0 <= 47)
    model.addConstr(9*x1 <= 57)
    model.addConstr(10*x1 <= 47)
    model.addConstr(6*x2 <= 57)
    model.addConstr(8*x2 <= 47)
    model.addConstr(3*x0 + 6*x2 >= 19)
    model.addConstr(3*x0 + 9*x1 >= 14)
    model.addConstr(3*x0 + 9*x1 + 6*x2 >= 14)
    model.addConstr(2*x0 + 8*x2 >= 5)
    model.addConstr(10*x1 + 8*x2 >= 5)
    model.addConstr(2*x0 + 10*x1 >= 6)
    model.addConstr(2*x0 + 10*x1 + 8*x2 >= 6)
    model.addConstr(5*x0 - 4*x1 >= 0)
    model.addConstr(-8*x1 + x2 >= 0)
    model.addConstr(-9*x0 + 8*x2 >= 0)
    model.addConstr(3*x0 + 9*x1 + 6*x2 <= 39)
    model.addConstr(10*x1 + 8*x2 <= 41)
    
    # Optimize
    model.optimize()
    
    # Print solution
    if model.status == gurobi.GRB.OPTIMAL:
        print("Optimal Solution:")
        print(f"Cheeseburgers: {x0.varValue}")
        print(f"Sashimi: {x1.varValue}")
        print(f"Milkshakes: {x2.varValue}")
        print(f"Objective: {model.objVal}")
    else:
        print("No optimal solution found.")

solve_optimization_problem()
```