• 沒有找到結果。

Wedjat 的功能模組如圖 19 所示。Wedjat 的核心是藥物排程器 (Medication Scheduler),

負責安排使用者的服藥時程,動態更新修改時程。Wedjat 前端的功能模組負責處理輸入 的資料,Wedjat 從遠端系統接收使用者的處方籤 (xml 檔案格式),然後經由 XML Parser 解析資料,再經由 SQL Server Mobile 將資料輸入至手機的資料庫,與資料庫內存的用 藥指示整合為 MSS,所以 SQL 裡存有排程所需的資訊 MSS 以及藥物相關的資訊、注意 事項等等。排程器排程時,會向 SQL Server Mobile 查詢藥物的 MSS 資訊。Wedjat 後端 的功能模組負責處理輸出的資料,排程器會將排程的結果,經由 Calendar API 寫入行事 曆,並監控使用者的服藥行為,做動態的反應。如果使用者按下服藥確認鍵,排程器會 輸出服藥紀錄。如果使用者錯過服藥,排程器會動態的修改時程,更新 Calendar 的內容,

或者對使用者發出相對應的警示訊息。

48

圖 19: Wedjat 功能模組

Wedjat 的類別物件 (class diagrams) 分為兩大類: Medication Scheduling Specification,

Medication Scheduler。圖 20 的內容是我們實作 MSS 的資料結構,用來處理藥物相關的 資訊與服用規則。藥物排程器的模組細節如圖 21 所示,這個部分是整個 Wedjat 的核心,

負責運算所有藥物的時程。它為每種藥物產生一個 JobModel 和一個 ResourceModel 物件,這部分是實作 Resource Model 的概念,每一個 JobModel 物件裡會有每一種藥 目前要排程的工作 (job) 的資訊,也就是下一個需要被排程的劑量,deadline 的初始 值為 nsmin,之後的值為上一個工作的起始時間加上 asmax。 ResourceModel 物件 則是用來確保藥物的劑量間的時間間隔與衝突劑量間的時間間隔,它擁有兩個整數陣列 resource 和 processor,陣列裡的每一個元的初始值為 0,當某一工作被排程時,會占用 processor k 個時間單位,k 為該工作執行的時間,所以會從該工作的起始時間往後占用 k 的時間單位,這段時間的 processor 會被設為 1。當被排程的藥物有衝突藥物時,它會 占用衝突藥物的 resource,從該工作的起始時間往前占用 minFrInterferer,往後占用

49

minToInterferer,也就是將該時間段的 resource 設為 1。只有在 processor 和 resource 皆 為 0 時,工作才能被開始執行。MIS 是藥物排程器輸出的服藥時程,是一個 List 的資 料型態,每一個紀錄藥物的 ID,需服用的時間與劑量。

Medicine Priority 實作了第二章介紹的 5 種藥物優先順序的決定方式,EDF 只適用於 ODAT 演算法。

Class MSS{

int med_id; DosageParameters dp;

List<InteractionParameters> ip;

}

Class DosageParameters{

int T;

int nsmin, nsmax, asmin, asmax;

inr dmin, dmax, Dmin, Dmax;

int B, R, L, P;

}

Class InteractionParameters{

int med_id; int mintoInterferer;

int minFrInterferer;

}

圖 20: 藥物排程規格書相關類別

Class MedicationScheduler{

int feasibleSchedule;

public bool OMAT(List<MSS> mss,

PrioritySchemes ps, ref List<MIS> mis);

public bool ODAT(List<MSS> mss,

PrioritySchemes ps, ref List<MIS> mis);

private void SetDoseSize(List<MSS> mss, ref List<MIS> mis);

private void SetProcessor(int latestStartTime, MSS mss, ref ResourceModel rm);

private void SetResource(int med_id, List<MIS> mis, List<MSS> mss, ref ResourceModel rm);

}

Class ResourceModel{

int[] resource = new int[T];

int[] processor = new int[T];

bool feasible = TRUE; List<int> schedule = NULL;

int priority = 0;

}

Class JobModel{

int release_time = 0;

int execution_time = ns_min;

int deadline = release_time + execution_time;

}

Class MIS{

int med_id; int time; int dose_size;

}

Enum PrioritySchemes{RM, MVF, MIF, SSDF, EDF};

圖 21: 藥物排程相關類別

50

相關文件