มีปัญหามากมายในชีวิตจริงเช่นวิธีเพิ่มผลกำไรจากการค้าโดยการซื้อและขายสินค้า? วิธีการบรรลุผลโดยรวมที่ดีที่สุดในการลงทะเบียนนักศึกษาวิทยาลัย? แพทย์ผู้ป่วยจะบรรลุระดับการให้บริการโดยรวมสูงสุดได้อย่างไร ฯลฯ เราทุกคนสามารถเปลี่ยนสิ่งเหล่านี้ให้เป็นปัญหาการตัดสินใจระดับทวิภาคีในลักษณะที่เป็นเอกภาพ ก่อนอื่นมาพูดคุยเกี่ยวกับความเข้าใจของคุณเกี่ยวกับการตัดสินใจระดับทวิภาคี
การตัดสินใจทวิภาคี-ความเข้าใจส่วนบุคคล
เพื่อช่วยให้ทุกคนเข้าใจฉันจะใช้ตัวอย่างง่ายๆเพื่อแนะนำการตัดสินใจระดับทวิภาคี มีลูกค้า 10 รายในตลาดคือ A0, A1, A2, A3, A4, A5, A6, A7, A8, A9 มีผลิตภัณฑ์ในตลาด ได้แก่ B0, B1, B2, B3, B4, B5, B6, B7, B8 และ B9 ตอนนี้ผลิตภัณฑ์ 10 รายการเหล่านี้จะต้องแจกจ่ายให้กับลูกค้า 10 รายเหล่านี้และจำเป็นต้องมีความพึงพอใจโดยรวม แน่นอนว่าลูกค้าแต่ละรายให้คะแนนแต่ละผลิตภัณฑ์แตกต่างกัน ลูกค้าที่มีผลิตภัณฑ์ n พอใจกับ Ambn ดังนั้นจะจัดสรรผลิตภัณฑ์เหล่านี้เพื่อสร้างความพึงพอใจโดยรวมสูงสุดได้อย่างไร หัวข้อนี้เป็นปัญหาการตัดสินใจระดับทวิภาคี
อัลกอริทึมบทนำ
มีอัลกอริทึมมากมายสำหรับการใช้การตัดสินใจระดับทวิภาคี นี่คือวิธีคิดของตัวเอง (ถ้ามีความคล้ายคลึงกันมันเป็นเรื่องบังเอิญอย่างหมดจด) อัลกอริทึมนี้คิดว่าอยู่บนพื้นฐานของบทความเกี่ยวกับอัลกอริทึมทางพันธุกรรมที่ฉันเขียนไว้ก่อนหน้านี้ อัลกอริทึมนี้ต้องการให้จำนวนลูกค้าและผลิตภัณฑ์ต้องสอดคล้องกันและเป็นความสัมพันธ์แบบหนึ่งต่อหนึ่ง หากตัวเลขไม่สอดคล้องกันหรือคู่ของ N (n เป็นค่าเฉพาะ) เราสามารถใช้อัลกอริทึมนี้ได้โดยการสร้างผลิตภัณฑ์เสมือนจริง (ลูกค้า) ให้ฉันแนะนำแนวคิดอัลกอริทึมสั้น ๆ :
1) ก่อนอื่นเราเลือกแผนการจัดสรร ที่นี่เราไม่คิดว่าแผนการจัดสรรเริ่มต้นคือการจัดสรรผลิตภัณฑ์ M ให้กับลูกค้า M
2) เราตั้งค่าขั้นตอนการเปรียบเทียบเป็น 1;
3) พิจารณาว่าขั้นตอนเกินความยาวของอาร์เรย์หรือไม่ หากเกินอัลกอริทึมสิ้นสุดหากไม่เกินขั้นตอนต่อไปให้ดำเนินการต่อไปในขั้นตอนต่อไป
4) เปรียบเทียบลูกค้าสองรายภายใต้ขนาดขั้นตอนขั้นตอนโดยสมมติว่าแผนการจัดสรรของพวกเขาเปลี่ยนไป หากความพึงพอใจหลังจากการปรับค่ามากกว่าความพึงพอใจก่อนการปรับเปลี่ยนให้สลับมิฉะนั้นเก็บไว้ตามที่เป็นอยู่ให้ย้ายตำแหน่งการเปรียบเทียบหนึ่งไปข้างหลังเพื่อดำเนินการต่อไปยังขั้นตอนที่ 4);
5) ไม่มีแผนการจัดสรรที่สามารถปรับได้ภายใต้ขั้นตอนนี้เพิ่ม 1 ในขั้นตอน;
6) ข้ามไปที่ขั้นตอนที่ 3) และดำเนินการต่อ
ในคำอธิบายอัลกอริทึมข้างต้นเรามุ่งเน้นไปที่ขั้นตอนที่ 4) ที่นี่เราคิดว่าผลิตภัณฑ์ที่จัดสรรโดยลูกค้ารายแรกคือผลิตภัณฑ์หมายเลข 1 และผลิตภัณฑ์ที่จัดสรรโดยลูกค้ารายที่สองคือผลิตภัณฑ์หมายเลข 2 และความพึงพอใจของพวกเขากับผลิตภัณฑ์คือ A1B1 และ A2B2 ตามลำดับ ในเวลานี้ความพึงพอใจโดยรวมของลูกค้าทั้งสองคือคะแนน 1 = A1B1+A2B2 ที่นี่เราเปรียบเทียบแผนการจัดสรรของพวกเขานั่นคือผลิตภัณฑ์ที่จัดสรรโดยลูกค้ารายแรกคือผลิตภัณฑ์หมายเลข 2 และผลิตภัณฑ์ที่จัดสรรโดยลูกค้ารายที่สองคือผลิตภัณฑ์หมายเลข 1 และในเวลานี้ความพึงพอใจของผลิตภัณฑ์คือ A1B2 และ A2B1 ตามลำดับ ความพึงพอใจโดยรวมของลูกค้าสองคนนี้คือคะแนน 2 = A1B2+A2B1 หากคะแนน 1 น้อยกว่าคะแนน 2 เราจะเปลี่ยนกลยุทธ์การจัดสรรมิฉะนั้นเราจะรักษากลยุทธ์การจัดสรรดั้งเดิม
การวิเคราะห์รหัส Java
การแนะนำข้างต้นอาจไม่เฉพาะเจาะจงเกินไปหรือเราไม่รู้ว่าจะนำไปใช้กับ Java ได้อย่างไร มาทำลายการใช้งานกันเถอะ:
1) เมื่อเขียนอัลกอริทึมเราต้องกำหนดค่าคงที่บางอย่างบันทึกแผนการจัดสรร ฯลฯ :
คลาสสาธารณะ twosidedDecision {ส่วนตัว int num = 10; // จำนวนของบุคคลบูลีนส่วนตัว maxflag = true; // ไม่ว่าจะหาค่าสูงสุดส่วนตัว int [] [] scorearray; // คะแนนการประเมินร่วมกันระหว่าง AB ส่วนตัว int [] การตัดสินใจ; // วิธีการเลือก b}มีแอตทริบิวต์ MaxFlag ที่นี่ ฟังก์ชั่นของมันคือการระบุว่าการตัดสินใจระดับทวิภาคีของเราควรดำเนินการเป็นค่าสูงสุดหรือต่ำสุดหรือไม่ จริงแสดงถึงค่าสูงสุดเท็จแสดงถึงค่าต่ำสุด; NUM ถูกใช้เพื่อระบุจำนวนบุคคลอาร์เรย์ Scorearray ใช้เพื่อแสดงถึงความพึงพอใจของผู้ใช้กับผลิตภัณฑ์การตัดสินใจใช้เพื่อบันทึกแผนการจัดสรรของผลิตภัณฑ์การตัดสินใจ [0] หมายความว่าผลิตภัณฑ์ที่จัดสรรโดยลูกค้าด้วยหมายเลข 0 คือการตัดสินใจ [0];
2) ก่อนที่จะเรียกใช้อัลกอริทึมเราต้องตั้งค่าจำนวนบุคคล
โมฆะสาธารณะ setNum (int num) {ถ้า (num <1) {system.out.println ("num ต้องมากกว่า 0"); กลับ; } this.num = num; - 3) ลูกค้าให้คะแนนความพึงพอใจของผลิตภัณฑ์และกำหนดแผนการจัดสรรเริ่มต้น
โมฆะสาธารณะ setScoreArray (int [] [] scorearray) {ถ้า (scorearray == null) {system.out.println ("Scorearray เป็น null"); } if (! (scorearray.length == num && scorearray [0] .length == num)) {system.out.println ("Scorearray`s ต้องเป็น" + num); } this.scorearray = Scorearray; decisionArray = new int [num]; // การตัดสินใจครั้งแรกเส้นทแยงมุมสำหรับ (int i = 0; i <num; i ++) {decisionArray [i] = i; } การตัดสินใจ(); - 4) ดำเนินการขั้นตอนที่ 4) ในคำอธิบายอัลกอริทึมเพื่อยืนยันว่ามีการปรับแผนการจัดสรรหรือไม่
บูลีนส่วนตัวเปรียบเทียบ (int stepleize) {สำหรับ (int i = 0; i <num - stepeze; i ++) {int a1 = i; int a2 = i + steesze; int b1 = การตัดสินใจ [A1]; int b2 = การตัดสินใจ [A2]; // ผลรวมของสองคะแนนดั้งเดิม int score 1 = Scorearray [A1] [B1] + Scorearray [A2] [B2]; int ระหว่าง 1 = Math.Abs (Scorearray [A1] [B1] - Scorearray [A2] [B2]); // ผลรวมของสองคะแนนหลังจากแลกเปลี่ยน int score2 = scorearray [a1] [b2] + scorearray [a2] [b1]; int ระหว่าง 2 = Math.Abs (Scorearray [A1] [B2] - Scorearray [A2] [B1]); ถ้า (maxflag) {// คะแนนสูงสุดสูงสุดคือถ้า (คะแนน 1 <= score2) {// คะแนนหลังจากการแลกเปลี่ยนไม่น้อยกว่าการแลกเปลี่ยนก่อนหน้า // คะแนนหลังจากการแลกเปลี่ยนมากกว่าการแลกเปลี่ยนก่อนหน้านี้หรือความแตกต่างหลังจากการแลกเปลี่ยนมากกว่าการแลกเปลี่ยนก่อนหน้านี้ (คะแนน 1 <คะแนน 2 || ระหว่าง 2> ระหว่าง 1) decisionArray [a2] = b1; กลับมาจริง; }}} else {// คะแนนสุดท้ายคือน้อยที่สุดถ้า (คะแนน 1> = score2) {// คะแนนหลังจากการแลกเปลี่ยนไม่น้อยกว่าก่อนการแลกเปลี่ยน // คะแนนหลังจากการแลกเปลี่ยนมากกว่าการแลกเปลี่ยนก่อนหน้าหรือความแตกต่างหลังจากการแลกเปลี่ยนมากกว่าก่อนการแลกเปลี่ยนถ้า (คะแนน 1> score2 || ระหว่าง 2> ระหว่าง 1) decisionArray [a2] = b1; กลับมาจริง; }}} return false; - ค่าส่งคืนของวิธีนี้คือการยืนยันว่าการสลับเกิดขึ้นในขนาดขั้นตอนนี้หรือไม่ หากการสลับเกิดขึ้นในขนาดขั้นตอนนี้เราสามารถเปรียบเทียบขนาดขั้นตอนต่อไป สิ่งนี้ทำให้อัลกอริทึมการตัดสินใจระดับทวิภาคีเสร็จสมบูรณ์ มาดูผลการทดสอบด้านล่าง
การรันผลลัพธ์
การทดสอบสูงสุด
การทดสอบค่าขั้นต่ำ
กรอกรหัส
/ ***@คำอธิบาย: อัลกอริทึมการตัดสินใจในการจับคู่ทวิภาคี*/ แพ็คเกจ com.lulei.twosided.matching.decisionmaking; นำเข้า com.lulei.util.jsonutil; คลาสสาธารณะ twosidedDecision {ส่วนตัว int num = 10; // จำนวนของบุคคลบูลีนส่วนตัว maxflag = true; // ไม่ว่าจะหาค่าสูงสุดส่วนตัว int [] [] scorearray; // คะแนนการประเมินร่วมกันระหว่าง AB ส่วนตัว } โมฆะสาธารณะ setMaxFlag (Boolean MaxFlag) {this.maxFlag = MaxFlag; } / ** * @return * @author: lulei * @description: รับการตัดสินใจขั้นสุดท้าย * / public int [] getDecisionArray () {ส่งคืนการตัดสินใจ; } / ** * @return * @author: lulei * @description: รับการจัดอันดับสำหรับการตัดสินใจ * / public int getscoresum () {int sum = 0; สำหรับ (int i = 0; i <num; i ++) {sum+= scorearray [i] [discellerarray [i]]; } return sum; } / ** * @param num * @author: lulei * @description: ตั้งค่าจำนวนบุคคลในการตัดสินใจทวิภาคี * / โมฆะสาธารณะ setnum (int num) {ถ้า (num <1) {system.out.println ("จำนวนจะต้องมากกว่า 0"); กลับ; } this.num = num; } / ** * @param scorearray * @author: lulei * @description: ตั้งค่าการประเมินผลระหว่างบุคคลในคลาส A และบุคคลในชั้นเรียน b * / โมฆะสาธารณะ setscorearray (int [] [] scorearray) {ถ้า (scorearray == null) {system.out.out.println ( } if (! (scorearray.length == num && scorearray [0] .length == num)) {system.out.println ("Scorearray`s ต้องเป็น" + num); } this.scorearray = Scorearray; decisionArray = new int [num]; // การตัดสินใจครั้งแรกเส้นทแยงมุมสำหรับ (int i = 0; i <num; i ++) {decisionArray [i] = i; } การตัดสินใจ(); } / *** @author: lulei* @description: คำนวณการตัดสินใจที่ดีที่สุด* / โมฆะส่วนตัวการตัดสินใจ () {ถ้า (scorearray == null || decialingarray == null) {system.out.println ("โปรดเริ่มต้น Scorearray"); } สำหรับ (int stepleize = 1; stepeize <num; stepeize ++) {// แลกเปลี่ยนในขณะที่ (เปรียบเทียบ (stepeize)); }} / ** * @param stepeize * @return * @author: lulei * @description: การเปรียบเทียบขนาดขั้นตอนที่เฉพาะเจาะจง, ค่าคืนค่าเพื่อยืนยันว่าการแลกเปลี่ยนเกิดขึ้น * / บูลีนส่วนตัวเปรียบเทียบ (int steesize) {สำหรับ (int i = 0; int a2 = i + steesze; int b1 = การตัดสินใจ [A1]; int b2 = การตัดสินใจ [A2]; // ผลรวมของสองคะแนนดั้งเดิม int score 1 = Scorearray [A1] [B1] + Scorearray [A2] [B2]; int ระหว่าง 1 = Math.Abs (Scorearray [A1] [B1] - Scorearray [A2] [B2]); // ผลรวมของสองคะแนนหลังจากแลกเปลี่ยน int score2 = scorearray [a1] [b2] + scorearray [a2] [b1]; int ระหว่าง 2 = Math.Abs (Scorearray [A1] [B2] - Scorearray [A2] [B1]); ถ้า (maxflag) {// คะแนนสูงสุดสูงสุดคือถ้า (คะแนน 1 <= score2) {// คะแนนหลังจากการแลกเปลี่ยนไม่น้อยกว่าการแลกเปลี่ยนก่อนหน้า // คะแนนหลังจากการแลกเปลี่ยนมากกว่าการแลกเปลี่ยนก่อนหน้านี้หรือความแตกต่างหลังจากการแลกเปลี่ยนมากกว่าการแลกเปลี่ยนก่อนหน้านี้ (คะแนน 1 <คะแนน 2 || ระหว่าง 2> ระหว่าง 1) decisionArray [a2] = b1; กลับมาจริง; }}} else {// คะแนนสุดท้ายขั้นต่ำถ้า (คะแนน 1> = score2) {// คะแนนหลังจากการแลกเปลี่ยนไม่น้อยกว่าก่อนการแลกเปลี่ยน // คะแนนหลังจากการแลกเปลี่ยนมากกว่าการแลกเปลี่ยนก่อนหน้าหรือความแตกต่างหลังจากการแลกเปลี่ยนมากกว่าการแลกเปลี่ยนก่อนหน้านี้ (คะแนน 1> score2 || ระหว่าง 2> ระหว่าง 1) {การตัดสินใจ decisionArray [a2] = b1; กลับมาจริง; }}}} return false; } โมฆะคงที่สาธารณะหลัก (String [] args) {int [] [] scorearray = {{0,1,2,3,4,5,6,6,7,8,9}, {1,2,3,4,5,6,7,8,9,9,0}, {2,3,5,6,6,9,0,9,0,9,9,9,9,9,0,9,0,9,0,9,0,9,0,9,0,9s {3,4,5,6,7,8,9,0,1,2}, {4,5,6,7,8,9,0,1,1,2,3,}, {5,6,7,8,9,0,1,2,3,4,4,5}, {6,7,9,9,0,1,0,5,5,5,5,5} {7,8,9,0,1,2,3,4,4,5,6}, {8,9,0,1,2,3,4,4,5,6,7}, {9,0,1,2,3,4,5,6,7,7,5,6,5,5,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,7s0,0 TwosidedDecision Test = ใหม่ twosidedDecision (); test.setNum (10); test.setMaxFlag (เท็จ); test.setscorearray (Scorearray); System.out.println ("การตัดสินใจที่ดีที่สุด"); System.out.println (jsonutil.parsejson (test.getDecisionArray ())); System.out.println ("คะแนนการตัดสินใจ"); System.out.println (test.getScoresum ()); -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น