상품을 사고 팔아서 상인 이익을 극대화하는 방법과 같은 실제 생활에는 많은 문제가 있습니까? 대학생 등록에서 최상의 결과를 얻는 방법은 무엇입니까? 환자 의사가 어떻게 최고 전체 서비스 수준을 달성 할 수 있는가 등. 우리는 이들 모두를 통일 된 방식으로 양측 의사 결정 문제로 전환 할 수 있습니다. 먼저 양자 의사 결정에 대한 이해에 대해 이야기합시다.
양자 의사 결정-개인적 이해
모든 사람이 이해하도록 돕기 위해 간단한 예를 사용하여 양자 결정이 무엇인지 소개합니다. 시장에는 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) 할당 계획이 전환되었다고 가정 할 때 단계 단계 크기 하에서 두 고객을 비교하십시오. 조정 후 만족이 조정 전 만족보다 큰 경우 전환하십시오. 그렇지 않으면 비교 위치를 1 단계로 이동하여 4 단계로 계속 이동하십시오);
5)이 단계에서 조정할 수있는 할당 계획은 없으며 단계 1을 추가하십시오.
6) 3 단계로 점프하고 계속 실행하십시오.
위의 알고리즘 설명에서 우리는 4 단계에 중점을 둡니다). 여기서 첫 번째 고객이 할당 한 제품은 제품 No. 1이며, 두 번째 고객이 할당 한 제품은 제품 No. 2이며 제품에 대한 만족도는 각각 A1B1 및 A2B2입니다. 현재 두 고객의 전반적인 만족도는 점수 1 = A1B1+A2B2입니다. 여기서 우리는 할당 계획, 즉 첫 번째 고객이 할당 한 제품이 제품 No. 2이며, 두 번째 고객이 할당 한 제품은 제품 No. 1이며, 현재 제품에 대한 만족도는 각각 A1B2 및 A2B1입니다. 이 두 고객의 전반적인 만족은 score2 = A1B2+A2B1입니다. score1이 score2보다 작 으면 할당 전략을 변경하고 원래 할당 전략을 유지합니다.
Java 코드 분석
위의 소개는 너무 구체적이지 않을 수도 있고 Java로 구현하는 방법을 모릅니다. 구현을 세분화합시다.
1) 알고리즘을 작성할 때 먼저 일부 상수를 정의하고 할당 체계를 저장하는 등 : :
공개 클래스 두 번지도 {private int num = 10; // 개인 수 개인 부울 maxflag = true; // 최대 값을 찾을 수 있는지 여부 개인 int [] [] scorearray; // ab private int [] dectionarray 사이의 상호 평가 점수; // b}여기에는 maxflag 속성이 있습니다. 그 기능은 우리의 양자 결정을 최대 또는 최소로 결정 해야하는지 확인하는 것입니다. True는 최대 값을 나타내고, False는 최소값을 나타냅니다. NUM은 개인의 수를 식별하는 데 사용되며 ScorearRay 어레이는 제품에 대한 사용자 만족도를 나타내는 데 사용되며 DecimalArray는 제품의 할당 계획을 저장하는 데 사용됩니다. DecimArray [0]는 고객이 0으로 할당 한 제품이 DectionArray [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 && skorearRay [0] .length == num)) {System.out.println ( "scorearRay `s" + num); } this.scorearray = scorearRay; DectionArray = 새로운 int [num]; // 초기 결정, 대각선 (int i = 0; i <num; i ++) {dectionArray [i] = i; } 결정(); } 4) 그런 다음 4 단계를 수행하여 알고리즘 설명에서 할당 계획이 조정되었는지 확인하십시오.
개인 부울 비교 (int stepsize) {for (int i = 0; i <num -stepize; i ++) {int a1 = i; int a2 = i + stepize; int b1 = dectionArray [a1]; int b2 = dectionArray [a2]; // 원래 두 점수의 합계 int score1 = scorearray [A1] [B1] + ScorearRay [A2] [B2]; int ty1 = math.abs (scorearray [a1] [b1] - scorearray [a2] [b2]); // 교환 후 두 점수의 합계 int score2 = scorearray [A1] [B2] + ScorearRay [A2] [B1]; int ty2 = math.abs (scorearray [a1] [b2] - scorearray [a2] [b1]); if (maxflag) {// 최대 최종 점수는 if (sc DectionArray [A2] = B1; 진실을 반환하십시오. }}} else {// 최종 점수는 가장 작은 if (sc DectionArray [A2] = B1; 진실을 반환하십시오. }}} 거짓을 반환합니다. } 이 방법의 반환 값은이 단계 크기에서 스위칭이 발생하는지 확인하는 것입니다. 이 단계 크기에서 스위칭이 발생하면 다음 단계 크기를 비교할 수 있습니다. 이것은 양자 결정 알고리즘을 완료합니다. 아래 테스트 결과를 살펴 보겠습니다.
실행 결과
최대 테스트
최소 가치 테스트
완전한 코드
/ ***@description : 양자 일치 결정 알고리즘*/ 패키지 com.lulei.twosided.matching.decisionmaking; import com.lulei.util.jsonutil; 공개 클래스 두 번지도 {private int num = 10; // 개인 수 개인 부울 maxflag = true; // 최대 값을 찾을 수 있는지 여부 [] [] [] scorearray; // ab private int 사이의 상호 평가 점수; // b public boolean ismaxflag () {return maxflag; } public void setmaxflag (boolean maxflag) {this.maxflag = maxflag; } / ** * @return * @author : lulei * @description : 최종 결정을 받으십시오 * / public int [] getDecisionArray () {return dectionArray; } / ** * @return * @author : lulei * @description : 결정에 대한 등급을 얻습니다 * / public int getscoresum () {int sum = 0; for (int i = 0; i <num; i ++) {sum+= scorearray [i] [dectionArray [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 [] [] scorearray) {if (scorearray == null) {System.out.println ( "skorearray는 null"); } if (! (scorearRay.length == num && skorearRay [0] .length == num)) {System.out.println ( "scorearRay `s" + num); } this.scorearray = scorearRay; DectionArray = 새로운 int [num]; // 초기 결정, 대각선 (int i = 0; i <num; i ++) {dectionArray [i] = i; } 결정(); } / *** @author : lulei* @description : 최적의 결정을 계산* / private void dection () {if (scorearray == null || dectionArray == null) {system.out.println ( "skorearray를 시작하십시오"); } for (int stepsize = 1; stepsize <num; stepsize ++) {// exchange while (compare (stepsize)); }} / ** * @param stepize * @return * @author : lulei * @description : 특정 단계 크기 비교, 교환이 발생하는지 확인하기위한 반환 값 * / private boolean compare (int stepsize) {for (int i = 0; i <num -stepize; int a1 = i; int a2 = i + stepize; int b1 = dectionArray [a1]; int b2 = dectionArray [a2]; // 원래 두 점수의 합계 int score1 = scorearray [A1] [B1] + ScorearRay [A2] [B2]; int ty1 = math.abs (scorearray [a1] [b1] - scorearray [a2] [b2]); // 교환 후 두 점수의 합계 int score2 = scorearray [A1] [B2] + ScorearRay [A2] [B1]; int ty2 = math.abs (scorearray [a1] [b2] - scorearray [a2] [b1]); if (maxflag) {// 최대 최종 점수는 if (sc DectionArray [A2] = B1; 진실을 반환하십시오. }}} else {// 최소 최종 점수 인 경우 (sc DectionArray [A2] = B1; 진실을 반환하십시오. }}}} 거짓을 반환합니다. } public static void main (string [] args) {int [] [] scorearray = {{0,1,2,3,4,5,6,7,8,9}, {1,2,3,4,5,6,7,9,0}, {2,3,4,5,6,7,8,9,1}, {3,4,5,6,7,8,9,0,1,2}, {4,5,6,7,8,9,0,1,2,2,3,}, {5,6,7,8,9,0,1,2,2,4,5}, {6,7,8,9,0,1,2,2,3,5,5}, {7,8,9,0,1,2,3,4,5,6}, {8,9,0,1,2,3,4,6,7}, {9,0,1,2,3,4,5,6,7}, {9,0,1,2,3,4,5,6,7}, {9,0,4,4,7}; 두 개의 doidedDecision 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을 더 지원하기를 바랍니다.