To solve this optimization problem, we first need to convert the natural language description into a symbolic representation. Let's denote the number of burgers as $x_1$ and the number of sandwiches as $x_2$. 

The objective function is to maximize profit, which can be represented algebraically as $4.5x_1 + 5x_2$, since the profit per burger is $4.5 and the profit per sandwich is $5.

The constraints based on the description are:
- The restaurant must sell at least 100 burgers: $x_1 \geq 100$
- The restaurant must sell at least 80 sandwiches: $x_2 \geq 80$
- They can make at most 120 burgers: $x_1 \leq 120$
- They can make at most 100 sandwiches: $x_2 \leq 100$
- They can cook at most 200 items total: $x_1 + x_2 \leq 200$

Thus, the symbolic representation of the problem is:
```json
{
    'sym_variables': [('x1', 'burgers'), ('x2', 'sandwiches')],
    'objective_function': '4.5*x1 + 5*x2',
    'constraints': ['x1 >= 100', 'x2 >= 80', 'x1 <= 120', 'x2 <= 100', 'x1 + x2 <= 200']
}
```

To find the solution, we will use Gurobi, a linear programming solver, in Python. Here's how to set up and solve this problem using Gurobi:

```python
from gurobipy import *

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

# Add variables
x1 = m.addVar(vtype=GRB.CONTINUOUS, name="burgers")
x2 = m.addVar(vtype=GRB.CONTINUOUS, name="sandwiches")

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

# Add constraints
m.addConstr(x1 >= 100, "min_burgers")
m.addConstr(x2 >= 80, "min_sandwiches")
m.addConstr(x1 <= 120, "max_burgers")
m.addConstr(x2 <= 100, "max_sandwiches")
m.addConstr(x1 + x2 <= 200, "total_items")

# Optimize the model
m.optimize()

# Print the solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Burgers: {x1.x}")
    print(f"Sandwiches: {x2.x}")
    print(f"Maximum Profit: {m.objVal}")
else:
    print("No optimal solution found")
```