انجام پایان نامه

درخواست همکاری انجام پایان نامه  بانک مقالات رایگان انجام پایان نامه

سفارش پایان نامه

|

انجام پایان نامه ارشد

 پایان نامه 

مشاوره پایان نامه| تریگر های فازی در پایگاه داده فعال



5-3-1- روش محاسبه کميت سنج هاي فازي:

براي محاسبه کميت فازي از دو روش مي توان استفاده کرد. يکي روش محاسبه عمومي است و ديگري روش محاسبه جزئي است. در روش محاسبه عمومي که آقاي ولسکي و همکارانش در ]3[  معرفي کردند مجموع خروجي تابع عضويت گزاره B براي تمامي رکوردها را مي بايد بر تعداد کل رکوردهاي جدول اطلاعاتي تقسيم نمود و سپس عدد بدست آمده را که عددي بين صفر و يک مي باشد را بعنوان مقدار ورودي تابع عضويت کميت سنج Q قرار مي دهيم تا درجه درستي کل رکوردهاي قرار گرفته در شرط فازي برآورد شود. اما از اين روش نمي توان در فازي سازي رونوشت برداري استفاده نمود بعلت آنکه در اين روش داده هاي غير ضرور که در شرايط فازي رونوشت برداري قرار ندارند نيز در محاسبات فازي دخيل مي باشند، از اين رو روش جديدي را جهت محاسبه کميت سنج هاي فازي ارائه مي کنم و از آن به روش محاسبه جزئي نام مي بريم. کميت سنج فازي جزئي بر اساس رکوردهاي هدف محاسبه مي شود.
 رکوردهاي هدف عبارتند از تمام رکوردهاي ثبت شده جديدي که شرط گزاره فازي را برآورده مي سازند و بعد از آخرين عمل همگام سازي درج شده اند. مقدار ورودي تابع عضويت کميت سنج جزئي عبارتست از تعداد رکوردهاي هدف. در اين روش محاسباتي جديد براي کميت سنج جزئي از جملات زباني مانند تعداد کمي(few) و تعداد زيادي (many) و امثالهم استفاده مي شود. دامنه اين جملات زباني جديد R+ مي باشد. بعد از هر عمل همگام سازي در روش رونوشت برداري فازي مجموعه هدف که شامل تمامي رکوردهاي هدف مي باشد تهي مي گردد و بعد از عمل همگام سازي هر تغيير رکورد جديد که شرط فازي را براورده مي سازد در مجموعه هدف جهت استفاده در محاسبات کميت سنج جزئي اضافه خواهد شد.
 ابتدا روش محاسبه عمومي را با ذکر مثالي تشريح و در ادامه به بيان روش جديد محاسبه جزئي و تغييراتي که بايد در سيستم محاسباتي لحاظ شود پرداخته خواهد شد.

5-3-2- کميت سنج عمومي:

براي اينکه مفهوم کميت سنجي فازي با معنا شود نياز به تعريف روشي است که بتواند تعداد عناصر يک مجموعه فازي را بشمارد. از اينرو مفهوم سيگما-کانت (sigma-count) براي اين منظور استفاده مي شود. فرض کنيد F يک زير مجموعه فازي از   باشد که به شکل   نمايش داده مي شود. در اينصورت سيگما-کانت F بصورت جمع رياضي درجه عضويت عناصر F مي باشد، براي مثال:
 
تفسير گزاره "Q A's ARE B"  در دو گام انجام مي شود. در گام اول عناصر مجموعه A را در B محاسبه مي کنيم. از مفهوم سيگما-کانت نسبي (relative sigma-count) که بصورت   نمايش داده مي شود براي اين منظور استفاده مي کنيم که به صورت زير محاسبه مي شود:
 

سيگما-کانت نسبي A در B به آساني توسط تابع عضويت A و B محاسبه مي شود. هنگاميکه A يک مجموعه خشک  باشد، بعنوان مثال   ، سيگما-کانت نسبي بصورت زير محاسبه مي شود:
 
گام دوم محاسبه درستي کل گزاره "Q A's ARE B"  مي باشد. براي اين منظور مي بايد خروجي سيگما-کانت نسبي يعني  ρ را بعنوان ورودي تابع عضويت مجموعه فازي Q قرار دهيم که آنرا با Q()  نمايش مي دهيم[3].

مثال1: فرض کنيد عبارت فازي "most motors ARE hot" را مي خواهيم ارزيابي کنيم و همچنين اطلاعات زير را داشته باشيم:
- مجموعه مقادير دماي موتورها عبارتست از A={140, 130, 90, 150, 160}
- کميت سنج فازي most نيز بصورت مقابل تعريف شده است: Triangular(0.6, 0.8, 1)
- متغير زباني hot نيز بصورت روبرو تعريف شده است: Trapezoidal(120, 140, 300, 300)

حال در گام اول بر اساس فرمول محاسباتي سيگما-کانت نسبي مي توان گزاره موتورهاي داغ را از مجموعه موتورها بصورت زير محاسبه کرد:
 
نهايتا" در گام دوم درستي گزاره " most motors ARE hot"  توسط تابع عضويت Q بصورت مقابل محاسبه مي شود:
 
در اين مثال با اطلاعات داده شده ميزان درستي گزاره برابر 0.5 مي باشد.


مثال2: فرض کنيد عبارت فازي "most Sales ARE mediumSale" را مي خواهيم ارزيابي کنيم و همچنين اطلاعات زير را داشته باشيم:
- مجموعه مقادير فروش رفته عبارتست از Sales={200, 15, 550, 25, 400}
- کميت سنج فازي most نيز بصورت مقابل تعريف شده است: Triangular(0.6, 0.8, 1)
- متغير زباني mediumSale  بصورت روبرو تعريف شده است: Trapezoidal(10, 20, 450, 500)

حال در گام اول بر اساس فرمول محاسبتي سيگما-کانت نسبي مي توان گزاره فروشهاي متوسط را از مجموعه فروشها بصورت زير محاسبه کرد:
 
نهايتا" در گام دوم درستي گزاره "most Sales ARE mediumSale"  توسط تابع عضويت Q بصورت مقابل محاسبه مي شود:
 
در اين مثال با اطلاعات داده شده ميزان درستي گزاره برابر 0.5 مي باشد.
5-3-3- کميت سنج جزئي (روش جديد):

اين روش تغيير يافته روش عمومي است که براي حذف مشکل آن در فازي سازي رونوشت برداري تعريف خواهم کرد. در اين روش بجاي محاسبه سيگما-کانت نسبيF  که باعث مداخله رکوردهاي غير هدف در محاسبات مي شوند زير مجموعه اي از مجموعه F = {(u, F(u)) / u U} به نام  مجموعه هدف F بصورت ӨF= {u / (u, F(u)) F, F(u) > 0}  تعريف مي شود. مجموعه هدف شامل رکوردهايي از مجموعه F است که شرايط گام اول محاسبه گزاره "Q A's ARE B"  را براورده مي کند، پس ӨF مجموعه اي است شامل تمامي رکوردهايي از F که قسمت اول گزاره فازي يعني A's ARE B را محقق مي سازد.

تفسير گزاره "Q A's ARE B"  در دو گام انجام مي شود. در گام اول تعداد عناصر مجموعه A را در B محاسبه مي کنيم. از مفهوم سيگما-کانت هدف (goal sigma-count) که بصورت Count(ӨF)  نمايش داده مي شود براي اين منظور استفاده مي کنيم که به صورت زير محاسبه مي شود:

ρ=Count(ӨF) =Cardinality(ӨF)

گام دوم محاسبه درستي کل گزاره "Q A's ARE B"  مي باشد. براي اين منظور مي بايد خروجي سيگما-کانت هدف يعني  ρ را بعنوان ورودي تابع عضويت مجموعه فازي Q قرار دهيم که آنرا با Q()  نمايش مي دهيم.

مثال1: فرض کنيد عبارت فازي "many motors ARE hot" را مي خواهيم ارزيابي کنيم و همچنين اطلاعات زير را داشته باشيم:
- مجموعه مقادير دماي موتورها عبارتست از A={140, 130, 90, 150, 160}
- کميت سنج فازيmany  نيز بصورت مقابل تعريف شده است: Triangular(3, 5, 7)
- متغير زباني hot نيز بصورت روبرو تعريف شده است: Trapezoidal(120, 140, 300, 300)

گام اول:  مجموعه هدف موتورهاي داغ (مجموعه موتورهايي که شرط داغ بودن را برآورده ساخته اند) عبارتست از:
ӨF = {140, 130, 150, 160}

تعداد موتورهاي داغ در مجموعه موتورها بر اساس فرمول سيگما-کانت هدف عبارتست از:
ρ=Count(ӨF) =Cardinality(ӨF)=4

نهايتا" در گام دوم درستي گزاره " many motors ARE hot"  توسط تابع عضويت Q بصورت مقابل محاسبه مي شود:
Q()=Q(4)=0.5

در اين مثال با اطلاعات داده شده ميزان درستي گزاره برابر 0.5 مي باشد.

در روش محاسبه کميت سنج عمومي مقدار ρ عددي بين صفر و يک است و کليه جملات زباني مجموعه فازي Q مانند most  بر روي بازه اعداد صفر تا يک نقش مي شوند. اما در روش محاسبه کميت سنج جزئي عدد ρ هر مقدار بزرگتر يا مساوي صفر مي باشد و جملات زباني مجموعه فازي Q مانند many در بازه اعداد بزرگتر از صفر قابل تعريف مي باشند. پس مجموعه فازي Q در روش اول با روش دوم متفاوت است و قابليت بيشتري را در تعريف کميت سنجهاي فازي جهت استفاده براي عمل رونوشت برداري فازي در اختيار قرار مي دهد. هر چند که بعضي از جملات زباني در اين روش جديد قابل تعريف نمي باشند. به عنوان مثال جملاتي مانند most يا usually که در روش محاسباتي نسبي قابل تعريف مي باشند در اين روش جديد نمي توان استفاده نمود، زيرا کميت most  بر روي تمامي رکوردهاي يک جدول اطلاعاتي تعريف مي شود که در روش جديد سعي شد رکوردهاي غير هدف از محاسبات حذف گردند. در عوض با اين روش مي توان از کميت سنج هاي جديدي مانند many يا few و a little و غيره استفاده نمود.

مثال2: فرض کنيد عبارت فازي "many Sales ARE mediumSale" را مي خواهيم به روش تعدادي ارزيابي کنيم و همچنين اطلاعات زير را داشته باشيم:
- مجموعه مقادير فروش رفته عبارتست از Sales={200, 15, 550, 25, 400}
- کميت سنج فازي many نيز بصورت مقابل تعريف شده است: Triangular(3, 5, 7)
- متغير زباني mediumSale نيز قبلا در مجموعه فازي SaleFuzzySet بصورت روبرو تعريف شده است: Trapezoidal(10, 20, 450, 500)

گام اول: در اين مثال مجموعه هدف Sales عبارت است از:
ӨF ={200, 15, 25, 400}
همچنين ورودي تابع عضويت مجموعه Q يعني ρ عبارت است از:
ρ = Cardinality(ӨF) = 4

گام دوم: با ترسيم تابع عضويت many مشخص مي شود که به ازاي 4 = ρ مقدار Q() برابر 0.5 خواهد شد:
                     Q()=Q(4)=0.5


5-3-4- کميت سنج جزئي توسعه يافته:

ما از کميت سنجهاي فازي جزئي مانند many بجاي کميت سنجهاي عمومي مانند most براي عمل رونوشت برداري استفاده مي کنيم ولي همچنان مي توان نو آوري هايي در آن براي رونوشت برداري فازي ايجاد کرد. فرض کنيد بجاي گزاره فازي “many motors are hot” گزاره فازي جديدي مانند “many motors are hot quantified with AmountField” داشته باشيم. اين گزاره در حالت کلي بصورت “Q A’s ARE B Quantified with C” مي باشد که بدين معناست  Q عنصر از مجموعه A شرط فازي B را براورده کند و تعداد (مقدار) رکورد جاري که باعث ايجاد رويداد شده است برابر C مي باشد. در اين حالت روش محاسبه بشکل زير است:

فرض کنيد F يک زير مجموعه فازي از U = {u1, …, un}  باشد که به شکل زير نمايش داده مي شود:
F = {(u, F(u), C(u)) / u U}
 در اينصورت مجموعه هدف ӨF بصورت زير تعريف مي شود :
ӨF= {(u, C(u)) / (u, F(u), C(u)) F, F(u) > 0}

در اين حالت سيگما-کانت ӨF بصورت مجموع مجموع مقادير C در مجموعه عناصر ӨF مي باشد:
Count(ӨF)  C(ӨFi) i=1,…,n

تفسير گزاره “Q A’s ARE B Quantified with C” در دو گام انجام مي شود. در گام اول تعداد (مقدار) عناصر مجموعه A را در B محاسبه مي کنيم. از مفهوم سيگما-کانت هدف (goal sigma-count) که بصورت Count(ӨF)  نمايش داده مي شود براي اين منظور استفاده مي کنيم که به صورت زير محاسبه مي شود:
ρ =  Count(ӨF)  C(ӨFi) i=1,…,n

گام دوم محاسبه درستي کل گزاره “Q A’s ARE B Quantified with C” مي باشد. براي اين منظور مي بايد خروجي سيگما-کانت هدف يعني  ρ را بعنوان ورودي تابع عضويت مجموعه فازي Q قرار دهيم که آنرا با Q() نمايش مي دهيم.

مثال: فرض کنيد عبارت فازي "many motors ARE hot quantified with AmountField" را مي خواهيم ارزيابي کنيم و همچنين اطلاعات زير را داشته باشيم:
- مجموعه مقادير دماي موتورها بصورت زوجهاي (T, C) مي باشد که T دماي موتور و C همان AmountField مي باشد که بيانگر تعداد موتورهايي است که داراي اين دما مي باشند، که اين مجموعه بصورت زير مي باشد:
 A={(140,1), (130,2) , (90,1), (150,2), (160,1)}

- کميت سنج فازيmany  نيز بصورت مقابل تعريف شده است: Triangular(3, 5, 7)
- متغير زباني hot نيز بصورت روبرو تعريف شده است: Trapezoidal(120, 140, 300, 300)

گام اول:  مجموعه هدف موتورهاي داغ (مجموعه موتورهايي که شرط داغ بودن را برآورده ساخته اند) عبارتست از:
ӨF = {(140,1), (130,2), (150,2), (160,1)}

تعداد موتورهاي داغ در مجموعه موتورها بر اساس فرمول سيگما-کانت هدف عبارتست از:
ρ=Count(ӨF)
  = C(ӨFi) i=1,…,n =4
  = (1, 2, 2, 1) = 6

نهايتا" در گام دوم درستي گزاره "many motors ARE hot quantified with AmountField" توسط تابع عضويت Q بصورت مقابل محاسبه مي شود:
Q()=Q(6)=0.5

در اين مثال با اطلاعات داده شده ميزان درستي گزاره برابر 0.5 مي باشد.


5-4- روش جديد محاسبه حد آستانه در تريگرهاي فازي براي رونوشت برداري فازي:

بطور معمول براي ارزيابي يک گزاره فازي مانند "many motors ARE hot threshold 0.3" اگر خروجي تابع عضويت عبارت فازي  " ARE hot" بزرگتر از 0.3 باشد و شرط many نيز براورده شده باشد آن گزاره درست ارزيابي مي شود. اما در رونوشت برداري فازي با گزاره هاي فازي مانند        "many motors ARE hot quantified wiyh AmountField threshold 0.3" سروکار داريم. در اين حالت فقط درستي شرط " ARE hot" براي رونوشت برداري کاربردي ندارد. ما مقدار جديدي را بنام α تعريف مي کنيم که بايد با حد آستانه مقايسه شود. مقدار α برابر است با بيشترين مقدار Q() و F(u) :
α = Max(Q(), F(u) )

در اين مثالQ() عبارتست از خروجي تابع عضويت کميت سنج فازي جزئي many ، قسمت 5-3-4 را ملاحضه کنيد. همچنين F(u) عبارتست از ميانگين وزني F(u) که F(u) خروجي تابع عضويت جمله فازي اصلي مانند " ARE hot" مي باشد:
F = {(u, F(u), C(u)) / u U}
ρ =  Count(ӨF)  C(ӨFi) i=1,…,n

F(u) = [ Fi (u) Ci (u) Ci (u)
α = Max(Q(), F(u) )

اگر α بزرگتر از حدآستانه 0.3 باشد گزاره فازي "many motors ARE hot quantified wiyh AmountField threshold 0.3" درست ارزيابي مي شود. اگر گزاره فازي درست ارزيابي شود آن وقت رونوشت بردار فازي عمل همگام سازي را شروع مي نمايد.
اما چرا بيشترين مقدار Q() و F(u) بعنوان حدآستانه تعريف مي شود؟             
گزاره فازي  "many motors ARE hot quantified wiyh AmountField threshold 0.3" را در نظر بگيريد. اگر هر رکوردي مانند F که در جدول موتورها درج مي شود داراي تابع عضويت F باشد و مقدار F هميشه کمتر از حد آستانه 0.3 باشد در اينصورت هيچگاه عمل همگام سازي آغاز نخواهد شد حتي اگر کميت سنج فازي many درست ارزيابي شده باشد و داراي مقداري بزرگتر از 0.3 باشد. در اين حالت هر تعداد رکورد ديگري هم درج شود که F آن کمتر از حد آستانه 0.3 باشد باز هم عمل همگام سازي آغاز نخواهد شد. ما براي جلوگيري از چنين اتفاقي ماکزيمم مقدارQ() و F(u) را بعنوان حد آستانه تعريف مي کنيم تا هيچگاه عمل همگام سازي معلق باقي نماند.

5-5- معماري ماشين رونوشت بردار فازي
معماري يک ماشين رونوشت برداري فازي با استفاده از تريگرهاي فازي مطابق با شکل زير مي باشد.









در اين معماري وظيفه استخراجگر تشخيص تغييراتي است که بوسيله DML روي مي دهند و نگهداري آن تغييرات در DML History مي باشد. وظيفه ديگر استخراجگر در روش فازي شده رويدادهاي فازي و نگهداري آنها در Event History مي باشد.  مثلا اگر يک تريگر براي گزاره فازي  "many motors ARE hot quantified wiyh AmountField threshold 0.3" تعريف شده باشد در اينجا يک رويداد فازي که در Event History ذخيره مي گردد آن رويدادي است که فقط بتواند شرط "ARE hot" را برآورده سازد و اين رويداد بعنوان يک رويداد ساده در Event History ذخيره مي شود تا جهت محاسبات کميت سنج فازي جزئي اين مثال يعني many در دسترس باشد. در حقيقت many  يا هر کميت سنج ديگري بدنبال يک رويداد مرکب در Event History مي گردد. اگر قانون فازي تريگر برآورده شود يعني رويداد مرکب تعريف شده آن قانون به وقوع بپيوندد آنگاه اعمالگر موتور رونوشت برداري فازي وظيفه دارد کليه تغييرات ايجاد شده از آخرين همگام سازي تا کنون را در پايگاه داده مقصد اعمال کند. پس از اعمال تغييرات در مقصد و اتمام عمل همگام سازي کليه رويدادهاي ساده ذخيره شده در Event History مي بايد حذف گردند.
هر رکورد در Event History حداقل شامل سه فيلد اطلاعاتي مي باشد که عبارتند از نام قانون، F(u), C(u) که نام قانون همان نام تريگر مي باشد و u رکورد حاصل از تغييرات است و C(u) فيلد تعداد يا مقدار رکورد u مي باشد و F(u) درجه تعلق آن رويداد در شرط فازي مانند "ARE hot" مي باشد، براي توضيحات بيشتر قسمت 5-3-4 مشاهده گردد.

در اين معماري هر قانوني که مي تواند آغازگر عمل رونوشت برداري باشد بايد بوسيله تريگرهاي فازي تعريف شود. هر تريگر فازي در حکم استخراجگر موتور رونوشت برداري مي باشد و وظيفه دارد هر تغييري را که بر روي يک جدول پايگاه داده مبداء روي مي دهد تشخيص داده و آنها را در DML History ذخيره نمايد، و اگر آن تغييرات شرط فازي تريگر را برآورده ساختند آنرا بعنوان يک رويداد در Event History ذخيره نمايد.اين رويداد و ساير رويدادهاي ذخيره شده در Event History توسط بخش کميت سنج تريگر بررسي مي شوند و اگر از لحاط کمي نيز شرط کميت سنج برآورده شود آنگاه تريگر فازي اعمالگر را جهت ارسال تغييرات از DML History به پايگاه داده مقصد فرا مي خواند.

5-6- مثال: فرض کنيد ماشين رونوشت برداري فازي بوسيله تريگر فازي زير تعريف شده باشد.

Create Fuzzy Trigger RepSold On Sold
For Insert,Update, Delete
When few GoodsCost IS very BigSale QUANTIFIED WITH GoodsAmount THRESHOLD 0.3
SendAllUpdateTo TargetServer.TargetDB


و جدول فروش رفته ها يعني Sold حداقل داراي فيلدهاي قيمت فروش کالا (GoodsCost) و تعداد کالاي فروش رفته (GoodsAmount) باشد و اگر هر رکورد مانند ui که در Sold ثبت مي شود را بصورت <ui, CostField, AmountField> نمايش دهيم و نيز يک کاربر پنج رکورد را به ترتيب زير در Sold ثبت کند:
<u1, 500, 3>, <u2, 40500, 2>, <u3, 2500, 5>, <u4, 41000, 4>, <u5, 46000, 3>

متغير زباني bigSale بصورت TRAPEZOIDAL(40000, 45000, 85000, 90000) تعريف شده مي باشد و متغير زباني few بصورت TRAPEZOIDAL(5, 10, 20, 25) مي باشد. همچنين very بصورت توان دوم F(u) تعريف شده است که F(u) درجه تعلق ui در متغير زباني bigSale مي باشد:

veryF(u) =  power(F(u), 2)

با ثبت هر رکورد در جدول Sold توسط کاربر عمليات زير بوسيله تريگر فازي بر روي اجزاء ماشين رونوشت برداري فازي انجام مي شود:
Iteration 1: insert <u1, 500, 3>
DML history={u1}
F(u)=0
Event history={}

چونکه F(u) صفر حاصل شده در نتيجه رويدادي در Event history ذخيره نمي شود و فقط تغييرات ايجاد شده در DML history ذخيره مي گردد.
Iteration 2: insert <u2, 40500, 2>
DML history={u1, u2}
F(u)=(40500-4000)/(45000-40000)=0.1
veryF(u) =  power(F(u), 2)=(0.1)^2=0.01
C(u)=2

Event history={(bigSale, 0.01, 2)}
ӨF = {<u2, 40500, 2>}
ρ=Count(ӨF) =C(ӨFi) i=1,…,n =2
Q()=Q()= 0  no synchronization

در اين مرحله با ثبت رکورد u2 درجه تعلق رکورد يعني veryF(u) برابر 0.01 شده است و به همين دليل مي بايد اين رويداد در Event history ذخيره شود. البته درجه تعلق رويدادهاي مجموعه هدف ӨF در کميت سنج فازي جزئي يعني Q() صفر شده است. چون Q() صفر شده است ديگر محاسباتي انجام نمي شود. در صورتيکه Q() صفر نبود مي بايد ماکزيمم بين دو عدد Q() و F(u) با حد آستانه 0.3 مقايسه مي شد.(در هر صورت تغييرات رکورد در DML history ذخيره مي گردد).

Iteration 3: insert <u3, 2500, 5>
DML history={u1, u2, u3}
F(u)=0  no synchronization
Event history={(bigSale, 0.01, 2)}

در اين مرحله چون F(u)=0 رويدادي در Event history ذخيره نمي شود ولي تغييرات ايجاد شده در DML history ذخيره مي گردد.

Iteration 4: insert <u4, 41000, 4>
DML history={u1, u2, u3, u4}
F(u)=(41000-4000)/(45000-40000)=0.2
veryF(u) =  power(F(u), 2)=(0.2)^2=0.04
C(u)=4
درجه تعلق رکورد يعني veryF(u) برابر 0.04 شده است و به همين دليل مي بايد اين رويداد در Event history به تعداد C(u) ذخيره شود:
Event history={(bigSale, 0.01, 2), (bigSale, 0.04, 4)}
بنابر اين مجموعه هدف عبارتست از:
ӨF = {<u2, 40500, 2>, <u4, 41000, 4>}
ρ=Count(ӨF) =C(ӨFi) i=1,…,n =2+4=6

Q()=Q()= (6-5)/(10-5)=0.2  > 0
check Max quantifiers for synchronization

چون درجه تعلق رکوردهاي مجموعه هدف يعني Q() در کميت سنج فازي جزئي برابر 0.2 و بزرگتر از صفر مي باشد در نتيجه بايد آلفا جهت مقايسه با حد آستانه محاسبه شود که ابتدا ميانگين وزني درجه تعلق رکوردهاي هدف محاسبه مي شود:
F(u) = [ Fi (u) Ci (u) Ci (u)
            =[(0.01 * 2) + (0.04 * 4)] / (2+4) = 0.03

α = Max(Q(), F(u) )Max(0.2, 0.03)=0.2

α = 0.2   و   THRESHOLD = 0.3مي باشد و بعلت اينکه α  از حد آستانه کوچکتر مي باشد عمل همگام سازي انجام نمي شود.
Iteration 5: insert <u5, 46000, 3>
DML history={u1, u2, u3, u4, u5}
F(u)=1
veryF(u) =  power(F(u), 2)=(1)^2=1
C(u)=3
veryF(u) بزرگتر از صفر است، بنابراين رويداد به مجموعه هدف اضافه مي گردد:


Event history={(bigSale, 0.01, 2), (bigSale, 0.04, 4), (bigSale, 1, 3)}

ӨF = {<u2, 40500, 2>, <u4, 41000, 4>, <u5, 46000, 3>}
ρ=Count(ӨF) =C(ӨFi) i=1,…,n =2+4+3   =9

درجه تعلق رکوردهاي مجموعه هدف در کميت سنج فازي جزئي بشکل زير محاسبه مي شود:

Q()=Q()= (9-5)/(10-5)=0.8
check Max quantifiers for synchronization

چون شرط کميت سنج فازي براورده شده است و بزرگتر از صفر است، بنابراين ميانگين وزني درجه تعلق رويدادهاي هدف در شرط فازيIS very BigSale  جهت محاسبه حد آستانه بصورت زير محاسبه مي گردد:

F(u) = [ Fi (u) Ci (u) Ci (u)
            = [(0.01 * 2) + (0.04 * 4) + (1 * 3)] / (2+4+3) = 0.35

α = Max(Q(), F(u) )Max(0.8, 0.35)=0.8

α = 0.8   و  THRESHOLD = 0.3بنابراين از حد آستانه بيشتر شده و عمل همگام سازي رونوشت برداري فازي مي بايد آغاز گردد و تمامي تغييرات نگهداري شده در DML history از زمان آخرين همگام سازي قبلي تا کنون بايد در پايگاه داده مقصد توسط اعمالگر ماشين رونوشت بردار فازي اعمال شود. در اين مثال چون آلفا 0.8 شده است در نتيجه تريگر فازي در اصطلاح fire مي شود و عمل همگام سازي را آغاز مي کند و کليه تغييرات DML history را به اعمالگر ارسال مي کند براي آنکه در پايگاه داده مقصد ايجاد نمايد. بعد از اتمام عمل همگام سازي Event history و DML history خالي مي شوند:
DML history={}
Event history={}
 Event history تهي مي شود زيرا کميت سنج فازي بتواند رويدادهاي بعدي را بدون دخالت رويدادهاي گذشته محاسبه کند، همچنين DML history تخليه مي شود که در همگام سازي بعدي اعمالگر بتواند آخرين تغييرات ارسال نشده به پايگاه داده مقصد را تشحيص دهد.

5-7- کارايي

از لحاظ تئوري روش رونوشت برداري فازي از روش رونوشت برداري مشتاق مي تواند بهتر باشد زيرا تاخيري که به سبب وجود دوره پوشش برنامه در روش مشتاق وجود دارد در روش فازي حذف مي گردد. همچنين روش فازي از رونوشت برداري تنبل نيز مي تواند بهترعمل کند زيرا در روش تنبل دوره پوشش رونوشت برداري وجود دارد که ممکن است در اين بازه زماني رويدادهاي مهمي بوجود آيند که مي بايد فورا" به مقصد ارسال شود ولي به علت وجود دوره پوشش رونوشت برداري به مقصد ارسال نشده و خسارتي را به همراه خواهد داشت در حاليکه در روش رونوشت برداري فازي به محض وقوع يک رويداد مهم عمل ارسال تغييرات به مقصد فورا" آغاز خواهد شد. پس روش رونوشت برداري فازي مشکل دوره پوشش رونوشت برداري روش تنبل را نيز حل نموده است.
اما از نظر عملي مي توان بهبود کارايي رونوشت برداري فازي را در مقايسه با روش مشتاق توسط نمودار ترافيک شبکه با ذکر يک مثال پياده سازي شده به شکل زير بيان نمود.

در اين پروژه عملي براي مقايسه روش فازي با روشهاي مشتاق و تنبل متداول گذشته چندين آزمايش صورت گرفت که در بدترين حالت از لحاظ ترافيک شبکه و بکارگيري شبکه روش فازي همانند روش مشتاق عمل مي نمود و در بهترين حالت همانند روش تنبل و يا بهتر از آن عمل مي نمايد. در ادامه با نمايش نمودار ترافيکي اين سه روش در يک آزمايش مياني و متوسط به توضيح بهبود کارائي توسط روش فازي نسبت به روش مشتاق مي پردازم.

قانون فازي مورد نظر جهت آغاز عمل رونوشت برداري فازي توسط تريگر زير تعريف مي شود:
Create Fuzzy Trigger RepSold On Sold
For Insert,Update, Delete
When few or medium or many GoodsCost IS very BigSale Quantified With GoodsAmount Threshold 0.3
SendAllUpdateTo TargetServer.TargetDB
براي اينکه بهبود کارايي شبکه در روش فازي مشخص شود از يک آزمايش در حالتي مياني به شکل زير ورود اطلاعات به جدول Sold صورت مي پذيرد:
2 record that fired fuzzy trigger RepSold
100 record that don't fired fuzzy trigger RepSold
2 record that fired fuzzy trigger RepSold
100 record that don't fired fuzzy trigger RepSold
2 record that fired fuzzy trigger RepSold
100 record that don't fired fuzzy trigger RepSold
2 record that fired fuzzy trigger RepSold
100 record that don't fired fuzzy trigger RepSold
2 record that fired fuzzy trigger RepSold
يعني ابتدا 2 رکورد که تريگر را fire مي سازد و عمل همگام سازي آغاز مي شود درج مي گردد و سپس يکصد رکورد که تريگر را فعال نمي سازد درج مي گردد و به همين ترتيب عمليات تکرار شده است که جمعا" 410 رکورد درج گرديده است. همچنين متغير هاي زباني استفاده شده در تريگر به شکل زير تعريف شده مي باشند:
متغيير زباني bigSale به شکل TRAPEZOIDAL(40000, 45000, 85000, 90000) مي باشد.
متغيير زباني few به شکل TRAPEZOIDAL(5, 10, 30, 35) مي باشد.
متغيير زباني medium به شکل TRAPEZOIDAL(30, 35, 95, 100) مي باشد.
متغيير زباني many به شکل TRAPEZOIDAL(95, 100, 995, 1000) مي باشد.
نتايج اين آزمايش براي Network utilization در ادامه به همراه گراف آن آورده شده است. اما Network utilization چيست؟
Network utilization عبارتست از نسبت ترافيک فعلي شبکه به بيشترين ترافيک ممکنه در شبکه که مي توان آنرا مديريت کند. اين معيار بيانگر پهناي باند استفاده شده در شبکه مي باشد. وقتيکه network utilization بالا باشد بدان معناست که شبکه مشغول مي باشد و وقتيکه پايين است بدان معناست که شبکه بيکار است.
5-7-1- ترافيک در رونوشت برداري مشتاق
 

با بررسي گراف ترافيک رونوشت برداري مشتاق مي توان گفت که روش مشتاق باعث ايجاد ترافيکي مستمر بر روي شبکه مي شود و همچنين از پهناي باند به خوبي استفاده نمي کند و در کل داراي network utilization پاييني مي باشد.

5-7-2- ترافيک در رونوشت برداري تنبل
 
روش تنبل در طول همگام سازي از حداکثر پهناي باند استفاده مي کند و network utilization بالايي دارد. همچنين اين روش ترافيک مستمري بر روي شبکه ايجاد نمي کند.

5-7-3- ترافيک در رونوشت برداري فازي
 

با بررسي گراف ترافيک شبکه روش فازي مي توان گفت که اين روش ترافيک منفصل و خوبي بر روي شبکه ايجاد مي کند و تقريبا" از حداکثر پهناي باند در طول دوره همگام سازي استفاده مي کند و network utilization بالايي دارد. در بدترين حالت روش فازي مانند روش مشتاق است و ترافيک کم و مستمري بر روي شبکه ايجاد مي کند و از حداکثر پهناي باند بهره نمي برد و network utilization پاييني خواهد داشت. اما در بهترين حالت يعني حالتي که دوره پوشش فازي برابر با دوره پوشش رونوشت برداري در روش تنبل باشد و يا بزرگتر از آن شود، روش فازي مشابه روش تنبل و يا بهتر از عمل مي نمايد و در طول همگام سازي از حداکثر پهناي باند استفاده کرده و network utilization بالايي دارد.

5-7-4- مقايسه تئوري هزينه رونوشت برداري فازي و تنبل:
در روش غير فازي و بصورت دوره اي با فرض اينکه دوره پوشش رونوشت برداري برابر  p باشد، اگر در زمان x متعلق به بازه [0,p] شرايط رونوشت برداري برآورده شود در صورتي که ارزش اطلاعات با گذشت زمان مطابق با تابع f(x) کاهش يابد (تابع کاهش سود يا تابع افزايش زيان f(x) باشد) در صورتي که حداکثر مقدار f(x) را برابر يک فرض کنيم، نمودار افزايش زيان يا کاهش سود به شکل زير است:

       

 

در صورتي که از روش رونوشت برداري فازي استفاده شود دوره پوشش رونوشت برداري يعني p  را مي توان دقيقا برابر لحظه اي که عمل رونوشت برداري آغاز مي شود دانست و بنابراين تابع کاهش سود يا افزايش زيان تابع f(x)=0 مي باشد:
 



همچنين تابع افزايش سود يا کاهش زيان g(x) مطابق با نمودار زير است:

 

5-8- جمع بندي
در اين پايان نامه ضمن تشريح مفاهيم موجود و کارهاي صورت گرفته در زمينه پايگاه داده هاي فعال، قوانين فازي و تريگرها، از تريگرهاي فازي در بهينه سازي عمل رونوشت برداري استفاده کرده و روش فازي جديدي را براي رونوشت برداري مطرح نمودم. همچنين برخي از مزيتهاي روش فازي شده نسبت به روش رونوشت برداري مشتاق و رونوشت برداري تنبل متداول قديمي مطرح شده و با آزمايشاتي، آنها را از نظر network utilization  مقايسه نمودم. اين پروژه که تا کنون در هيچ کجاي ديگري مطرح نشده است بر اساس ارزش اطلاعات و ضرورت بهنگام سازي فوري تغييرات در مقصد، هنگامي که رويداد خاصي اتفاق مي افتد ايجاد گرديد تا جنبه ديگري از کاربرد تريگرهاي فازي را در مکانيزه کردن ساير اجزاء پايگاه داده ها نمايش دهد.









فصل ششم: پياده سازي

پايگاه داده استفاده شده در اين پروژه Microsoft SQL Server 2000 مي باشد که يک پايگاه داده فعال مي باشد. اين پايگاه داده داراي قابليت مديريت داده ها و اشياء مي باشد. و مي تواند دستورات DML وDDL را  اجرا نمايد. همانطور که در فصول قبل به تفصيل اشاره شد رويدادهاي فازي را توسط قوانين مي توان تعريف نمود. هر قانون در اين پايگاه داده بصورت يک تريگر قابل تعريف مي باشد. بنابراين وظيفه تشخيص رويدادها در اين پايگاه داده بر عهده تريگرها مي باشد. تريگرها در پايگاه داده Microsoft SQL Server 2000 همانند جداول و ديدگاه ها بصورت اشياء ديتابيسي مي باشند. از طرفي تريگرها در اين پايگاه قادر به شناسايي رويدادهايي نظير Insert, Update, Delete مي باشند و قادر به تشخيص رويدادهاي فازي و يا رويدادهاي مرکب (مورد نياز کميت سنج ها) نمي باشند. بدين منظور بايد امکاناتي به سيستم اين پايگاه داده اضافه نمود که بتوان در آن تريگرهاي فازي را شبيه سازي نمود که قادر به تشخيص رويدادهاي فازي باشد.
6-1- Fuzzy SQL Server
در اولين گام از فازي کردن تريگرهاي پايگاه داده مي بايد محيطي را ايجاد کرد که در آن بتوان دستورات DDL جهت ايجاد تريگرهاي فازي را اجرا نمود. مدلي که در اين پروژه انجام شد به شکل زير مي باشد:
 
شکل(1-6): اجزاء يک Fuzzy SQL Server
مدل Fuzzy SQL Server براي تبديل دستورDDL فازي توليد تريگر فازي به دستورات DDL قابل قبول توسط Microsoft SQL Server 2000  که تمام اشياء لازم جهت شبيه سازي يک تريگر فازي را ايجاد مي کند طراحي شده است.

6-2- عملکرد اجزاي Fuzzy SQL Server:

Scanner: اين بخش ديستور تعريف داده(DDL) را از ورودي دريافت کرده و کليه نشانهاي آنرا (token) را بدست مي آورد و آنها را به تجزيه کننده (Parser) ارسال مي کند.

Parser: وظيفه اين بخش ساخت جدول نمادها (symbol table) براي تمام نمادهايي است که در دستور Fuzzy DDL آمده است.

DDL Generator: وظيفه اين بخش توليد دستورات تعريف داده (DDL) مورد قبول Microsoft SQL Server 2000 مي باشد و اين دستورات مي بايد کليه اشياء مورد نياز جهت شبيه سازي رفتار يک تريگر فازي را ايجاد نمايند.

Microsoft SQL Server: کليه دستورات تعريف داده ها توليد شده در فاز قبلي بوسيله اين واحد اجرا مي شود و اشياء مورد نياز ايجاد خواهد شد.

اما يک دستور تعريف داده فازي جهت توليد يک تريگر فازي مي بايد خود به چند دستور تعريف داده مورد قبول پايگاه داده منتخب تبديل مي شود تا بتواند کليه اشياء مورد نياز جهت شبيه سازي رفتار يک تريگر فازي را اريجاد کند. در ادامه به بررسي اين اشياء مي پردازم و چگونگي تبديل دستورات بررسي مي شود.
6-3- شبيه سازي تريگرهاي فازي در پايگاه داده غير فازي
جهت تجزيه يک تريگر فازي به اجزاء سازنده آن در سيستم شبيه سازي شده مي بايد عملکرد آنرا بر اساس معماري ارائه شده در شکل (5-5) بررسي نمود. در فصل قبل توضيح داده شد که يک تريگر فازي در نقش فازي سازي استخراجگر ماشين رونوشت برداري عمل مي کند. يک استخراجگر در رونوشت برداري فازي وظيفه دارد که کليه تغييرات روي جداول را در DML History نگهداري کند. پس اولين وظيفه يک تريگر فازي نگهداري تغييرات جداول در DML History مي باشد. استخراجگر علاوه بر نگهداري تغييرات وظيفه داشت در صورتي که شرط فازي قانون برآورده شود رويداد آن تغييرات را در Event History نگهداري کند. بر اين اساس دومين وظيفه يک تريگر فازي نگهداري رويدادهايي است که شرط فازي قانون را برآورده مي سازند. در آخر نيز گفته شد که استخراجگر با بررسي رويدادها در Event History در صورتي که شرط کميت سنج فازي قانون نيز برآورده گردد با محاسبه حد آستانه و مقايسه آن با حد آستانه قانون ، عمل همگام سازي را آغاز خواهد کرد. با اين تعريف سومين وظيفه يک تريگر فازي محاسبه کميت سنجهاي فازي جزئي تعريف شده براي قوانين است و در صورت برآورده شدن آن محاسبه حد آستانه و در نهايت فراخواني اعمالگر را انجام خواهد داد.

6-4- اجزاء تريگر فازي در پايگاه داده غير فازي
بطور کلي مي توان يک تريگر فازي را به سه جزء زير تقسيم کرد:
1.    قسمتي که وظيفه دارد تغييرات تشخيص داده شده را در DML History نگهداري کند.
2.    قسمتي که وظيفه دارد رويدادهايي را که شرط فازي قانون را برآورده مي سازند در Event History ذخيره نمايد.
3.    قسمتي که وظيفه دارد Event History را جهت محاسبه کميت سنج فازي جزئي بررسي و در صورت برآورده شدن شرط کميت، محاسبه حد آستانه و فراخواني اعمالگر جهت ارسال تغييرات به پايگاه داده مقصد را انجام مي دهد.

در اين پايان نامه هر يک از سه قسمت ياد شده بصورت يک تريگر بر روي جداول سيستمي رونوشت برداري فازي يعني DML History , Event History تعريف مي شوند. بنابراين هر دستور تعريف داده فازي مانند Fuzzy DDL که تعريف کننده يک تريگر فازي مي باشد خود به سه دستور DDL مورد قبول پايگاه داده انتخاب شده تبديل مي شود که عمل ايجاد اين سه دستور جديد توسط DDL Generator انجام مي شود.
6-5- جداول سيستمي مورد نياز:
يکي از جداول پايه که کليه مجموعه هاي فازي در آن تعريف مي شوند جدول FuzzySets مي باشد که ساختاري مطابق زير دارد:
CREATE TABLE [FuzzySets] (
    [FuzzySetName] [char] (50)  NOT NULL ,
    [FuzzyTerm] [char] (50)  NOT NULL ,
    [a] [decimal](18, 2) NULL ,
    [b] [decimal](18, 2) NULL ,
    [c] [decimal](18, 2) NULL ,
    [d] [decimal](18, 2) NULL ,
    CONSTRAINT [PK_FuzzySets] PRIMARY KEY  CLUSTERED
    (
        [FuzzySetName],
        [FuzzyTerm]
    )  ON [PRIMARY]
) ON [PRIMARY]
GO
در جدول FuzzySets امکان تعريف متغيرهاي زباني به اشکال ذوزنقه اي و مثلثي مي باشد.

جدول سيستمي ديگري که جهت نگهداري تغييرات براي ارسال به مقصد تهيه شده است عبارتست از DML History که به صورت زير پياده سازي شده است:
CREATE TABLE [DMLHistory] (
    [OrderCommand] [bigint] IDENTITY (1, 1) NOT NULL ,
    [DML] [char] (1000)  NULL ,
    [Status] [bigint] NULL  DEFAULT (0),
    CONSTRAINT [PK_DMLHistory] PRIMARY KEY  CLUSTERED
    (
        [OrderCommand]
    )  ON [PRIMARY]
) ON [PRIMARY]
GO
در اين جدول دستور دستکاري داده ها که باعث ايجاد تغييرات مي گردد درستون DML نگهداري مي شود و ترتيب روي دادن تغييرات توسط صفت OrderCommand مشخص مي شود. از فيلد Status نيز اعمالگر در مراحل بعدي استفاده خواهد کرد.

جدول سومي که براي رونوشت برداري فازي و تعريف تريگرهاي فازي کاربرد دارد جدول Event History مي باشد که بصورت زير تعريف مي شود:
CREATE TABLE [EventHistory] (
    [TriggerName] [char] (100) NULL ,
    [MF] [decimal](18, 12) NULL ,
    [Amount] [decimal](18, 2) NULL ,
    [Status] [bigint] NULL CONSTRAINT [DF_EventHistory_Status] DEFAULT (0)
) ON [PRIMARY]
GO
تمامي رويدادهاي فازي ساده در اين جدول نگهداري مي شوند تا بتوان رويداد مرکب فازي که شرط کميت سنج فازي جزئي را برآورده مي سازد شناسائي نمود. صفت MF براي نگهداري درجه تعلق رويداد ايجاد کننده تغييرات در شرط فازي قانوني بنام TriggerName تدارک ديده شده است. صفت Amount نيز جهت نگهداري مقدار کمي رکورد ايجاد کننده رويداد در نظر گرفته شده است. صفت TriggerName نيز نام قانون يا همان نام تريگر را در خود دارد. از صفت Status نيز اعمالگر استفاده خواهد کرد.

لازم به ذکر است در صورتي که شرايط فازي قانون شروع کننده همگام سازي رونوشت برداري فازي برآورده شود در اصطلاح تريگر فازي اجرا (fire) مي شود. با فاير شدن تريگر فازي در اين طرح تغييرات موجود در DML History به اعمالگر ارسال مي شود تا تغييرات در مقصد اعمال شود. اما اعمالگر خود مي تواند در درون پايگاه داده يا يک برنامه خارجي باشد که در اين پروژه اعمالگر يک برنامه اجرايي به زبان دلفي مي باشد که توسط تريگر فازي فرخواني مي شود. در ادامه با ذکر مثالي چگونگي شبيه سازي يک تريگر فازي در پايگاه داده فعال غير فازي را بررسي مي کنيم.

6-6- مثال: گفته شد که هر تريگر فازي را مي توان با استفاده از جداول سيستمي توسط سه تريگر غير فازي شبيه سازي کرد. به عنوان نمونه تريگر فازي زير را در نظر بگيريد:
Create Fuzzy Trigger RepSold On Sold
For Insert,Update, Delete
When few or medium or many GoodsCost IS very BigSale Quantified With GoodsAmount Threshold 0.3
SendAllUpdateTo TargetServer.TargetDB

اين قانون بيانگر اينست که اگر تعداد کمي يا متوسطي يا زيادي فروش خيلي بزرگ (Very BigSale) انجام شد تغييرات جدول Sold را به پايگاه داده مقصد TargetDB بر روي سرور TargetServer ارسال کن. البته اسم قانون همان نام تريگر يعني RepSold مي باشد و نيز فيلدي که در شرط فازي فروش خيلي بزرگ دخالت داده مي شود GoodsCost مي باشد که اين فيلد با کميت GoodsAmount درج مي شود، مثلا" فروش خيلي بزرگ 450000 توماني به تعداد 5 عدد انجام شده باشد. حد آستانه در اين قانون برابر 0.3 مي باشد.
اگر بخواهيم اين قانون به اجزاء غير فازي آن بشکنيم سه تريگر زير حادث مي شود.

1.    تريگر اول تريگري است که وظيفه دارد تغييرات تشخيص داده شده را در DML History نگهداري کند:
Create Trigger DMLHistorySold On Sold
AFTER INSERT,UPDATE,DELETE
AS
   Create Table #TraceInfo(EventType NVARCHAR(30), Parameters INTEGER, EventInfo NVARCHAR(2000))
   Insert Into #TraceInfo EXEC('DBCC INPUTBUFFER(@@SPID) WITH NO_INFOMSGS')

   Insert into DMLHistory (DML) Select #TraceInfo.EventInfo From #TraceInfo   
Go
اين تريگر دستور دستکاري داده(DML) اين رويداد را تشخيص داده و آنرا در فيلد DML از جدول DMLHistory  درج مي نمايد.

2.    تريگر دوم آن تريگري است که وظيفه دارد رويدادهايي را که شرط فازي قانون را برآورده مي سازند در Event History ذخيره نمايد:
CREATE Trigger EventHistoryRepSold On Sold
AFTER INSERT,UPDATE
AS
SET NOCOUNT ON
Declare @a decimal(18,2),@b decimal(18,2),@c decimal(18,2),@d decimal(18,2),
        @MF decimal(18,12),
        @VarFieldCost decimal(18,2),@VarFieldAmount decimal(18,2)   

Select @a=a, @b=b, @c=c, @d=d From FuzzySets Where FuzzyTerm='BigSale'

Select @VarFieldCost=inserted.GoodsCost, @VarFieldAmount=inserted.GoodsAmount From inserted

if ((@VarFieldCost <= @a) or (@VarFieldCost > @d)) begin
   SET @MF =0
end else if ((@VarFieldCost > @a) and (@VarFieldCost <= @b)) begin
   SET @MF = (@VarFieldCost - @a)/(@b-@a)
end else if ((@VarFieldCost > @b) and (@VarFieldCost <= @c)) begin
   SET @MF = 1
end else if ((@VarFieldCost > @c) and (@VarFieldCost <= @d)) begin
   SET @MF = (@d - @VarFieldCost)/(@d-@c)
end

--for very bigSale:
SET @MF = power(@MF, 2)

if @MF<>0 begin
   insert into EventHistory(TriggerName, MF, Amount) Values
                           ('RepSold', @MF, @VarFieldAmount)
end
Go

اين تريگر ابتدا متغير زباني bigSale را از جدول سيستمي FuzzySets استخراج مي کند و درجه تعلق GoodsCost را در اين مجموعه محاسبه مي کند. پس از بدست آوردن درجه تعلق مي بايد Linguistic Hedge را نيز در درجه تعلق تاثير دهيم بنابراين براي اثر دادن very مي بايد توان دوم درجه تعلق بدست آمده را محاسبه نماييم. در صورتي که درجه تعلق نهايي از صفر بزرگتر باشد مي بايد اين رويداد در Event History نگهداري شود.

3.    سومين تريگر، تريگري است که وظيفه دارد Event History را جهت محاسبه کميت سنج فازي جزئي بررسي و در صورت برآورده شدن شرط کميت، محاسبه حد آستانه و فراخواني اعمالگر جهت ارسال تغييرات به پايگاه داده مقصد را انجام مي دهد:
CREATE Trigger FuzzyTriggerRepSold On DMLHistory
AFTER INSERT
AS
   Declare @SumAmount Decimal(18,2),
           @a decimal(18,2),@b decimal(18,2),@c decimal(18,2),@d decimal(18,2),
           @MFw decimal(18,12),@MFq decimal(18,12 ),@MFqMAX decimal(18,12 ),
           @ResultOutput Varchar(8000), @OrderCommand Varchar(50)
            
   Select @SumAmount=Sum(Amount), @MFw=(Sum(Amount * MF)/Sum(Amount)) from EventHistory
          Where TriggerName='RepSold' and status=0

   Select @a=a, @b=b, @c=c, @d=d From FuzzySets
          Where FuzzyTerm='few'

   if ((@SumAmount <= @a) or (@SumAmount > @d)) begin
       SET @MFq =0
   end else if ((@SumAmount > @a) and (@SumAmount <= @b)) begin
       SET @MFq = (@SumAmount - @a)/(@b-@a)
   end else if ((@SumAmount > @b) and (@SumAmount <= @c)) begin
       SET @MFq = 1
   end else if ((@SumAmount > @c) and (@SumAmount <= @d)) begin
       SET @MFq = (@d - @SumAmount)/(@d-@c)
   end

   SET @MFqMAX=@MFq

   Select @a=a, @b=b, @c=c, @d=d From FuzzySets
          Where FuzzyTerm='medium'

   if ((@SumAmount <= @a) or (@SumAmount > @d)) begin
       SET @MFq =0
   end else if ((@SumAmount > @a) and (@SumAmount <= @b)) begin
       SET @MFq = (@SumAmount - @a)/(@b-@a)
   end else if ((@SumAmount > @b) and (@SumAmount <= @c)) begin
       SET @MFq = 1
   end else if ((@SumAmount > @c) and (@SumAmount <= @d)) begin
       SET @MFq = (@d - @SumAmount)/(@d-@c)
   end

  if @MFq>@MFqMAX
     SET  @MFqMAX = @MFq

   Select @a=a, @b=b, @c=c, @d=d From FuzzySets
          Where FuzzyTerm='many'

   if ((@SumAmount <= @a) or (@SumAmount > @d)) begin
       SET @MFq =0
   end else if ((@SumAmount > @a) and (@SumAmount <= @b)) begin
       SET @MFq = (@SumAmount - @a)/(@b-@a)
   end else if ((@SumAmount > @b) and (@SumAmount <= @c)) begin
       SET @MFq = 1
   end else if ((@SumAmount > @c) and (@SumAmount <= @d)) begin
       SET @MFq = (@d - @SumAmount)/(@d-@c)
   end

  if @MFq>@MFqMAX
     SET  @MFqMAX = @MFq

   --@MFTrigger=MAX(@MFqMAX, @MFw)
   --if @MFTrigger >= ThresholdValue then continue   

   if ((@MFqMAX >= 0.3) or (@MFw >= 0.3)) begin
      begin transaction

      Select @OrderCommand=OrderCommand from inserted
      Update FuzzyEvents set Status=@OrderCommand where Status=0
      Update replicationHistory set Status=@OrderCommand where Status=0

      set @OrderCommand = 'Applier.exe TargetServer TargetDB '+@OrderCommand
             EXEC master.dbo.xp_cmdshell @OrderCommand
      
      commit
   end
Go

توجه: دو تريگر اول بر روي جدولي که تغييرات بر روي آن ثبت مي شود تعريف مي شوند ولي تريگر سوم که وظيفه بررسي کميت سنج فازي و آغاز عمل همگام سازي را دارد مي بايد بر روي جدول DMLHistory تعريف گردد. همچنين جهت درتي توالي اجراي اجزاي تريگر فازي مي بايد دستورات زير نيز  توسط DDL Generator توليد و بر روي MS SQL Server اجرا گردند:
sp_settriggerorder @triggername='DMLHistorySold', @order='last', @stmttype='INSERT'
go
sp_settriggerorder @triggername='DMLHistorySold', @order='last', @stmttype='UPDATE'
go
sp_settriggerorder @triggername='DMLHistorySold', @order='last', @stmttype='DELETE'
go

اين سه دستور مشخص مي کنند که تريگر 'DMLHistorySold'  مي بايد بعنوان آخرين تريگر بر روي جدول Sold اجرا شود. زيرا قبل از اين تريگر تريگرهاي تخيص رويداد فازي تمامي رويدادها را در جدول EventHistory ذخيره کرده اند و با ثبت دستور DML توسط اين تريگر در جدول  DMLHistory تريگر سوم يعني تريگر محاسبه گر کميت سنج از روي رويدادهاي درون جدول EventHistory فراخوانده ميجشود و به اين ترتيب توالي اجراي سه تريگر بدرستي تعريف مي شود.


6-7- کارهاي آتي

در اين فصل نشان داده شد که چگونه مي توان يک تريگر فازي را در پايگاه داده اي فعال اما غير فازي پياده سازي نمود. همچنين روش پياده سازي رونوشت برداري فازي توسط جداول سيستمي و اجزاء تريگر فازي تشريح شد. در تمامي اين مراحل تمام مراحل کاري رونوشت برداري فازي در داخل پايگاه داده صورت مي پذيرفت الا بخش اعمالگر. اميد است در آينده با افزودن بخش اعمالگر از ماشين رونوشت برداري در داخل پايگاه داده بتوان عمل رونوشت برداري فازي را بطور صد در صد مکانيزه در درون پايگاه داده ها پياده سازي نمود. همچنين اگر بجاي محيط گرافيکي کاربر جهت توليد تريگرهاي فازي، با دستکاري کردن توابع دروني MS SQL Server 2000 بتوان مفسر اين پايگاه داده را تغيير داد که دستورات توليد تريگر فازي را نيز اجرا کند، عملا" پايگاه داده منتخب بطور کامل تريگرهاي فازي را بصورت دروني پشتيباني خواهد کرد.



انجام پایان نامه

برای دیدن ادامه مطلب از لینک زیر استفاده نمایید

سفارش پایان نامه