Ada banyak masalah dalam kehidupan nyata, seperti cara memaksimalkan keuntungan pedagang dengan membeli dan menjual barang? Bagaimana cara mencapai hasil keseluruhan terbaik dalam pendaftaran mahasiswa? Bagaimana dokter pasien dapat mencapai tingkat layanan tertinggi secara keseluruhan, dll. Kita semua dapat mengubah ini menjadi masalah pengambilan keputusan bilateral dengan cara yang terpadu. Mari kita bicara tentang pemahaman Anda tentang pengambilan keputusan bilateral.
Pengambilan Keputusan Bilateral-Pemahaman Pribadi
Untuk membantu semua orang memahami, saya akan menggunakan contoh sederhana untuk memperkenalkan apa keputusan bilateral. Ada 10 pelanggan di pasaran, yaitu A0, A1, A2, A3, A4, A5, A6, A7, A8, A9. Ada produk di pasaran, yaitu B0, B1, B2, B3, B4, B5, B6, B7, B8, dan B9. Sekarang, 10 produk ini harus didistribusikan ke 10 pelanggan ini, dan kepuasan keseluruhan diperlukan. Tentu saja, setiap pelanggan mencetak setiap produk secara berbeda. Pelanggan dengan produk N puas dengan AMBN. Jadi bagaimana cara mengalokasikan produk -produk ini untuk menjadikan kepuasan keseluruhan tertinggi? Topik ini adalah masalah pengambilan keputusan bilateral.
Pendahuluan Algoritma
Ada banyak algoritma untuk mengimplementasikan pengambilan keputusan bilateral. Berikut adalah cara untuk memikirkan diri sendiri (jika ada kesamaan, itu murni kebetulan). Algoritma ini dianggap berdasarkan artikel tentang algoritma genetika yang saya tulis sebelumnya. Algoritma ini mensyaratkan bahwa jumlah pelanggan dan produk harus konsisten, dan itu adalah hubungan satu-ke-satu. Jika nomornya tidak konsisten atau sepasang n (n adalah nilai spesifik), kita dapat menggunakan algoritma ini dengan membangun produk virtual (pelanggan). Izinkan saya memperkenalkan ide algoritma secara singkat:
1) Pertama -tama kami memilih rencana alokasi. Di sini kami tidak berasumsi bahwa rencana alokasi awal adalah untuk mengalokasikan produk M ke pelanggan M;
2) kami mengatur langkah perbandingan langkah ke 1;
3) Tentukan apakah langkah melebihi panjang array. Jika melebihi algoritma akhir, jika tidak melebihi langkah berikutnya, terus jalankan langkah berikutnya;
4) Bandingkan dua pelanggan di bawah ukuran langkah langkah, dengan asumsi bahwa rencana alokasi mereka diaktifkan. Jika kepuasan setelah penyesuaian lebih besar dari kepuasan sebelum penyesuaian, ganti, jika tidak simpan sebagaimana adanya, gerakkan posisi perbandingan satu ke belakang untuk melanjutkan ke langkah 4);
5) Tidak ada rencana alokasi yang dapat disesuaikan di bawah langkah ini, tambahkan 1 ke langkah;
6) Lompat ke langkah 3) dan terus mengeksekusi.
Dalam deskripsi algoritma di atas, kami fokus pada langkah 4). Di sini kami berasumsi bahwa produk yang dialokasikan oleh pelanggan pertama adalah Produk No. 1, dan produk yang dialokasikan oleh pelanggan kedua adalah Produk No. 2, dan kepuasan mereka dengan produk masing -masing adalah A1B1 dan A2B2. Pada saat ini, kepuasan keseluruhan dari kedua pelanggan adalah SCORE1 = A1B1+A2B2. Di sini kami membandingkan rencana alokasi mereka, yaitu, produk yang dialokasikan oleh pelanggan pertama adalah Produk No. 2, dan produk yang dialokasikan oleh pelanggan kedua adalah Produk No. 1, dan pada saat ini kepuasan mereka dengan produk masing -masing adalah A1B2 dan A2B1. Kepuasan keseluruhan dari kedua pelanggan ini adalah SCORE2 = A1B2+A2B1. Jika skor1 kurang dari skor2, maka kami mengubah strategi alokasi, jika tidak kami mempertahankan strategi alokasi asli.
Analisis Kode Java
Pendahuluan di atas mungkin tidak terlalu spesifik, atau kami tidak tahu bagaimana mengimplementasikannya dengan Java. Mari kita uraikan implementasi:
1) Saat menulis algoritma, pertama -tama kita perlu mendefinisikan beberapa konstanta, menyimpan skema alokasi, dll.:
kelas publik twoSidedDecision {private int num = 10; // Jumlah individu private boolean maxflag = true; // apakah akan menemukan nilai maksimum int private int [] [] scorearray; // skor evaluasi timbal balik antara ab private int [] decisionarray; // bagaimana cara memilih b}Ada atribut MaxFlag di sini. Fungsinya adalah untuk mengidentifikasi apakah keputusan bilateral kami harus diambil sebagai maksimum atau minimum. True mewakili nilai maksimum, false mewakili nilai minimum; NUM digunakan untuk mengidentifikasi jumlah individu, ScoreArray Array digunakan untuk mewakili kepuasan pengguna dengan produk, DecisionArray digunakan untuk menyimpan rencana alokasi produk, DecisionArray [0] berarti bahwa produk yang dialokasikan oleh pelanggan dengan angka 0 adalah DecisionArray [0];
2) Sebelum menjalankan algoritma, kita perlu mengatur jumlah orang
public void setnum (int num) {if (num <1) {System.out.println ("NUM harus lebih besar dari 0"); kembali; } this.num = num; } 3) Pelanggan mencetak kepuasan produk dan menentukan rencana alokasi awal
public void setScoreArray (int [] [] scoreArray) {if (scoreArray == null) {System.out.println ("ScoreArray adalah null"); } if (! (ScoreArray.length == num && ScoreArray [0] .length == num)) {System.out.println ("ScoreArray harus" + num); } this.scoreArray = scoreArray; DecisionArray = int [num] baru; // keputusan awal, diagonal untuk (int i = 0; i <num; i ++) {decisionArray [i] = i; } keputusan(); } 4) Kemudian lakukan langkah 4) dalam deskripsi algoritma untuk mengonfirmasi apakah rencana alokasi disesuaikan
Private Boolean Compare (int stepesize) {for (int i = 0; i <num - stepsize; i ++) {int a1 = i; int a2 = i + stepsize; int b1 = DecisionArray [A1]; int b2 = DecisionArray [A2]; // Jumlah dari dua skor asli int skor1 = scoreArray [A1] [B1] + ScoreArray [A2] [B2]; int antar1 = math.abs (scorearray [a1] [b1] - scorearray [a2] [b2]); // jumlah dari dua skor setelah pertukaran int skor2 = scorearray [a1] [b2] + scorearray [a2] [b1]; int antar2 = math.abs (scorearray [a1] [b2] - scorearray [a2] [b1]); if (maxflag) {// skor akhir maksimum adalah jika (skor1 <= skor2) {// skor setelah pertukaran tidak kurang dari pertukaran sebelumnya // skor setelah pertukaran lebih besar dari pertukaran sebelumnya atau perbedaan setelah pertukaran lebih besar dari pertukaran sebelumnya jika (skor1 <skor2 || antara2> antara1) {decisionray [a1] = b2; DecisionArray [A2] = B1; Kembali Benar; }}} else {// Skor akhir adalah IF terkecil (skor1> = skor2) {// skor setelah pertukaran tidak kurang dari sebelum pertukaran // skor setelah pertukaran lebih besar dari pertukaran sebelum pertukaran atau perbedaan setelah pertukaran lebih besar dari pertukaran sebelum (skor1> skor2 || antara2> antara) {keputusan [a1] = b2; DecisionArray [A2] = B1; Kembali Benar; }}} return false; } Nilai pengembalian metode ini adalah untuk mengkonfirmasi apakah switching terjadi pada ukuran langkah ini. Jika switching terjadi pada ukuran langkah ini, kita dapat membandingkan ukuran langkah berikutnya. Ini melengkapi algoritma pengambilan keputusan bilateral. Mari kita lihat hasil tes di bawah ini.
Hasil berjalan
Tes maksimum
Tes Nilai Minimum
Kode lengkap
/ ***@Deskripsi: Algoritma keputusan pencocokan bilateral*/ paket com.lulei.twosided.matching.decisionmaking; impor com.lulei.util.jsonutil; kelas publik twoSidedDecision {private int num = 10; // Jumlah individu private boolean maxflag = true; // apakah akan menemukan nilai maksimum int private int [] [] scorearray; // skor evaluasi timbal balik antara ab private int [] decisionarray; // cara memilih b public boolean ismaxflag () {return maxflag; } public void setmaxflag (boolean maxflag) {this.maxflag = maxflag; } / ** * @return * @author: lulei * @description: Dapatkan keputusan akhir * / int int [] getDecisionArray () {return decisionArray; } / ** * @return * @author: lulei * @description: Dapatkan peringkat untuk keputusan * / int int getscoresum () {int sum = 0; untuk (int i = 0; i <num; i ++) {sum+= scoreArray [i] [DecisionArray [i]]; } return sum; } / ** * @param num * @author: lulei * @description: Tetapkan jumlah individu pengambilan keputusan bilateral * / public void setnum (int num) {if (num <1) {system.out.println ("num harus lebih besar dari 0"); kembali; } this.num = num; } /** * @param scoreArray * @Author:lulei * @Description: Set the evaluation between individuals in Class A and individuals in Class B*/ 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 harus" + num); } this.scoreArray = scoreArray; DecisionArray = int [num] baru; // keputusan awal, diagonal untuk (int i = 0; i <num; i ++) {decisionArray [i] = i; } keputusan(); } / *** @Author: lulei* @description: Hitung keputusan optimal* / keputusan pribadi void () {if (scorearray == null || decisionarray == null) {System.out.println ("Tolong init scorearray"); } for (int stepesize = 1; stepsize <num; stepesize ++) {// Exchange while (bandingkan (stepesize)); }} / ** * @param Stepsize * @return * @author: lulei * @description: Perbandingan ukuran langkah tertentu, nilai pengembalian untuk mengonfirmasi apakah pertukaran terjadi * / private boolean perbandingan (int stepsize) {for (int i = 0; i <num - stepsize; i ++) {int a1 = i; int a2 = i + stepsize; int b1 = DecisionArray [A1]; int b2 = DecisionArray [A2]; // Jumlah dari dua skor asli int skor1 = scoreArray [A1] [B1] + ScoreArray [A2] [B2]; int antar1 = math.abs (scorearray [a1] [b1] - scorearray [a2] [b2]); // jumlah dari dua skor setelah pertukaran int skor2 = scorearray [a1] [b2] + scorearray [a2] [b1]; int antar2 = math.abs (scorearray [a1] [b2] - scorearray [a2] [b1]); if (maxflag) {// skor akhir maksimum adalah jika (skor1 <= skor2) {// skor setelah pertukaran tidak kurang dari pertukaran sebelumnya // skor setelah pertukaran lebih besar dari pertukaran sebelumnya atau perbedaan setelah pertukaran lebih besar dari pertukaran sebelumnya jika (skor1 <skor2 || antara2> antara1) {decisionray [a1] = b2; DecisionArray [A2] = B1; Kembali Benar; }}} else {// Skor akhir minimum IF (skor1> = skor2) {// skor setelah pertukaran tidak kurang dari sebelum pertukaran // skor setelah pertukaran lebih besar dari pertukaran sebelum pertukaran atau perbedaan setelah pertukaran lebih besar dari pertukaran sebelum (skor1> skor2 || antara2> antara1) {decisionray [a1] = b2; DecisionArray [A2] = B1; Kembali Benar; }}}} return false; } public static void main (string [] args) {int [] [] scoreArray = {{0,1,2,3,4,5,7,8,9}, {1,2,3,5,5,7,8,9,0}, {2,3,4,5,7,7,9,9,9,9}, {2,3,4,5,6,7,9,9,9,9,9,1, {3,4,5,6,7,8,9,0,1,2}, {4,5,6,7,8,9,0,1,2,3,}, {5,6,7,8,9,0,1,2,3,5}, {6,7,8,9,9,1,3,3,4,5, {6,7,9,9,9,2,3,4,4,5,5, {6,7,9,9,2,2,2,2 {7,8,9,0,1,2,3,4,5,6}, {8,9,0,1,2,3,4,5,6,7}, {9,0,1,2,3,4,5,6,7}, {9,0,2,2,3,5,5,6,7}, {9,0,2,2,2,3,5,5,7}, {9,2,2,2,3,5,7}, {9,2,2,2,3,7 {6,2,2,7 { Tes TWOSIDEDDECISION = TWOSIDEDDECISION baru (); test.setnum (10); test.setmaxflag (false); test.setscoreArray (ScoreArray); System.out.println ("Keputusan Optimal"); System.out.println (jsonutil.parsejson (test.getDecisionArray ())); System.out.println ("Skor Keputusan"); System.out.println (test.getScoresum ()); }}Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.