با استفاده از یک الگوریتم نمودار acyclic کارگردانی برای پیش بینی بهره وری

جهان با بهره وری توانمند می شود. جامعه ، بازارهای مالی و اقتصاد با اندازه گیری تولید تولیدی آن هدایت می شود. بنابراین ، روش ها و چارچوب های طراحی شده برای به حداکثر رساندن بازده و کارآیی با بهینه سازی مدیریت زمان ، اولویت بندی کار و گردش کار برای افراد و سازمانهایی که برای موفقیت تلاش می کنند ضروری است.
در عصری که اتوماسیون و ابزارهای محور AI در حال تغییر شکل صنایع هستند ، استفاده از الگوریتم ها و فرآیندهای ارزش افزوده بخش مهمی از آینده نرم افزار است.
در مقاله زیر من نشان خواهم داد که چگونه استفاده از یک نمودار acyclic کارگردانی (DAG) می تواند به طور دقیق تکمیل کار و جدول زمانی پروژه را پیش بینی کند.
یک نمودار حرکتی مستقیم (DAG) یک گردش کار ساختاری را نشان می دهد که در آن وظایف (گره ها) توسط وابستگی ها (لبه ها) در یک توالی واضح و یک طرفه به هم وصل می شوند و از عدم وابستگی دایره ای یا حلقه های نامحدود اطمینان نمی دهند. این ساختار در برنامه ریزی پروژه بسیار مهم است که قبل از شروع دیگران باید کارهای خاصی انجام شود. به عنوان مثال ، در توسعه نرم افزار ، “طراحی UI” باید قبل از “اجرای UI” باشد ، که پس از آن باید قبل از “آزمایش” باشد. از آنجا که DAG ها یک نظم توپولوژیکی را حفظ می کنند ، آنها برنامه ریزی کارآمد ، اجرای موازی کارهای مستقل و پیشگیری از بن بست ها ، اطمینان از اجرای صاف و بهینه پروژه را امکان پذیر می کنند.
با استفاده از مجموعه داده های مثال زیر:
tasks = [
{
"id": 1,
"name": "Design UI",
"days_length": 3,
"dependencies": []
},
{
"id": 2,
"name": "Implement UI",
"days_length": 7,
"dependencies": [1]
},
{
"id": 3,
"name": "Testing",
"days_length": 2,
"dependencies": [2]
},
{
"id": 4,
"name": "Project Documentation",
"days_length": 4,
"dependencies": []
}
]
برای تعیین ترتیب صحیح وظایف ، ما باید یک نوع توپولوژیکی از وظایف را انجام دهیم که اطمینان حاصل شود که کارهای وابسته قبل از لبه های آنها انجام می شود. اولین مرحله از فرآیند ساخت یک لیست مجاور است که حاوی هر کار و درجه های آنها (وظایف وابسته به آن) است. پس از انجام این کار ، می توانیم با اضافه کردن کلیه کارها بدون هیچ گونه لبه ورودی ، سفارش برنامه ها را انجام دهیم. با استفاده از داده های نمونه ما ، این خواهد بود مستندات پروژه وت طراحی UIبشر هنگامی که این موارد را به لیست خود اضافه کردیم ، می توانیم بیش از هر یک از این کارها تکرار کنیم و سپس هر یک از وابستگی های آنها را به برنامه خود اضافه کنیم.
from collections import defaultdict, deque
from datetime import datetime, timedelta, time
def topological_sort(self, tasks):
# Step 1: Calculate in-degrees and construct the adjacency list
in_degree = defaultdict(int)
adjacency_list = defaultdict(list)
for task in tasks.values():
# Initialize in-degree for the current task
in_degree[task.id] = in_degree.get(task.id, 0)
for dependency in task.dependencies:
adjacency_list[dependency.id].append(task)
in_degree[task.id] += 1
# Step 2: Collect all tasks with in-degree 0 (tasks with no dependencies) for initial adding
zero_in_degree = deque([task for task in tasks.values() if in_degree[task.id] == 0])
# Step 3: Process tasks with in-degree 0
top_order = []
while zero_in_degree:
# 3.1: add tasks that have no dependencies
current_task = zero_in_degree.popleft()
top_order.append(current_task)
# Reduce the in-degree of dependent tasks
# 3.2: process dependent tasks
# get list of tasks that point to this task
for dependent_task in adjacency_list[current_task.id]:
# subtract -1 to account for the parent task that points to this
in_degree[dependent_task.id] -= 1 # Step 1: Reduce the in-degree of each dependent task
# this dependent task has no other dependencies
if in_degree[dependent_task.id] == 0: # Step 2: Check if this dependent task now has no incoming edges (all depedendencies are resolved)
zero_in_degree.append(tasks[dependent_task.id]) # Step 3: Add it to the processing queue (tasks with no incoming edges)
return top_order
در حالی که مثال کد فوق تمام وظایف را به ترتیب مورد نیاز خود سفارش می دهد ، با افزودن منطق برای تعیین تاریخ شروع و پایان برای هر کار بر اساس طول کار پیش بینی شده ، می توانیم تاریخ تکمیل پیش بینی هر کار را برون یابی کنیم و به طور دقیق پیش نمایش پروژه و تکمیل را پیش بینی کنیم.