To solve the optimization problem described, we need to define the decision variables, the objective function, and the constraints. Let's denote:

- \(x_p\) as the amount invested in the paper industry,
- \(x_g\) as the amount invested in the glass industry.

The total investment is $300,000, so we have:
\[x_p + x_g = 300,000\]

The return on investment (ROI) for the paper industry is 2%, and for the glass industry, it's 5%. The objective function to maximize the total return can be written as:
\[0.02x_p + 0.05x_g\]

The constraints given are:
1. At least 30% of the investment must be in the paper industry: 
\[x_p \geq 0.3 \times 300,000\]
2. At most 50% of the investment can be in the glass industry:
\[x_g \leq 0.5 \times 300,000\]

Also, \(x_p\) and \(x_g\) must be non-negative since they represent amounts of money.

Let's implement this problem using Gurobi in Python:

```python
from gurobipy import *

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

# Define the decision variables
x_p = m.addVar(name="paper_investment", lb=0)
x_g = m.addVar(name="glass_investment", lb=0)

# Objective function: Maximize return on investment
m.setObjective(0.02*x_p + 0.05*x_g, GRB.MAXIMIZE)

# Constraints
m.addConstr(x_p + x_g == 300000, name="total_investment")
m.addConstr(x_p >= 0.3*300000, name="min_paper_investment")
m.addConstr(x_g <= 0.5*300000, name="max_glass_investment")

# Optimize the model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print(f"Optimal investment in paper industry: ${x_p.x:.2f}")
    print(f"Optimal investment in glass industry: ${x_g.x:.2f}")
    print(f"Maximum return on investment: ${m.objVal:.2f}")
else:
    print("Model is not optimal")
```