В этот критический период всяческая помощь приветствуется. Некоторые люди могут напрямую помочь со своими медицинскими навыками. Другие продолжают производить и распространять еду. Мы надеемся, что технологии тоже могут помочь.

Демонстрация нашей технологии, а не готовое решение (пока!)

В группе IBM Decision Optimization мы разрабатываем механизмы, инструменты и платформы оптимизации. Мы сами не разрабатываем готовых окончательных решений, но наши инструменты можно использовать для непосредственного решения реальных проблем. Наша технология уже используется во многих повседневных критически важных приложениях, от баланса производства и потребления энергии в национальном масштабе до проектирования и эксплуатации крупных цепочек поставок пищевых продуктов. До того, как работать почти 24 часа в сутки, многие медсестры во многих больницах строили свои графики с решениями, в которых внедрены наши технологии. См. Здесь, например, вариант использования для транспортировки пациентов в больницу. Чтобы создать решение, которое решает эти сложные проблемы, наши клиенты используют наши инструменты и платформы для разработки и развертывания моделей оптимизации решений. которые они встраивают в свои приложения.

Наша технология также может быть использована для решения неотложных проблем, непосредственно связанных с текущей ситуацией. К сожалению, мы не являемся экспертами в предметной области (SME), которые могли бы напрямую использовать наши инструменты для создания правильных моделей оптимизации решений для этого. Но мы можем создать демонстрацию, чтобы показать, что это возможно. Есть надежда, что люди, обладающие нужными знаниями и вовлеченные в процесс принятия решений, извлекут из этого пользу.

Планирование трансферов

В наши дни одной из критических проблем для наших правительств является управление неоднородным распространением вируса по территориям. Не все области заражены на одном уровне. В то время как ограничение населения и запрет на поездки снижает распространение вируса, перемещение больных между разными районами может снизить нагрузку на больницы в наиболее критических регионах. Во Франции перевозки теперь стали обычным явлением с использованием военных самолетов (см. Здесь или здесь), вертолетов или высокоскоростных поездов, но также и локально с использованием машин скорой помощи.

Для решения проблемы поиска оптимальных способов перемещения больных между районами можно использовать сочетание машинного обучения (ML) и оптимизации решений (DO).

Основываясь на недавней эволюции числа критических случаев реанимации в каждой области, можно обучить прогнозные модели для прогнозирования развития в каждой области в ближайшие дни. Эти данные, в дополнение к пропускной способности больниц для каждой из областей и некоторому описанию ограничений, накладываемых на возможные переводы, затем могут быть использованы в модели оптимизации решений. Эта схема, в которой машинное обучение используется в первую очередь для извлечения дополнительной неизвестной информации, а оптимизация решений используется для определения лучших следующих действий, очень распространена.

Пример записной книжки

Вы можете найти вот пример записной книжки. Это очень упрощенный прототип, демонстрирующий, как обе технологии могут взаимодействовать друг с другом, но для реального решения потребуется эксперт в предметной области, чтобы убедиться, что используются правильные данные, а также учтены правильные ограничения и цели. Формулировка этой модели является очень стандартным процессом в проектах оптимизации решений и может занять от нескольких дней до месяцев, в зависимости от сложности проблемы.

Импорт и отображение входных данных

Мы используем данные с сайта правительства Франции data.gouv.fr: https://www.data.gouv.fr/fr/datasets/donnees-relatives-a-lepidemie-de-covid-19/#_ в дополнение к некоторым импортированным данным о различных французских административных департаментах (GPS-координаты границы и центра).

Используя Folium, мы можем легко отобразить эти данные на карте. Кружками указано количество реанимационных дел в каждом отделении. Красные кружки показывают превышение нормальной емкости.

Упрощенная модель прогнозирования

Для иллюстрации обучена очень упрощенная прогностическая модель. Мы используем LinearRegression из sklearn, очевидно, зная, что эпидемия вовсе не линейна. Но это дает представление о том, как здесь будет работать машинное обучение.

import numpy as np
from sklearn.linear_model import LinearRegression
NB_PERIODS = 3
def predict_more(d, n):   
    X = hosp_data[d].index.tolist()
    X.reverse()
    X=np.array(X).reshape(-1,1)
    y = hosp_data[d]['rea'].tolist()
    y.reverse()
    y=np.array(y).reshape(-1,1)
regsr=LinearRegression()
    regsr.fit(X,y)
to_predict_x = [i for i in range(len(X), len(X)+n)]
    to_predict_x= np.array(to_predict_x).reshape(-1,1)
    predicted_y= regsr.predict(to_predict_x)
    delta_y = [ int(round(max(0, predicted_y[i][0]-y[len(y)-1][0]))) for i in range(n)]
    return delta_y
new_rea ={ d:predict_more(d, NB_PERIODS) for d in deps}
print (new_rea)

Результатом является прогноз ожидаемого числа новых случаев реанимации, которые произойдут в следующие несколько дней, которые мы планируем (здесь NB_PERIODS = 3).

Образец модели оптимизации принятия решений

Наша гипотеза для модели оптимизации состоит в том, что могут быть выполнены два разных типа переводов:

  • переезды на дальние расстояния (самолеты, поезда) с ограничением количества пересадок по всей стране, одновременно могут быть переведены несколько человек.
  • трансферы на короткие расстояния (машины скорой помощи) с ограничением количества переездов по территории и только с одним человеком за раз.

