هناك العديد من المشكلات في الحياة الحقيقية ، مثل كيفية زيادة أرباح التاجر من خلال شراء وبيع البضائع؟ كيفية تحقيق أفضل النتائج الإجمالية في تسجيل الطلاب الجامعيين؟ كيف يمكن لطبيب المريض تحقيق أعلى مستوى للخدمة بشكل عام ، وما إلى ذلك. يمكننا جميعًا تحويلها إلى قضايا في اتخاذ القرارات الثنائية بطريقة موحدة. دعنا نتحدث أولاً عن فهمك لاتخاذ القرارات الثنائية.
اتخاذ القرارات الثنائية-الفهم الشخصي
لمساعدة الجميع على الفهم ، سأستخدم مثالًا بسيطًا لتقديم القرارات الثنائية. يوجد 10 عملاء في السوق ، أي A0 و A1 و A2 و A3 و A4 و A5 و A6 و A7 و A8 و A9. هناك منتجات في السوق ، وهي B0 و B1 و B2 و B3 و B4 و B5 و B6 و B7 و B8 و B9. الآن ، يجب توزيع هذه المنتجات العشرة على هؤلاء العملاء العشرة ، والرضا العام مطلوب. بالطبع ، يسجل كل عميل كل منتج بشكل مختلف. العملاء مع منتجات N راضون عن AMBN. إذن كيف تخصص هذه المنتجات لجعل الرضا العام أعلى؟ هذا الموضوع هو قضية اتخاذ القرارات الثنائية.
مقدمة الخوارزمية
هناك العديد من الخوارزميات لتنفيذ اتخاذ القرارات الثنائية. فيما يلي طريقة للتفكير في نفسه (إذا كان هناك تشابه ، فهي مصادفة بحتة). تم التفكير في هذه الخوارزمية بناءً على مقال حول الخوارزميات الوراثية التي كتبتها من قبل. تتطلب هذه الخوارزمية أن يكون عدد العملاء والمنتجات ثابتًا ، وهي علاقة فردية. إذا كان الرقم غير متسق أو زوج من N (N هو قيمة محددة) ، فيمكننا استخدام هذه الخوارزمية عن طريق إنشاء منتج افتراضي (عميل). اسمحوا لي أن أقدم بإيجاز فكرة الخوارزمية:
1) نختار أولاً خطة تخصيص. هنا لا نفترض أن خطة التخصيص الأولية هي تخصيص منتجات M للعملاء M ؛
2) قمنا بتعيين خطوة المقارنة إلى 1 ؛
3) تحديد ما إذا كانت الخطوة تتجاوز طول الصفيف. إذا تجاوزت خوارزمية النهاية ، إذا لم تتجاوز الخطوة التالية ، فاستمر في تنفيذ الخطوة التالية ؛
4) قارن بين العميلتين تحت حجم الخطوة ، على افتراض أن خطة التخصيص الخاصة بها يتم تبديلها. إذا كان الرضا بعد التعديل أكبر من الرضا قبل التعديل ، فقم بتبديله ، وإلا الاحتفاظ به كما هو ، حرك موضع المقارنة واحد للخلف للمتابعة الخطوة 4) ؛
5) لا توجد خطة تخصيص يمكن تعديلها تحت هذه الخطوة ، أضف 1 إلى الخطوة ؛
6) القفز إلى الخطوة 3) واستمر في التنفيذ.
في وصف الخوارزمية أعلاه ، نركز على الخطوة 4). نحن هنا نفترض أن المنتج الذي يخصصه العميل الأول هو المنتج رقم 1 ، والمنتج الذي يخصصه العميل الثاني هو المنتج رقم 2 ، ورضاهم عن المنتج هو A1B1 و A2B2 ، على التوالي. في هذا الوقت ، فإن الرضا العام للعميل هو Score1 = A1B1+A2B2. هنا نقارن خطة التخصيص الخاصة بهم ، أي أن المنتج الذي يخصصه العميل الأول هو المنتج رقم 2 ، والمنتج الذي يخصصه العميل الثاني هو المنتج رقم 1 ، وفي هذا الوقت ، يكون رضاهم عن المنتج هو A1B2 و A2B1 ، على التوالي. الرضا العام لهذين العميل هو Score2 = A1B2+A2B1. إذا كانت Score1 أقل من Score2 ، فإننا نغير استراتيجية التخصيص ، وإلا فإننا نحافظ على استراتيجية التخصيص الأصلية.
تحليل رمز جافا
قد لا تكون المقدمة أعلاه محددة للغاية ، أو لا نعرف كيفية تنفيذها مع Java. دعنا نقسم التنفيذ:
1) عند كتابة خوارزمية ، نحتاج أولاً إلى تحديد بعض الثوابت ، وتوفير مخططات التخصيص ، وما إلى ذلك:
الطبقة العامة twosidedDecision {private int num = 10 ؛ // عدد الأفراد المنطقيين الخاصين maxflag = true ؛ // ما إذا كنت يمكن العثور على الحد الأقصى لقيمة int [] [] []هناك سمة maxflag هنا. تتمثل وظيفتها في تحديد ما إذا كان ينبغي اعتبار قراراتنا الثنائية الحد الأقصى أو الحد الأدنى. تمثل TRUE الحد الأقصى للقيمة ، يمثل FALSE الحد الأدنى للقيمة ؛ يتم استخدام NUM لتحديد عدد الأفراد ، ويتم استخدام صفيف ScorearRay لتمثيل رضا المستخدم مع المنتج ، ويتم استخدام Decisionarray لحفظ خطة تخصيص المنتج ، يعني القرار [0] أن المنتج الذي يخصصه العميل مع الرقم 0 هو قرار [0] ؛
2) قبل تشغيل الخوارزمية ، نحتاج إلى ضبط عدد الأفراد
public void setNum (int num) {if (num <1) {system.out.println ("يجب أن يكون NUM أكبر من 0") ؛ يعود؛ } this.num = num ؛ } 3) يسجل العملاء رضا المنتج وتحديد خطة التخصيص الأولية
public void setScorearRay (int [] [] ScorearRay) {if (scorearray == null) {system.out.println ("scorearray is null") ؛ } if (! (scorearray.length == num && scorearray [0] .length == num)) {system.out.println ("يجب أن يكون scorearray`s" + num) ؛ } this.scorearray = scorearray ؛ قرار = new int [num] ؛ // القرار الأولي ، قطري لـ (int i = 0 ؛ i <num ؛ i ++) {decentionarray [i] = i ؛ } قرار()؛ } 4) ثم قم بإجراء الخطوة 4) في وصف الخوارزمية لتأكيد ما إذا كانت خطة التخصيص قد تم ضبطها
boolean private Compare (int Stepsize) {for (int i = 0 ؛ i <num - stepsize ؛ i ++) {int a1 = i ؛ int a2 = i + الخطوات ؛ int b1 = decentionarray [a1] ؛ int b2 = decentionarray [a2] ؛ // مجموع الدرجات الأصلية int score1 = scorearray [a1] [b1] + scorearray [a2] [b2] ؛ int inter1 = math.abs (scorearray [a1] [b1] - scorearray [a2] [b2]) ؛ // مجموع الدرجات بعد Exchange int Score2 = ScorearRay [A1] [B2] + ScorearRay [A2] [B1] ؛ int inter2 = math.abs (scorearray [a1] [b2] - scorearray [a2] [b1]) ؛ إذا كان (maxflag) {// الحد الأقصى للنتيجة النهائية هو (Score1 <= Score2) {// النتيجة بعد التبادل لا تقل عن Exchange // النتيجة بعد التبادل أكبر من البورصة السابقة أو الفرق بعد التبادل أكبر من التبادل السابق إذا (Score1 <cors2 || inter1) {decentionarray [a1] = b2 ؛ قرار [A2] = B1 ؛ العودة صحيح. }}} else {// النتيجة النهائية هي الأصغر إذا (Score1> = Score2) {// النتيجة بعد التبادل لا تقل عن النتيجة قبل التبادل // النتيجة بعد التبادل أكبر من قبل التبادل أو الفرق بعد التبادل أكبر من التبادل إذا كان (Score1> Score2> بين 12) {dentionarray [a1] = b2 ؛ قرار [A2] = B1 ؛ العودة صحيح. }}} return false ؛ } تتمثل قيمة الإرجاع لهذه الطريقة في تأكيد ما إذا كان التبديل يحدث في حجم الخطوة هذا. في حالة حدوث التبديل في حجم الخطوة هذا ، يمكننا مقارنة حجم الخطوة التالية. هذا يكمل خوارزمية صنع القرار الثنائية. دعنا نلقي نظرة على نتائج الاختبار أدناه.
نتائج التشغيل
الاختبار القصوى
الحد الأدنى لقيمة اختبار
رمز كامل
/ ***@الوصف: خوارزمية القرار المطابقة الثنائية*/ package com.lulei.twosided.matching.decisionMaking ؛ استيراد com.lulei.util.jsonutil ؛ الفئة العامة TwosidedDecision {private int num = 10 ؛ // عدد الأفراد المنطقيين الخاصين maxflag = true ؛ // ما إذا كان يجب العثور على الحد الأقصى لقيمة int [] [] [] ScorearRay ؛ // درجة التقييم المتبادل بين AB private int [] decentionarray ؛ } public void setMaxFlag (boolean maxflag) {this.maxflag = maxflag ؛ } / ** * regurn * author: lulei * description: احصل على القرار النهائي * / public int [] getDecisionArray () {return decentionarray ؛ } / ** * return * author: lulei * description: احصل على تصنيف القرار * / public getCoreSum () {int sum = 0 ؛ لـ (int i = 0 ؛ i <num ؛ i ++) {sum+= scorearray [i] [decentionarray [i]] ؛ } إرجاع مجموع ؛ } / ** * param num * author: lulei * description: قم بتعيين عدد الأفراد الثنائيين لاتخاذ القرارات * / public void setNum (int num) {if (num <1) {system.out.println ("يجب أن يكون NUM أكبر من 0") ؛ يعود؛ } this.num = num ؛ } / ** * param scorearray * author: lulei * description: اضبط التقييم بين الأفراد في الفئة A والأفراد في الفئة B * / public void setScorearRay (int [] [] } if (! (scorearray.length == num && scorearray [0] .length == num)) {system.out.println ("يجب أن يكون scorearray`s" + num) ؛ } this.scorearray = scorearray ؛ قرار = new int [num] ؛ // القرار الأولي ، قطري لـ (int i = 0 ؛ i <num ؛ i ++) {decentionarray [i] = i ؛ } قرار()؛ } / *** author: lulei* description: حساب القرار الأمثل* / قرار void الخاص () {if (scorearray == null || dentionarray == null) {system.out.println ("يرجى init scorearray") ؛ } لـ (int stepsize = 1 ؛ STENSIZE <num ؛ STENSISE ++) {// Exchange ther (compare (خطوات)) ؛ }} / ** * param خطوات * @return * author: lulei * description: مقارنة بحجم خطوة محدد ، قيمة الإرجاع لتأكيد ما إذا كان التبادل يحدث * / مقارنات منطقية خاصة (int steparize) {for (int i = 0 ؛ i <num - theatizeize ؛ i ++) {int a1 = i ؛ int a2 = i + الخطوات ؛ int b1 = decentionarray [a1] ؛ int b2 = decentionarray [a2] ؛ // مجموع الدرجات الأصلية int score1 = scorearray [a1] [b1] + scorearray [a2] [b2] ؛ int inter1 = math.abs (scorearray [a1] [b1] - scorearray [a2] [b2]) ؛ // مجموع الدرجات بعد Exchange int Score2 = ScorearRay [A1] [B2] + ScorearRay [A2] [B1] ؛ int inter2 = math.abs (scorearray [a1] [b2] - scorearray [a2] [b1]) ؛ إذا كان (maxflag) {// الحد الأقصى للنتيجة النهائية هو (Score1 <= Score2) {// النتيجة بعد التبادل لا تقل عن Exchange // النتيجة بعد التبادل أكبر من البورصة السابقة أو الفرق بعد التبادل أكبر من التبادل السابق إذا (Score1 <cors2 || inter1) {decentionarray [a1] = b2 ؛ قرار [A2] = B1 ؛ العودة صحيح. }}} آخر {// الحد الأدنى للنتيجة النهائية إذا كانت (Score1> = Score2) {// النتيجة بعد التبادل لا تقل عن ما قبل التبادل // النتيجة بعد التبادل أكبر من قبل التبادل أو الفرق بعد التبادل أكبر من التبادل إذا (Score1> score2 || inter1) {decentionarray [a1] = b2 ؛ قرار [A2] = B1 ؛ العودة صحيح. }}}} إرجاع false ؛ } main static void main (string [] args) {int [] [] scorearray = {{0،1،2،3،5،5،7،7،8،9} ، {3،4،5،6،7،8،9،0،1،2} ، {4،5،6،7،8،9،0،2،3 ،} ، {5،6،7،8،0،5،5،5 ، {7،8،9،0،1،2،3،4،5،6} ، {8،9،0،1،2،4،5،6،7} ، {9،0،1،2،3،5،5،6،7} ، اختبار twosidedDecision = جديد twosidDecision () ؛ test.setnum (10) ؛ test.setMaxFlag (false) ؛ test.setscorearray (scorearray) ؛ System.out.println ("القرار الأمثل") ؛ system.out.println (jsonutil.parsejson (test.getDecisionArray ())) ؛ System.out.println ("درجة القرار") ؛ System.out.println (test.getScoresum ()) ؛ }}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.