## Problem Description and Formulation

The problem is a linear programming optimization problem. The goal is to maximize the profit of producing Granny Smith apples and McIntosh apples under given constraints.

### Decision Variables

- \(x\): The amount of Granny Smith apples produced in kg.
- \(y\): The amount of McIntosh apples produced in kg.

### Objective Function

The profit per kg of Granny Smith apples is $2, and the profit per kg of McIntosh apples is $1. The objective is to maximize the total profit \(P = 2x + y\).

### Constraints

1. **Production Limits**:
   - At most 100 kg of Granny Smith apples: \(x \leq 100\).
   - At most 120 kg of McIntosh apples: \(y \leq 120\).

2. **Minimum Supply Requirements**:
   - At least 25 kg of Granny Smith apples: \(x \geq 25\).
   - At least 50 kg of McIntosh apples: \(y \geq 50\).

3. **Cleaning Machine Availability**:
   - Each kg of apples requires 3 hours: \(3x + 3y \leq 15\).
   - Simplifying, we get: \(x + y \leq 5\).

### Gurobi Code Formulation

```python
import gurobipy as gp

# Create a new model
m = gp.Model("Apple_Farm_Optimization")

# Decision variables
x = m.addVar(lb=25, ub=100, name="Granny_Smith_apples")  # kg
y = m.addVar(lb=50, ub=120, name="McIntosh_apples")    # kg

# Objective function: Maximize profit
m.setObjective(2*x + y, gp.GRB.MAXIMIZE)

# Constraints
m.addConstr(x <= 100, name="Granny_Smith_limit")
m.addConstr(y <= 120, name="McIntosh_limit")
m.addConstr(x >= 25, name="Granny_Smith_min")
m.addConstr(y >= 50, name="McIntosh_min")
m.addConstr(x + y <= 5, name="Cleaning_machine_limit")

# Solve the model
m.solve()

# Output solution
if m.status == gp.GRB.OPTIMAL:
    print("Optimal Solution:")
    print(f"Granny Smith apples: {x.varValue} kg")
    print(f"McIntosh apples: {y.varValue} kg")
    print(f"Max Profit: ${2*x.varValue + y.varValue}")
else:
    print("No optimal solution found.")
```