To solve the given optimization problem, we first need to understand the objective function and the constraints. The objective is to minimize the function $3 \times \text{hours worked by John} + 1 \times \text{hours worked by George}$ under several constraints related to productivity ratings, computer competence ratings, organization scores, and a specific linear combination of hours worked by both individuals.

The constraints can be summarized as follows:
- The total combined productivity rating must be between 39 and 106.
- The total combined computer competence rating must be between 21 and 55.
- The total combined organization score must be at least 66 but no more than 131.
- A specific linear combination of hours worked by John and George must be non-negative: $2 \times \text{hours worked by John} - 7 \times \text{hours worked by George} \geq 0$.

Given the variables and constraints, we can formulate this problem using Gurobi in Python. We'll define the variables as `hours_worked_by_John` and `hours_worked_by_George`, and then set up the objective function and constraints accordingly.

```python
from gurobipy import *

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

# Define variables
hours_worked_by_John = m.addVar(lb=0, name="hours_worked_by_John")
hours_worked_by_George = m.addVar(lb=0, name="hours_worked_by_George")

# Objective function: Minimize 3*hours_worked_by_John + hours_worked_by_George
m.setObjective(3 * hours_worked_by_John + hours_worked_by_George, GRB.MINIMIZE)

# Constraints
# Productivity rating constraint: 14*hours_worked_by_John + 17*hours_worked_by_George >= 39 and <= 106
m.addConstr(14 * hours_worked_by_John + 17 * hours_worked_by_George >= 39, name="productivity_min")
m.addConstr(14 * hours_worked_by_John + 17 * hours_worked_by_George <= 106, name="productivity_max")

# Computer competence rating constraint: 14*hours_worked_by_John + 4*hours_worked_by_George >= 21 and <= 55
m.addConstr(14 * hours_worked_by_John + 4 * hours_worked_by_George >= 21, name="computer_min")
m.addConstr(14 * hours_worked_by_John + 4 * hours_worked_by_George <= 55, name="computer_max")

# Organization score constraint: 11*hours_worked_by_John + 20*hours_worked_by_George >= 66 and <= 131
m.addConstr(11 * hours_worked_by_John + 20 * hours_worked_by_George >= 66, name="organization_min")
m.addConstr(11 * hours_worked_by_John + 20 * hours_worked_by_George <= 131, name="organization_max")

# Linear combination constraint: 2*hours_worked_by_John - 7*hours_worked_by_George >= 0
m.addConstr(2 * hours_worked_by_John - 7 * hours_worked_by_George >= 0, name="linear_combination")

# Optimize the model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Hours worked by John: {hours_worked_by_John.x}")
    print(f"Hours worked by George: {hours_worked_by_George.x}")
else:
    print("No optimal solution found.")
```