Есть много проблем в реальной жизни, например, как максимизировать прибыль торговцев, покупая и продавая товары? Как добиться наилучших результатов в зачислении студентов колледжа? Как пациент может достичь наивысшего общего уровня обслуживания и т. Д. Мы все можем превратить их в двусторонние проблемы принятия решений единым образом. Давайте впервые поговорим о вашем понимании двустороннего принятия решений.
Двустороннее принятие решений-личное понимание
Чтобы помочь всем понять, я буду использовать простой пример, чтобы представить, что такое двусторонние решения. На рынке есть 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 {private int num = 10; // Количество лиц частных логических логическихЗдесь есть атрибут MaxFlag. Его функция состоит в том, чтобы определить, следует ли принимать наши двусторонние решения как максимум или минимум. TRUE представляет максимальное значение, FALSE представляет минимальное значение; NUM используется для идентификации количества людей, массив ScoreArray используется для представления удовлетворенности пользователями продуктом, DecisionArray используется для сохранения плана распределения продукта, 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 должен быть" + num); } this.scorearray = scorearray; DeciessArray = new Int [num]; // первоначальное решение, диагональное для (int i = 0; i <num; i ++) {decisionArray [i] = i; } решение(); } 4) Затем выполните шаг 4) в описании алгоритма, чтобы подтвердить, скорректирован ли план распределения
Private Boolean Compare (int stepsize) {for (int i = 0; i <num - stearize; i ++) {int a1 = i; int a2 = i + stepsize; int b1 = decisionArray [a1]; int b2 = decisionArray [a2]; // Сумма исходных двух баллов int acly1 = scorearray [a1] [b1] + scorearray [a2] [b2]; int1 = math.abs (scorearray [a1] [b1] - scorearray [a2] [b2]); // сумма двух баллов после обмена int aclo2 = scorearray [a1] [b2] + scorearray [a2] [b1]; int2 = math.abs (scorearray [a1] [b2] - scorearray [a2] [b1]); if (maxflag) {// максимальная окончательная оценка - if (оценка1 <= оценка2) {// оценка после обмена не меньше, чем предыдущий обмен // оценка после обмена больше, чем предыдущий обмен или разница после обмена превышает предыдущий обмен, если (оценка1 <colpor2 || между 2> между 1) {deciforray [a1] = b2; DecisionArray [a2] = b1; вернуть истину; }}} else {// Окончательная оценка - это наименьший if (scord1> = score2) {// оценка после обмена не меньше, чем до обмена // оценка после обмена больше, чем перед обменом или разницей после обмена выше, чем перед обменом, если (оценка1> оценка 2 || между 2> между 1) {deciforray [a1] = b2; DecisionArray [a2] = b1; вернуть истину; }}} вернуть false; } Возвратное значение этого метода состоит в том, чтобы подтвердить, происходит ли переключение при этом размере. Если переключение происходит при этом размере шага, мы можем сравнить следующий размер шага. Это завершает двусторонний алгоритм принятия решений. Давайте посмотрим на результаты теста ниже.
Результаты бега
Максимальный тест
Минимальный тест стоимости
Полный код
/ ***@Описание: двусторонний алгоритм принятия решений*/ package com.lulei.twosided.matching.decisionmaking; импорт com.lulei.util.jsonutil; Общедоступный класс TwosidedDecision {private int num = 10; // Количество лиц частных логических логических } public void setMaxFlag (boolean maxflag) {this.maxflag = maxflag; } / ** * @return * @author: lulei * @description: получить окончательное решение * / public int [] getDecisionArray () {return DeciersArray; } / ** * @return * @author: lulei * @description: получить рейтинг для решения * / public int getScoresum () {int sum = 0; for (int i = 0; i <num; i ++) {sum+= scorearray [i] [DeciersArray [i]]; } return sum; } / ** * @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 [] [] [] scorearray) {if (scorearray == null) {System.out.println ("scorearray - это null"); } if (! (scorearray.length == num && scorearray [0] .length == num)) {System.out.println ("Scorearray должен быть" + num); } this.scorearray = scorearray; DeciessArray = new Int [num]; // первоначальное решение, диагональное для (int i = 0; i <num; i ++) {decisionArray [i] = i; } решение(); } / *** @author: lulei* @description: вычислить оптимальное решение* / private void decision () {if (scorearray == null || deciessarray == null) {System.out.println («Пожалуйста, init scorearray"); } for (int stearsize = 1; stearsize <num; stearsize ++) {// обмен while (compare (stargize)); }} / ** * @param steargize * @return * @author: lulei * @description: Сравнение конкретного размера шага, возвращаемое значение, чтобы подтвердить, происходит ли обмен * / private boolean compare (int steargize) {for (int i = 0; i <num - stearize; i ++) {int a1 = i; int a2 = i + stepsize; int b1 = decisionArray [a1]; int b2 = decisionArray [a2]; // Сумма исходных двух баллов int acly1 = scorearray [a1] [b1] + scorearray [a2] [b2]; int1 = math.abs (scorearray [a1] [b1] - scorearray [a2] [b2]); // сумма двух баллов после обмена int aclo2 = scorearray [a1] [b2] + scorearray [a2] [b1]; int2 = math.abs (scorearray [a1] [b2] - scorearray [a2] [b1]); if (maxflag) {// максимальная окончательная оценка - if (оценка1 <= оценка2) {// оценка после обмена не меньше, чем предыдущий обмен // оценка после обмена больше, чем предыдущий обмен или разница после обмена превышает предыдущий обмен, если (оценка1 <colpor2 || между 2> между 1) {deciforray [a1] = b2; DecisionArray [a2] = b1; вернуть истину; }}} else {// Минимальный окончательный балл if (scorm> = scord2) {// Оценка после обмена не меньше, чем до обмена // оценка после обмена больше, чем перед обменом или разница после обмена выше, чем перед обменом, если (оценка 1> оценка 2 || между 2> между 1) {deciforray [a1] = b2; DecisionArray [a2] = b1; вернуть истину; }}}} вернуть false; } public static void main (string [] args) {int [] [] scorearray = {{0,1,2,3,4,5,6,7,8,9}, {1,2,3,2,5,6,7,8,9,0}, {2,3,4,5,7,9,0,1} {3,4,5,6,7,8,9,0,1,1,2}, {4,5,6,7,8,9,0,1,2,3,}, {5,6,7,8,9,0,1,2,3,4,5}, {6,7,8,9,0,1,3,4,5} {7,8,9,0,1,2,3,4,5,5,6}, {8,9,0,1,2,3,4,5,6,7}, {9,0,1,2,3,4,5,6,7}, {9,0,1,1,2,3,5,5,6,7}, {9,0,1,1,2,5,6,6,5,5,5,6,7,7}, {9,0,1,1,2,5,6,5,5,5,6,7}; TwosidedDecision test = new TwosidedDecision (); 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 больше.