AI-система для гірничодобувної промисловості

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
AI-система для гірничодобувної промисловості
Складний
від 2 тижнів до 3 місяців
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1284
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    901
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

AI-система для гірничодобувної промисловості

Гірський видобуток — галузь із екстремальними умовами, високими капітальними витратами та низькою маржею за волатильних цін на сировину. AI зміщує фокус від реактивного усунення поломок до передиктивного управління активами, від геологічних припущень до точних моделей надр, від ручного планування – до оптимізованих виробничих графіків.

Предиктивне обслуговування гірничого обладнання

Діагностика екскаваторів, бурових установок та конвеєрів:

Гірське обладнання працює в умовах абразивного зносу, ударних навантажень та пилу. MTBF (mean time between failures) одного кар'єрного екскаватора - 300-500 годин. Позаплановий простий = втрати 1-3 млн. руб. на добу.

import pandas as pd
import numpy as np
from sklearn.ensemble import IsolationForest, GradientBoostingClassifier
from sklearn.preprocessing import StandardScaler

class MiningEquipmentPredictor:
    """Предиктивная диагностика горного оборудования по телеметрии"""

    def __init__(self, equipment_id: str, equipment_type: str):
        self.equipment_id = equipment_id
        self.equipment_type = equipment_type
        self.anomaly_detector = IsolationForest(contamination=0.03, n_estimators=200)
        self.failure_classifier = GradientBoostingClassifier(n_estimators=300)

    def extract_features(self, telemetry_df: pd.DataFrame) -> pd.DataFrame:
        """
        Признаки из телеметрии: вибрация, температура, ток, давление.
        Сдвиги: 1ч, 4ч, 8ч (смена), 24ч.
        """
        features = telemetry_df.copy()
        sensor_cols = ['vibration_x', 'vibration_y', 'vibration_z',
                       'motor_temp', 'bearing_temp', 'hydraulic_pressure',
                       'motor_current', 'oil_pressure', 'rpm']

        for col in sensor_cols:
            if col in features.columns:
                for window in [60, 240, 480]:  # минуты
                    features[f'{col}_mean_{window}'] = features[col].rolling(window).mean()
                    features[f'{col}_std_{window}'] = features[col].rolling(window).std()
                    features[f'{col}_max_{window}'] = features[col].rolling(window).max()
                # Тренд: производная
                features[f'{col}_trend'] = features[col].diff(60)

        # Вибрационные признаки (FFT-статистики если есть raw)
        if 'vibration_x' in features.columns:
            features['vibration_rms'] = np.sqrt(
                features[['vibration_x', 'vibration_y', 'vibration_z']].pow(2).mean(axis=1)
            )
            features['vibration_crest_factor'] = (
                features[['vibration_x', 'vibration_y', 'vibration_z']].abs().max(axis=1) /
                (features['vibration_rms'] + 1e-6)
            )

        return features.dropna()

    def detect_anomalies(self, features_df: pd.DataFrame) -> pd.Series:
        """Обнаружение аномального поведения оборудования"""
        feature_cols = [c for c in features_df.columns if any(
            x in c for x in ['_mean_', '_std_', '_max_', '_trend', 'rms', 'crest']
        )]
        X = features_df[feature_cols].fillna(0)
        scores = self.anomaly_detector.decision_function(X)
        return pd.Series(-scores, index=features_df.index, name='anomaly_score')

    def predict_failure_probability(self, features_df, horizon_hours=24):
        """P(отказ в течение horizon_hours) → порог 0.7 = предупреждение"""
        feature_cols = [c for c in features_df.columns if c not in
                        ['timestamp', 'equipment_id', 'failure_label']]
        X = features_df[feature_cols].fillna(0)
        proba = self.failure_classifier.predict_proba(X)[:, 1]
        return proba

Специфіка за типом обладнання:

