название Антонов Александр Сергеевич
Содержание Описание предметной области Постановка задачи Алгоритмы решения Направление работ в будущем
Описание предметной области В городе есть несколько госпиталей. Каждому госпиталю приписано определенное число бригад скорой помощи. Требуется развести пациентов с места аварии по госпиталям.
Постановка задачи Возникает задача наискорейшей доставки пострадавших в больницы. Цель: минимизировать время доставки всех пациентов (т.е. минимизировать время от поступления сигнала об аварии до момента, когда последний пострадавший, вывезенный с места аварии, окажется в госпитале).
Постановка задачи Город можно представить как сеть дорог на которой заданы точки: Расположение госпиталей Место аварии Положение бригад скорой помощи на момент аварии Дороги могут иметь разное покрытие, так же, часть дорог может быть заблокирована для бригад скорой помощи в момент поступления сигнала об аварии из- за ремонта, пробок и т.п. Известно количество пострадавших в аварии, также как количество пациентов, которое готов принять каждый госпиталь.
Общее представление города
Этапы решения Решение задачи можно разделить на два этапа: 1.Определить кратчайшие пути (будем использовать термин «кратчайший», но речь идет не о расстоянии, а о времени, необходимом бригаде на преодоление пути) от места аварии до госпиталей на момент поступления сигнала. Далее будут браться в расчет только эти пути, чтобы для каждого больного не решать новую задачу поиска кратчайшего пути. 2.Распределить пациентов по бригадам и госпиталям.
1. Определение кратчайших путей
2. Распределение пациентов Необходимость решения данной задачи вытекает из того, что подход «кто первый приехал, тот везет пациента в ближайший госпиталь» не всегда оказывается верным.
2. Распределение пациентов
Если первая бригада заберет пациента в первый госпиталь, то второго пациента заберет вторая бригада, и так как первый госпиталь уже будет заполнен, повезет его во второй госпиталь. Время, за которое эвакуируют обоих, составит 120. Однако видно, что если первая бригада повезет пациента во второй госпиталь, то вторая сможет доставить своего пациента в первый, и тогда общее время составит 105.
Постановка задачи распределения пациентов Размерность задачи: b – бригады (1…B) i – итерации: 1 – приехать на место аварии и отвезти 1-го пациента, 2 – вернуться на место аварии и отвезти 2-го пациета,... (1…PQ), где PQ - число пациентов. h – госпитали (1…H) Постановка: 1.Набор булевых переменных Pbih (везем или нет пациента бригадой b на итерации i в госпиталь h). Если нет булевых, то целочисленные от 0 до 1. 2.Вспомогательные булевые переменные i > 1: Rbih (вспомогательная переменная для определения, нужно ли бригаде b возвращаться на место аварии после итерации i – 1) 3.Вспомогательная переменная TEmax (максимальное время эвакуации пациента) 4. h: bi Pbih HCh (hospital capacity) 5.– bih Pbih – PQ (должны отвезти не меньше пациентов, чем требуется) 6. (b, i): h Pbih 1 (нельзя везти больше одного пациента за раз) 7. (b, i1, i2), i1 < i2: h Pbi1h – h Pbi2h 0 (нельзя везти на итерации, если не везли на предыдущей итерации) 8. (b, i, h), i > 1: h Pbih + Pb,i-1,h – Rbih 1 (связь R и P) 9. (b, i), i = 1: h Pbih (ATb + HTbh) – TEmax 0 (b, i), i > 1: h Pb1h (ATb + HTbh) + ik=2 h HTbh ( Pbih + Rbih) – TEmax 0 Цель: Минимизировать TEmax, изменяя Pbih, Rbih.
Постановка задачи распределения пациентов Для каждой бригады задается дерево возможных путей. Чтобы не строить все дерево сразу и не хранить его в память, оно строится динамически, т.е. на каждом шаге вычисляются возможные направления следующего шага, совершенные шаги сохраняются, т.о. получаем путь, пройденный бригадой. Рассматриваются все пути, выбирается минимальный. Количество шагов равно количеству отвезенных пациентов. Цель: варьируя количество пациентов, доставленных каждой бригадой, минимизировать общее время доставки пациентов.
Входные данные % hospital capacity(hospital nuber, capacity) hc(1,1). hc(2,2). % arrival time /to disaster/ (N brigade, time) at(1,5). at(2,20). % time to hospital (N brigade, N hospital, time) ht(1,1,10). ht(1,2,100). ht(2,1,10). ht(2,2,100).
Реализация задачи распределения пациентов :- use_module(library('clp/bounds')). :- consult(conditions). :- consult(inc_arr). % path(N brigade, N from, N to, path time) path(Br,0,B,T) :- at(Br,AT), ht(Br,B,HT), T #= AT + HT. path(Br,A,B,T) :- ht(Br,A,HT1), ht(Br,B,HT2), T #= HT1 + HT2. % store path to list [A,B,T] step(Br,A,B,T,[A,B,T]) :- path(Br,A,B,T).
Реализация задачи распределения пациентов % route(N brigade, N from, N to, path time, Ps - edges list, HC - total quantity of patients delivered to each hospital before this route, HC - total quantity of patients delivered to each hospital after this route, Pq - number of patients) route(_,X,X,0,[],HC,HC,0). route(Br,X,Y,T,Ps,HC,HCnew,Pq) :- %write('3333 '), nl, Pq #> 0, Pq1 #= Pq - 1, route(Br,X,Z,T1,Ps1,HC,HC1,Pq1), step(Br,Z,Y,T2,Ps2), inc(Y,_,HC1,HCnew), nth1(Y,HCnew,Hc1), hc(Y,Hc2), Hc1 =< Hc2, T #= T1 + T2, solution(BT,_,_), T < BT, Ps = [Ps1|Ps2].
Реализация задачи распределения пациентов %mutual(T - max time for all brigades, Ps - edges list of all brigades, HC - total quantity of patients delivered to each hospital, PQ - sum of patients) %example: mutual(T,Ps,HC,2). mutual(PQ):- [PQ1,PQ2] in 0..PQ, PQ1 + PQ2 #= PQ, HC1 = [0,0], route(1,0,_,T1,Ps1,HC1,HC2,PQ1), route(2,0,_,T2,Ps2,HC2,HC,PQ2), Ps = [Ps1, #|Ps2], T #= max(T1,T2), retract(solution(_,_,_)), asserta(solution(T,Ps,HC)), fail.
Реализация задачи распределения пациентов % solve(TE - total time, PS - list of routs for brigades ([route of Br1 # rout of Br2]), HC - total quantity of patients delivered to each hospital, PQ - number of patients to save) % example: solve(TE,PS,H,2). solve(TE,PS,HC,PQ):- asserta(solution(10000,ps,hc)), not(mutual(PQ)), retract(solution(TE,Ps,Hc)), flatten(Ps,PS), flatten(Hc,HC).
Реализация задачи распределения пациентов Запрос к системе: ?- solve(TE,PS,H,2). Ответ: TE = 105, PS = [0, 2, 105, #, 0, 1, 30], H = [1, 1]
Направление работ в будущем Автоматизация получения входных данных для задачи распределения пациентов по исходным данным задачи и результатам решения задачи поиска кратчайших путей Ускорение решения задачи распределения пациентов Решение задачи поиска кратчайших путей Связь с графическим модулем приложения