## Step 1: Define the symbolic variables
Let's define the symbolic variables for the problem:
- $x_1$ represents the acres of mango trees
- $x_2$ represents the acres of durian trees

## Step 2: Formulate the objective function
The objective is to maximize profit. The profit from mango trees is $200 per acre, and from durian trees is $300 per acre. The cost to maintain mango trees is $150 per acre, and durian trees is $180 per acre. Therefore, the net profit per acre for mango trees is $200 - $150 = $50, and for durian trees is $300 - $180 = $120. The objective function to maximize is:
\[ \text{Maximize:} \quad 50x_1 + 120x_2 \]

## 3: Define the constraints
1. **Budget Constraint:** The cost to maintain mango trees is $150 per acre, and durian trees is $180 per acre, with a total budget of $20,000.
\[ 150x_1 + 180x_2 \leq 20000 \]
2. **Labor Constraint:** Mango trees require 6 days of labor per acre, and durian trees require 3 days of labor per acre, with a total of 700 days of labor available.
\[ 6x_1 + 3x_2 \leq 700 \]
3. **Non-Negativity Constraint:** Acres of trees cannot be negative.
\[ x_1 \geq 0, \quad x_2 \geq 0 \]
4. **Land Constraint:** Lucas has acquired 150 acres of land.
\[ x_1 + x_2 \leq 150 \]

## 4: Symbolic Representation
```json
{
'sym_variables': [('x1', 'acres of mango trees'), ('x2', 'acres of durian trees')],
'objective_function': 'Maximize: 50x1 + 120x2',
'constraints': [
    '150x1 + 180x2 <= 20000',
    '6x1 + 3x2 <= 700',
    'x1 >= 0',
    'x2 >= 0',
    'x1 + x2 <= 150'
]
}
```

## 5: Gurobi Code
```python
import gurobi

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

    # Define the variables
    x1 = model.addVar(lb=0, name="mango_trees")
    x2 = model.addVar(lb=0, name="durian_trees")

    # Objective function: Maximize 50x1 + 120x2
    model.setObjective(50*x1 + 120*x2, gurobi.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(150*x1 + 180*x2 <= 20000, name="budget_constraint")
    model.addConstr(6*x1 + 3*x2 <= 700, name="labor_constraint")
    model.addConstr(x1 + x2 <= 150, name="land_constraint")

    # Optimize the model
    model.optimize()

    # Print the solution
    if model.status == gurobi.GRB.OPTIMAL:
        print("Optimal Solution:")
        print(f"Mango Trees: {x1.varValue}")
        print(f"Durian Trees: {x2.varValue}")
        print(f"Max Profit: {model.objVal}")
    else:
        print("No optimal solution found.")

solve_optimization_problem()
```