Оборудование Ключевые датчики Типичные отказы Предупреждение
Карьерный экскаватор Вибрация ковша, ток подъёма Разрушение ковша, отказ КВГ 12–24 часа
Шаровая мельница Вибрация, шум, крутящий момент Износ футеровки, торцевые трещины 24–72 часа
Ленточный конвейер Пробуксовка, смещение ленты Обрыв ленты, завал роликов 2–8 часов
Буровая установка Нагрузка на долото, крутящий момент Прихват бурильной колонны Реальное время
Насосы водоотлива Давление, вибрация, ток Кавитация, абразивный износ 6–24 часа

Геологічне моделювання та оцінка запасів

ML-інтерпретація геологічних даних:

Традиційний підхід: геолог вручну корелює свердловини. AI автоматизує інтерполяцію та додає ймовірнісну оцінку:

from pykrige.ok import OrdinaryKriging
import numpy as np
from sklearn.ensemble import RandomForestRegressor

class OregradePredictor:
    """Прогноз содержания металла в рудном теле"""

    def build_grade_model(self, drillhole_data):
        """
        drillhole_data: DataFrame с координатами x,y,z и содержанием металла
        Метод: Ordinary Kriging для интерполяции + ML для учёта литологии
        """
        # Геостатистика: Ordinary Kriging
        ok = OrdinaryKriging(
            drillhole_data['x'], drillhole_data['y'],
            drillhole_data['grade'],
            variogram_model='spherical',
            variogram_parameters={'sill': drillhole_data['grade'].var(),
                                  'range': 50,  # метры
                                  'nugget': 0.1}
        )

        # Сетка для предсказания
        grid_x = np.arange(drillhole_data['x'].min(), drillhole_data['x'].max(), 5)
        grid_y = np.arange(drillhole_data['y'].min(), drillhole_data['y'].max(), 5)
        z_pred, z_var = ok.execute('grid', grid_x, grid_y)

        return {
            'grade_grid': z_pred,
            'variance_grid': z_var,  # неопределённость → где нужны доп. скважины
            'grid_x': grid_x,
            'grid_y': grid_y
        }

    def classify_lithology(self, geophysical_logs):
        """
        Автоматическая классификация литологии по ГИС (каротажным кривым).
        Входные данные: GR (гамма), SP, resistivity, density, neutron
        """
        features = ['gr', 'sp', 'res_deep', 'res_shallow', 'density', 'neutron']
        X = geophysical_logs[features]

        rf = RandomForestRegressor(n_estimators=200)
        # Обучение на размеченных интервалах керна
        # Предсказание литологии в необсаженных интервалах
        return rf

Пошук нових родовищ:

  • Мультиспектральні знімки Sentinel-2 + геохімія → аномалії - Обробка сейсмічних даних нейронними мережами (заміна ручної інтерпретації) - Transfer learning: модель, навчена на одному родовищі, адаптується до сусіднього за 10-20 додаткових свердловин

Оптимізація гірничого планування

Кар'єрне планування (Open Pit Scheduling):

Завдання: послідовність вилучення блоків при обмеженнях на борт кар'єру, продуктивність, економіку:

from ortools.sat.python import cp_model

