LoadBalancingMain.java ¶
~cpp /** * @author Administrator * * To change this generated comment edit the template variable "typecomment": * Window>Preferences>Java>Templates. * To enable and disable the creation of type comments go to * Window>Preferences>Java>Code Generation. */ import junit.framework.*; import junit.textui.*; public class LoadBalancingMain { public static void main(String[] args) { TestSuite suite = new TestSuite(); suite.addTestSuite(TestLoadBalancing.class); TestRunner.run(suite); } }
TestLoadBalancing.java ¶
~cpp /** * @author Administrator * * To change this generated comment edit the template variable "typecomment": * Window>Preferences>Java>Templates. * To enable and disable the creation of type comments go to * Window>Preferences>Java>Code Generation. */ import junit.framework.*; public class TestLoadBalancing extends TestCase{ public void testSetNGetData() { LoadBalancing bal = new LoadBalancing(3); int sData[] = {1,3,3}; int gData[]; bal.setData(sData); gData = bal.getData(); for(int i=0; i<sData.length; i++) assertEquals(sData[i], gData[i]); } public void testGetSumOfJob() { LoadBalancing bal = new LoadBalancing(3); int data[]={1,3,4}; bal.setData(data); assertEquals(bal.getSumOfJob(), 8); assertEquals(bal.getMaximumJob(), 4); assertEquals(bal.getMinimumJob(), 1); } public void testCheckLeftRight() { LoadBalancing bal = new LoadBalancing(10); /*int data[]={1,2,3,4,5,6,7,8,9,10}; bal.setData(data); assertEquals(bal.checkLeft(0), false); assertEquals(bal.checkLeft(1), true); assertEquals(bal.checkLeft(2), true); assertEquals(bal.checkLeft(3), true); assertEquals(bal.checkLeft(4), true); assertEquals(bal.checkLeft(5), true); assertEquals(bal.checkLeft(6), true); assertEquals(bal.checkLeft(7), true); assertEquals(bal.checkLeft(8), true); assertEquals(bal.checkLeft(9), true); assertEquals(bal.checkRight(0), false); assertEquals(bal.checkRight(1), false); assertEquals(bal.checkRight(2), false); assertEquals(bal.checkRight(3), false); assertEquals(bal.checkRight(4), false); assertEquals(bal.checkRight(5), false); assertEquals(bal.checkRight(6), false); assertEquals(bal.checkRight(7), false); assertEquals(bal.checkRight(8), false); assertEquals(bal.checkRight(9), false); int data_[] = {5,5,5,5,5,5,5,5,5,10}; bal.setData(data_); assertEquals(bal.checkLeft(0), false); assertEquals(bal.checkLeft(1), false); assertEquals(bal.checkLeft(2), false); assertEquals(bal.checkLeft(3), false); assertEquals(bal.checkLeft(4), false); assertEquals(bal.checkLeft(5), true); assertEquals(bal.checkLeft(6), true); assertEquals(bal.checkLeft(7), true); assertEquals(bal.checkLeft(8), true); assertEquals(bal.checkLeft(9), true); assertEquals(bal.checkRight(0), false); assertEquals(bal.checkRight(1), false); assertEquals(bal.checkRight(2), false); assertEquals(bal.checkRight(3), false); assertEquals(bal.checkRight(4), false); assertEquals(bal.checkRight(5), false); assertEquals(bal.checkRight(6), false); assertEquals(bal.checkRight(7), false); assertEquals(bal.checkRight(8), false); assertEquals(bal.checkRight(9), false); int data__[] = {10,9,8,7,6,5,4,3,2,1}; bal.setData(data__); assertEquals(bal.checkLeft(0), false); assertEquals(bal.checkLeft(1), false); assertEquals(bal.checkLeft(2), false); assertEquals(bal.checkLeft(3), false); assertEquals(bal.checkLeft(4), false); assertEquals(bal.checkLeft(5), false); assertEquals(bal.checkLeft(6), false); assertEquals(bal.checkLeft(7), false); assertEquals(bal.checkLeft(8), false); assertEquals(bal.checkLeft(9), false); assertEquals(bal.checkRight(0), true); assertEquals(bal.checkRight(1), true); assertEquals(bal.checkRight(2), true); assertEquals(bal.checkRight(3), true); assertEquals(bal.checkRight(4), true); assertEquals(bal.checkRight(5), true); assertEquals(bal.checkRight(6), true); assertEquals(bal.checkRight(7), true); assertEquals(bal.checkRight(8), true); assertEquals(bal.checkRight(9), false);*/ bal = new LoadBalancing(10); int data___[]={13,13,13,13,13,14,14,15,13,13}; bal.setData(data___); //assertEquals(true, bal.checkRight(7)); //assertEquals(true, bal.checkLeft(7)); } public void testLoadBalancing() { LoadBalancing bal = new LoadBalancing(3); int data[]={0,3,0}; bal.setData(data); bal.loadBalance(); bal.printInfo(); bal = new LoadBalancing(10); int data_[] = {1,2,3,4,5,6,7,8,9,10}; bal.setData(data_); bal.loadBalance(); bal.printInfo(); bal = new LoadBalancing(10); int data__[]={5,0,10,6,1,49,1,50,3,9}; assertEquals(10, data__.length); bal.setData(data__); bal.loadBalance(); bal.printInfo(); bal = new LoadBalancing(10); int data___[]={13,13,13,13,13,13,13,13,15,14}; bal.setData(data___); bal.loadBalance(); bal.printInfo(); bal = new LoadBalancing(10); int data____[]={0,9,0,0,0,0,0,0,0,0}; bal.setData(data____); bal.loadBalance(); bal.printInfo(); } }
LoadBalancing.java ¶
~cpp /** * @author Administrator * * To change this generated comment edit the template variable "typecomment": * Window>Preferences>Java>Templates. * To enable and disable the creation of type comments go to * Window>Preferences>Java>Code Generation. */ public class LoadBalancing { private int _processor[]; private int _processorNum; private int _movedJob; public LoadBalancing(int processorNum) { _processor = new int[processorNum]; _processorNum = processorNum; } public int getProcessorNum() { return _processorNum; } public int[] getProcessorInfo() { return _processor; } public int getSumOfJob() { int sum=0; for(int i=0; i<_processor.length; i++) sum+=_processor[i]; return sum; } public void setData(int[] data) { for(int i=0; i<data.length; i++) _processor[i] = data[i]; } public int[] getData() { return _processor; } public void loadBalance() { int sum = getSumOfJob(); int average = sum/_processor.length; int remain = sum%_processor.length; int pos=0; while( !isFinishedCondition() ) { if( pos!=0 && checkLeft(pos) && _processor[pos]!=0) { _processor[pos-1]++; _processor[pos]--; _movedJob++; System.out.println(pos + " 에서" + (pos-1) + " 로 옮김"); } else if( pos<_processor.length-1 && checkRight(pos) && _processor[pos]!=0) { _processor[pos]--; _processor[pos+1]++; _movedJob++; System.out.println(pos + " 에서" + (pos+1) + " 로 옮김"); } pos++; printInfo(); if( pos==_processor.length ) { pos = 0; } } } public boolean isFinishedCondition() { if( getMaximumJob()-getMinimumJob() <= 1 ) return true; else return false; } public int getMaximumJob() { int ret = Integer.MIN_VALUE; for(int i=0; i!=_processor.length; i++) { ret = (ret<_processor[i])?_processor[i]:ret; } return ret; } public int getMinimumJob() { int ret = Integer.MAX_VALUE; for(int i=0; i!=_processor.length; i++) { ret = (ret>_processor[i])?_processor[i]:ret; } return ret; } public boolean checkLeft(int index) { int average = getSumOfJob() / _processor.length; int remian = getSumOfJob() % _processor.length; int leftSum = 0; int rightSum = 0; int partialLength = (index==0)? 1:index; if( index==0 ) { return false; } // 왼쪽 평균<오른쪽 평균 for(int i=0; i<index; i++) { leftSum+=_processor[i]; } rightSum = getSumOfJob() - leftSum; if( average==0 ) { if(leftSum < index-1 ) return true; else return false; } else if( leftSum/index < rightSum/(_processor.length-index) ) { System.out.println("레프트"); return true; } /*else if(leftSum/index == rightSum/(_processor.length-index) && _processor[index] > leftSum/index ) { return true; }*/ else { return false; } } public boolean checkRight(int index) { int average = getSumOfJob() / _processor.length; int remian = getSumOfJob() % _processor.length; int leftSum = 0; int rightSum = 0; int partialLength = (index==0)? 1:index; if( index==_processor.length-1 ) { return false; } // 왼쪽 평균>오른쪽 평균 for(int i=0; i<=index; i++) { leftSum+=_processor[i]; } if(index==0) leftSum = _processor[0]; rightSum = getSumOfJob() - leftSum; /*if( average != 0 ) { System.out.println("인덱스 : " + index ); System.out.println("평균 : " + _processor[index] + "왼쪽나머지:" + (leftSum%average) + "오른쪽 나머지 : " + (rightSum%average) ); }*/ if( average==0 ) { if( rightSum< (_processor.length-index-1) ) return true; else return false; } else if( leftSum/(index+1) > rightSum/(_processor.length-index-1) ){ return true; } else if( leftSum/(index+1) == rightSum/(_processor.length-index-1 ) && _processor[index] > rightSum/(_processor.length-index-1) ) { System.out.println("라이트"); return true; } else { return false; } } public void printInfo() { System.out.println(); System.out.println("옮긴 횟수: " + getMovedJob() ); for(int i=0; i<_processor.length; i++) { System.out.print(_processor[i] + " " ); } System.out.println(); } public int getMovedJob() { return _movedJob; } }