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

- $R$ as the number of red umbrellas displayed and sold.
- $B$ as the number of blue umbrellas displayed and sold.

The objective is to maximize profit, with a profit of $3 for each red umbrella and $5 for each blue umbrella. The total profit can be represented as $3R + 5B$.

Constraints:

1. The total number of umbrellas cannot exceed 100: $R + B \leq 100$.
2. At least 10 umbrellas displayed must be red: $R \geq 10$.
3. At least 4 times as many customers prefer blue umbrellas to red umbrellas, implying the number of blue umbrellas should be at least 4 times the number of red umbrellas: $B \geq 4R$.

Given these constraints and the objective function, we aim to find the values of $R$ and $B$ that maximize profit while satisfying all conditions.

Now, let's translate this problem into Gurobi code in Python:

```python
from gurobipy import *

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

# Define variables
R = m.addVar(vtype=GRB.INTEGER, name="Red_Umbrellas")
B = m.addVar(vtype=GRB.INTEGER, name="Blue_Umbrellas")

# Set the objective function: Maximize profit
m.setObjective(3*R + 5*B, GRB.MAXIMIZE)

# Define constraints
m.addConstr(R + B <= 100, "Total_Umbrellas")
m.addConstr(R >= 10, "Minimum_Red_Umbrellas")
m.addConstr(B >= 4*R, "Blue_vs_Red_Preference")

# Optimize the model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Red Umbrellas: {R.x}")
    print(f"Blue Umbrellas: {B.x}")
    print(f"Total Profit: ${3*R.x + 5*B.x}")
else:
    print("No optimal solution found. The model is likely infeasible.")
```