Параметры, которые мы используем (полностью придуманы):

MAX_NB_LONG_TRANSFERS_PER_PERIOD = 3
MAX_CASES_PER_LONG_TRANSFERS = 20
MAX_NB_SHORT_TRANSFERS_PER_DEPARTMENT = 3
LONG_DISTANCE = 200

Мы используем наш docplexAPI для моделирования проблемы:

from docplex.mp.model import Model
mdl = Model("Plan Transfers")

Переменные решения представляют собой ссылки передачи, которые будут использоваться в лучшем (оптимальном) плане передачи (целочисленная переменная для количества перемещенных лиц и двоичная переменная, указывающая, используется ли ссылка или нет, с ограничением, связывающим оба). Другой набор вспомогательных переменных представляет занятость для каждого отдела и каждого периода.

use_link_vars = mdl.binary_var_cube(deps, deps, transfer_periods, name="use_link")
link_vars = mdl.integer_var_cube(deps, deps, transfer_periods, lb=0, ub=MAX_CASES_PER_LONG_TRANSFERS, name="link")
occupancy_vars = mdl.integer_var_matrix(deps, all_periods, lb=0, name="occupancy")

Затем сформулируем все ограничения:

# Initial state
mdl.add_constraints(occupancy_vars[d, 0] == initial[d] for d in deps)
# structural constraint between user_link and link
mdl.add_constraints(use_link_vars[d, d1, t] == (link_vars[d, d1, t] >= 1) for d in deps for d1 in deps for t in transfer_periods)
# Short transfers bounds
mdl.add_constraints(link_vars[d1, d2, t] <= 1 for d1 in deps for d2 in deps if not is_long[d1][d2] for t in transfer_periods)
# number of transfers from a department less than current number of cases
mdl.add_constraints(mdl.sum(link_vars[d, d1, t] for d1 in deps) <= occupancy_vars[d, t] for d in deps for t in transfer_periods)
# maximum number of LONG transfers
mdl.add_constraints(mdl.sum(use_link_vars[d1, d2, t] for d1 in deps for d2 in deps if is_long[d1][d2]) <= MAX_NB_LONG_TRANSFERS_PER_PERIOD for t in transfer_periods)
# maximum number of SHORT transfers
mdl.add_constraints(mdl.sum(use_link_vars[d1, d2, t] for d1 in deps if not is_long[d1][d2] for t in transfer_periods) <= MAX_NB_SHORT_TRANSFERS_PER_DEPARTMENT for d2 in deps )
# conservation constraints including new cases to come
mdl.add_constraints(occupancy_vars[d, t+1] == new_rea[d][t] + occupancy_vars[d, t] + mdl.sum(link_vars[d1, d, t] for d1 in deps) - mdl.sum(link_vars[d, d1, t] for d1 in deps) for d in deps for t in transfer_periods)

И цели. Основная цель - уменьшить общую избыточную мощность на площадях, но мы также должны ограничить ненужные переводы.

final_overcapacity = mdl.sum(mdl.max(0,  occupancy_vars[d, NB_PERIODS] - capacity[d]) for d in deps)
mdl.add_kpi(final_overcapacity)
nb_long_transfers = mdl.sum(use_link_vars[d1, d2, t] for d1 in deps for d2 in deps if is_long[d1][d2] for t in transfer_periods)
mdl.add_kpi(nb_long_transfers)
nb_short_transfers = mdl.sum(use_link_vars[d1, d2, t] for d1 in deps for d2 in deps if not is_long[d1][d2] for t in transfer_periods)
mdl.add_kpi(nb_short_transfers)
mdl.minimize(1000 * final_overcapacity + 10 * nb_long_transfers + nb_short_transfers)

Затем мы можем решить проблему (используя движок CPLEX) и получить предписанные решения.

mdl.set_time_limit(20) 
mdl.solve(log_output=True)

Показать решение

Используя тот же пакет Folium, мы можем изобразить предлагаемые трансферы на карте.
Дальние трансферы представлены зеленым, а короткие - черным.

Выводы

Я хочу еще раз настоять на том, что это не готовое к использованию решение, а демонстрация того, как технологии ML и DO могут быть использованы для предложения математически оптимальных решений о передаче.

Вы можете найти здесь полную записную книжку.

На практике следует учитывать дополнительные данные, ограничения и цели. Например, мы легко можем представить, что будет учитываться уровень критичности отдельных инфицированных лиц. Также следует принимать во внимание характеристики больниц в различных районах, включая окрестности аэропорта или железнодорожного вокзала.

Также обратите внимание, что моя модель учитывала только переводы внутри Франции, в то время как некоторые переводы уже имели место из Франции в Германию и Люксембург.

Таким образом, эта записная книжка предоставляется только в качестве примера, который можно использовать для обнаружения или изучения оптимизации. Вы можете бесплатно опробовать этот блокнот на Watson Studio Cloud.

Есть десятки других проблем, связанных с текущей ситуацией, в которых ML и DO также могут помочь, например для управления запасами и цепочкой поставок масок и респираторов.

Если вы можете использовать такую ​​технологию на практике в ситуации с Covid-19, не стесняйтесь обращаться к нам, мы готовы помочь.

[email protected]

@AlainChabrier

Https://www.linkedin.com/in/alain-chabrier-5430656/