## Problem Description and Formulation

The problem requires maximizing the objective function:

\[ 3 \times \text{hours worked by Mary} + 4 \times \text{hours worked by Dale} + 3 \times \text{hours worked by Peggy} + 8 \times \text{hours worked by Paul} \]

subject to several constraints related to computer competence ratings.

## Constraints

1. Individual computer competence ratings:
   - Mary: 2
   - Dale: 6
   - Peggy: 4
   - Paul: 17

2. Combined computer competence rating constraints:
   - \(2 \times M + 4 \times P + 17 \times Pa \geq 59\)
   - \(2 \times M + 6 \times D + 4 \times P \geq 59\)
   - \(2 \times M + 6 \times D + 17 \times Pa \geq 59\)
   - \(2 \times M + 4 \times P + 17 \times Pa \geq 34\)
   - \(2 \times M + 6 \times D + 4 \times P \geq 34\)
   - \(2 \times M + 6 \times D + 17 \times Pa \geq 34\)
   - \(2 \times M + 4 \times P + 17 \times Pa \geq 29\)
   - \(2 \times M + 6 \times D + 4 \times P \geq 29\)
   - \(2 \times M + 6 \times D + 17 \times Pa \geq 29\)

3. Upper bound constraints:
   - \(6 \times D + 4 \times P \leq 73\)
   - \(2 \times M + 4 \times P + 17 \times Pa \leq 124\)
   - \(6 \times D + 4 \times P + 17 \times Pa \leq 118\)
   - \(2 \times M + 6 \times D + 4 \times P \leq 69\)
   - \(2 \times M + 6 \times D + 4 \times P + 17 \times Pa \leq 69\)

4. Integrity constraints:
   - \(M\) must be an integer
   - \(D\) can be any real number
   - \(P\) must be an integer
   - \(Pa\) must be an integer

## Gurobi Code

```python
import gurobi

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

    # Define variables
    M = model.addVar(name="Mary", vtype=gurobi.GRB.INTEGER)  # Hours worked by Mary
    D = model.addVar(name="Dale")  # Hours worked by Dale
    P = model.addVar(name="Peggy", vtype=gurobi.GRB.INTEGER)  # Hours worked by Peggy
    Pa = model.addVar(name="Paul", vtype=gurobi.GRB.INTEGER)  # Hours worked by Paul

    # Objective function
    model.setObjective(3 * M + 4 * D + 3 * P + 8 * Pa, gurobi.GRB.MAXIMIZE)

    # Constraints
    # Individual computer competence ratings
    model.addConstr(2 * M + 6 * D + 4 * P + 17 * Pa >= 59)  
    model.addConstr(2 * M + 6 * D + 4 * P >= 59)  
    model.addConstr(2 * M + 6 * D + 17 * Pa >= 59)  
    model.addConstr(2 * M + 4 * P + 17 * Pa >= 34)  
    model.addConstr(2 * M + 6 * D + 4 * P >= 34)  
    model.addConstr(2 * M + 6 * D + 17 * Pa >= 34)  
    model.addConstr(2 * M + 4 * P + 17 * Pa >= 29)  
    model.addConstr(2 * M + 6 * D + 4 * P >= 29)  
    model.addConstr(2 * M + 6 * D + 17 * Pa >= 29)

    # Upper bound constraints
    model.addConstr(6 * D + 4 * P <= 73)
    model.addConstr(2 * M + 4 * P + 17 * Pa <= 124)
    model.addConstr(6 * D + 4 * P + 17 * Pa <= 118)
    model.addConstr(2 * M + 6 * D + 4 * P <= 69)
    model.addConstr(2 * M + 6 * D + 4 * P + 17 * Pa <= 69)

    # Bounds for variables (non-negativity assumed for hours worked)
    M.lb = 0
    D.lb = 0
    P.lb = 0
    Pa.lb = 0

    # Solve the model
    model.optimize()

    # Print solution
    if model.status == gurobi.GRB.OPTIMAL:
        print("Objective: ", model.objVal)
        print("Hours worked by Mary: ", M.x)
        print("Hours worked by Dale: ", D.x)
        print("Hours worked by Peggy: ", P.x)
        print("Hours worked by Paul: ", Pa.x)
    else:
        print("The model is infeasible")

solve_optimization_problem()
```