Розробка AI-системи оптимізації будівельного графіка
Будівельний графік – сотні взаємопов'язаних робіт із ресурсними обмеженнями. Традиційні інструменти (MS Project, Primavera P6) потребують ручного планування. AI автоматизує створення оптимального графіка та динамічно перераховує його при відхиленнях.
Автоматичне складання графіка
Resource-Constrained Project Scheduling (RCPSP):
Завдання будівельного розкладу: N робіт з залежними залежностями від predecessor/successor, R видів ресурсів (бригади, крани, опалубка) з обмеженою доступністю → мінімізувати загальний термін.
from ortools.sat.python import cp_model
def schedule_construction_project(tasks, dependencies, resources, resource_limits):
"""
tasks: [{'id', 'duration_days', 'resource_demand': {type: qty}}]
dependencies: [(task_a, task_b)] — b начинается после a
resources: {'rebar_crew': 5, 'formwork_crew': 3, 'tower_crane': 2}
"""
model = cp_model.CpModel()
horizon = sum(t['duration_days'] for t in tasks) + 10 # мин. возможный срок
task_vars = {}
for task in tasks:
start = model.NewIntVar(0, horizon, f"start_{task['id']}")
end = model.NewIntVar(0, horizon, f"end_{task['id']}")
interval = model.NewIntervalVar(start, task['duration_days'], end, f"interval_{task['id']}")
task_vars[task['id']] = {'start': start, 'end': end, 'interval': interval}
# Зависимости (precedence constraints)
for pred_id, succ_id in dependencies:
model.Add(task_vars[succ_id]['start'] >= task_vars[pred_id]['end'])
# Ресурсные ограничения: кумулятивная нагрузка не превышает лимит
for resource_type, capacity in resource_limits.items():
intervals = []
demands = []
for task in tasks:
if resource_type in task.get('resource_demand', {}):
intervals.append(task_vars[task['id']]['interval'])
demands.append(task['resource_demand'][resource_type])
if intervals:
model.AddCumulative(intervals, demands, capacity)
# Целевая функция: минимизировать время завершения проекта
project_end = model.NewIntVar(0, horizon, 'project_end')
model.AddMaxEquality(project_end, [task_vars[t['id']]['end'] for t in tasks])
model.Minimize(project_end)
solver = cp_model.CpSolver()
solver.parameters.max_time_in_seconds = 60.0
status = solver.Solve(model)
if status in [cp_model.OPTIMAL, cp_model.FEASIBLE]:
return {t['id']: solver.Value(task_vars[t['id']]['start']) for t in tasks}
return None
Прогноз порушень графіка
Early Warning система:
ML-модель передбачає роботи, які затримаються: Ознаки: поточний відсоток виконання vs. плановий, темп виконання останніх 5 днів - Доступність ресурсів: погода (робочих днів менше), постачання матеріалів - Тип роботи: бетонні (залежать від погоди), монтаж (залежать від постачання)
import lightgbm as lgb
import pandas as pd
def predict_schedule_delay(task_progress_df, project_context):
"""
Прогноз задержки для каждой незавершённой работы.
task_progress_df: ежедневные отчёты о выполнении работ
"""
features = task_progress_df.copy()
# Ключевые признаки
features['planned_vs_actual'] = (features['actual_pct'] -
features['planned_pct_today'])
features['velocity_7d'] = features['actual_pct'].diff(7) / 7 # % в день
features['required_velocity'] = ((100 - features['actual_pct']) /
(features['days_remaining'] + 1))
features['velocity_gap'] = features['required_velocity'] - features['velocity_7d']
# Контекстные признаки
features['rain_days_forecast'] = project_context.get('rain_days_next7', 0)
features['resource_availability'] = project_context.get('crew_availability', 1.0)
features['material_on_site'] = features['material_stock_days']
model = lgb.LGBMRegressor() # предобученная модель
delay_predictions = model.predict(features[feature_cols])
return delay_predictions # в рабочих днях
Динамічний перерахунок при відхиленнях
Сценарний аналіз:
При затримці критичної роботи - автоматичний перерахунок: 1. Визначити affected downstream tasks (всі послідовники) 2. Перевірити: чи буфер (float) чи критичний шлях? 3. Запропонувати варіанти recovery: - Додати ресурси на роботу, що затрималася, - Перепланувати паралельні роботи - Скоригувати scope (якщо припустимо)
Crash Analysis:
Що якщо стиснути терміни: які роботи стискати за мінімальних додаткових витрат? - Crash cost per day для кожної роботи (подвоїти бригаду = +N руб/день, -M днів) - Linear Programming: мінімізувати додаткові витрати для досягнення target терміну
Управління ресурсами
Планування поставок:
Look-ahead schedule: які матеріали потрібні через 2–4 тижні → автоматичні заявки на поставку: - Реєстр робіт + норми витрати → відомість матеріалів за періодами – Буфер: 10–15% запас на складі від тижневої потреби – Alert: матеріал закінчується через 5 днів, а lead time постачальника 7 днів
Workforce planning:
Прогноз потреби в бригадах та спеціальностях по днях: - пік в опалубних роботах: потрібні 3 бригади × 5 осіб - спад: 1 бригада на зачистку - висновок: попередити виконроба про піки за 2 тижні для найму/залучення
Термін розробки: 3–5 місяців для системи автоматичного планування графіка, прогнозу затримок та динамічного перерахунку з інтеграцією у Primavera P6/MS Project.







