## Problem Description and Formulation

The artisan kitchen company wants to maximize profit by determining the number of handmade wooden plates and forks to produce. The problem has the following constraints:

- Each plate takes 30 minutes of woodworker time.
- Each fork takes 20 minutes of woodworker time.
- The store has 5000 minutes of woodworker time available.
- The store must make at least twice the number of forks as plates.
- The profit per plate is $10.
- The profit per fork is $8.

Let's denote the number of plates to be produced as \(P\) and the number of forks as \(F\). The objective is to maximize the total profit \(10P + 8F\) under the given constraints.

## Constraints:

1. Woodworker time constraint: \(30P + 20F \leq 5000\)
2. Forks to plates ratio constraint: \(F \geq 2P\)
3. Non-negativity constraints: \(P \geq 0, F \geq 0\)

## Gurobi Code

```python
import gurobi

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

    # Define variables
    P = model.addVar(lb=0, vtype=gurobi.GRB.INTEGER, name="Plates")
    F = model.addVar(lb=0, vtype=gurobi.GRB.INTEGER, name="Forks")

    # Objective function: Maximize profit
    model.setObjective(10*P + 8*F, gurobi.GRB.MAXIMIZE)

    # Woodworker time constraint
    model.addConstr(30*P + 20*F <= 5000, name="Woodworker_Time")

    # Forks to plates ratio constraint
    model.addConstr(F >= 2*P, name="Forks_to_Plates")

    # Solve the model
    model.optimize()

    # Check if the model is optimized
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal number of plates: {P.varValue}")
        print(f"Optimal number of forks: {F.varValue}")
        print(f"Maximal profit: {model.objVal}")
    else:
        print("The model is infeasible.")

if __name__ == "__main__":
    solve_optimization_problem()
```