def optimize_mining_sequence(blocks, time_periods=12, capacity_per_period=1000000):
    """
    Оптимизация последовательности добычи блоков.
    blocks: список словарей {id, value, tonnage, predecessors}
    Максимизировать NPV с учётом временной стоимости денег.
    """
    model = cp_model.CpModel()
    discount_rate = 0.10 / 12  # месячная ставка

    # Бинарные переменные: добывается ли блок в период t
    x = {}
    for block in blocks:
        for t in range(time_periods):
            x[block['id'], t] = model.NewBoolVar(f"x_{block['id']}_{t}")

    # Каждый блок добывается не более одного раза
    for block in blocks:
        model.AddAtMostOne([x[block['id'], t] for t in range(time_periods)])

    # Ограничение производительности по периодам
    for t in range(time_periods):
        model.Add(
            sum(x[b['id'], t] * b['tonnage'] for b in blocks) <= capacity_per_period
        )

    # Предшественники: нельзя добыть блок раньше вышележащего (slope stability)
    for block in blocks:
        for pred_id in block.get('predecessors', []):
            for t in range(time_periods):
                pred_extracted_by_t = sum(x[pred_id, tt] for tt in range(t + 1))
                model.Add(pred_extracted_by_t >= x[block['id'], t])

    # Целевая функция: NPV
    objective_terms = []
    for block in blocks:
        for t in range(time_periods):
            discounted_value = int(block['value'] / (1 + discount_rate) ** t)
            objective_terms.append(x[block['id'], t] * discounted_value)

    model.Maximize(sum(objective_terms))

    solver = cp_model.CpSolver()
    solver.parameters.max_time_in_seconds = 120
    status = solver.Solve(model)

    schedule = {}
    if status in [cp_model.OPTIMAL, cp_model.FEASIBLE]:
        for block in blocks:
            for t in range(time_periods):
                if solver.Value(x[block['id'], t]):
                    schedule[block['id']] = t

    return schedule

Управління якістю руди (Grade Control)

Реального часу контроль змісту:

  • XRF-аналізатори на конвеєрі + CV → онлайн-аналіз руди без лабораторних затримок - Blending optimization: змішання руди з різних вибоїв для стабілізації складу на вході збагачувальної фабрики - Динамічна диспетчеризація самоскидів: високоякісна руда → фабрика, бідна →

Оптимізація збагачення:

Процес флотації – нелінійний, залежить від гранулометрії, реагентів, рН. ML-оптимізація:

from scipy.optimize import differential_evolution

def optimize_flotation_reagents(ore_characteristics, current_recovery=0.82):
    """
    Оптимизация дозировки реагентов флотации.
    Цель: максимизировать извлечение при минимальном расходе реагентов.
    """
    # Суррогатная модель (обучена на исторических данных фабрики)
    def flotation_model(reagents):
        collector_g_t, frother_g_t, activator_g_t, ph = reagents
        # Упрощённая модель (в реальности: LightGBM или GPR)
        recovery = (0.75 + 0.08 * np.log(1 + collector_g_t / 50)
                    + 0.05 * (1 - abs(ph - 10.5) / 2)
                    + 0.02 * np.log(1 + frother_g_t / 20))
        cost = collector_g_t * 0.15 + frother_g_t * 0.25 + activator_g_t * 0.10
        return -(recovery - 0.001 * cost)  # негатив для минимизации

    bounds = [(20, 150),   # collector г/т
              (10, 60),    # frother г/т
              (0, 80),     # activator г/т
              (9.5, 11.5)] # pH

    result = differential_evolution(flotation_model, bounds, seed=42, maxiter=200)
    optimal = result.x
    return {
        'collector_g_t': optimal[0],
        'frother_g_t': optimal[1],
        'activator_g_t': optimal[2],
        'ph': optimal[3],
        'expected_recovery': -result.fun
    }

Безпека та моніторинг середовища

AI-моніторинг газової обстановки (для підземних копалень):

  • Мультисенсорні вузли: CH4, CO, CO2, O2, H2S - історичні дані + ML-прогноз концентрації - Геомеханіка: акустична емісія + ML → попередження обвалів за 1-6 годин - Computer Vision на відеопотоках: каска, жилет, перебування в забороненій зоні

Екологічний моніторинг:

  • PM2.5/PM10 від вибухових робіт і транспорту → ML прогноз розсіювання з урахуванням метеоумов - Моніторинг гідрохімії хвостосховища: pH, важкі метали → автоматичні оповіщення при перевищенні ГДК

Термін розробки: 6-9 місяців для комплексної AI-платформи гірничодобувного підприємства з передиктивною діагностикою, геологічним моделюванням та оптимізацією планування.