To solve the given optimization problem, we first need to translate the natural language description into a mathematical formulation. The goal is to minimize the total wage bill of the summer painting company under certain constraints.

Let's denote:
- \(S\) as the number of students employed,
- \(F\) as the number of full-time employees employed.

The objective function to minimize (the total wage bill) can be represented as:
\[ \text{Minimize} \quad 200S + 500F \]

Given constraints are:
1. The company needs at least 100 painters in total: \( S + F \geq 100 \)
2. At least 30 of the employees must be full-time: \( F \geq 30 \)
3. The number of full-time employees should be at least half the number of students: \( F \geq \frac{1}{2}S \)

To ensure that we are dealing with whole numbers of people, both \(S\) and \(F\) should be integers. However, since this is a linear programming problem, we will initially solve it without the integer constraint to find the optimal solution. If the solution does not yield integer values for \(S\) and \(F\), we might need to adjust our approach or use mixed-integer linear programming (MILP) if necessary.

Now, let's write the Gurobi code in Python to solve this problem:

```python
from gurobipy import *

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

# Define variables
S = m.addVar(name="Students", lb=0)
F = m.addVar(name="Full-Time_Employees", lb=0)

# Set the objective function
m.setObjective(200*S + 500*F, GRB.MINIMIZE)

# Add constraints
m.addConstr(S + F >= 100, name="Total_Painters")
m.addConstr(F >= 30, name="Full-Time_Minimum")
m.addConstr(F >= 0.5 * S, name="Experience_Balance")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution found: Students = {S.x}, Full-Time Employees = {F.x}")
    print(f"Total wage bill: ${200*S.x + 500*F.x:.2f}")
else:
    print("No optimal solution found")
```