More actions
imported>Unknown No edit summary |
(Repair MoniWiki formatting after migration) |
||
| (One intermediate revision by the same user not shown) | |||
| Line 12: | Line 12: | ||
public class LoadBalancingMain { | public class LoadBalancingMain { | ||
public static void main(String | public static void main(String[] args) { | ||
TestSuite suite = new TestSuite(); | TestSuite suite = new TestSuite(); | ||
| Line 38: | Line 38: | ||
LoadBalancing bal = new LoadBalancing(3); | LoadBalancing bal = new LoadBalancing(3); | ||
int sData | int sData[] = {1,3,3}; | ||
int gData | int gData[]; | ||
bal.setData(sData); | bal.setData(sData); | ||
| Line 45: | Line 45: | ||
for(int i=0; i<sData.length; i++) | for(int i=0; i<sData.length; i++) | ||
assertEquals(sData | assertEquals(sData[i], gData[i]); | ||
} | } | ||
public void testGetSumOfJob() { | public void testGetSumOfJob() { | ||
LoadBalancing bal = new LoadBalancing(3); | LoadBalancing bal = new LoadBalancing(3); | ||
int data | int data[]={1,3,4}; | ||
bal.setData(data); | bal.setData(data); | ||
| Line 60: | Line 60: | ||
LoadBalancing bal = new LoadBalancing(10); | LoadBalancing bal = new LoadBalancing(10); | ||
/*int data | /*int data[]={1,2,3,4,5,6,7,8,9,10}; | ||
bal.setData(data); | bal.setData(data); | ||
| Line 85: | Line 85: | ||
assertEquals(bal.checkRight(9), false); | assertEquals(bal.checkRight(9), false); | ||
int data_ | int data_[] = {5,5,5,5,5,5,5,5,5,10}; | ||
bal.setData(data_); | bal.setData(data_); | ||
assertEquals(bal.checkLeft(0), false); | assertEquals(bal.checkLeft(0), false); | ||
| Line 109: | Line 109: | ||
assertEquals(bal.checkRight(9), false); | assertEquals(bal.checkRight(9), false); | ||
int data__ | int data__[] = {10,9,8,7,6,5,4,3,2,1}; | ||
bal.setData(data__); | bal.setData(data__); | ||
| Line 135: | Line 135: | ||
bal = new LoadBalancing(10); | bal = new LoadBalancing(10); | ||
int data___ | int data___[]={13,13,13,13,13,14,14,15,13,13}; | ||
bal.setData(data___); | bal.setData(data___); | ||
| Line 147: | Line 147: | ||
LoadBalancing bal = new LoadBalancing(3); | LoadBalancing bal = new LoadBalancing(3); | ||
int data | int data[]={0,3,0}; | ||
bal.setData(data); | bal.setData(data); | ||
bal.loadBalance(); | bal.loadBalance(); | ||
| Line 154: | Line 154: | ||
bal = new LoadBalancing(10); | bal = new LoadBalancing(10); | ||
int data_ | int data_[] = {1,2,3,4,5,6,7,8,9,10}; | ||
bal.setData(data_); | bal.setData(data_); | ||
bal.loadBalance(); | bal.loadBalance(); | ||
| Line 161: | Line 161: | ||
bal = new LoadBalancing(10); | bal = new LoadBalancing(10); | ||
int data__ | int data__[]={5,0,10,6,1,49,1,50,3,9}; | ||
assertEquals(10, data__.length); | assertEquals(10, data__.length); | ||
bal.setData(data__); | bal.setData(data__); | ||
| Line 169: | Line 169: | ||
bal = new LoadBalancing(10); | bal = new LoadBalancing(10); | ||
int data___ | int data___[]={13,13,13,13,13,13,13,13,15,14}; | ||
bal.setData(data___); | bal.setData(data___); | ||
bal.loadBalance(); | bal.loadBalance(); | ||
| Line 176: | Line 176: | ||
bal = new LoadBalancing(10); | bal = new LoadBalancing(10); | ||
int data____ | int data____[]={0,9,0,0,0,0,0,0,0,0}; | ||
bal.setData(data____); | bal.setData(data____); | ||
bal.loadBalance(); | bal.loadBalance(); | ||
| Line 200: | Line 200: | ||
public class LoadBalancing { | public class LoadBalancing { | ||
private int _processor | private int _processor[]; | ||
private int _processorNum; | private int _processorNum; | ||
private int _movedJob; | private int _movedJob; | ||
public LoadBalancing(int processorNum) { | public LoadBalancing(int processorNum) { | ||
_processor = new int | _processor = new int[processorNum]; | ||
_processorNum = processorNum; | _processorNum = processorNum; | ||
} | } | ||
| Line 213: | Line 213: | ||
} | } | ||
public int | public int[] getProcessorInfo() { | ||
return _processor; | return _processor; | ||
} | } | ||
| Line 221: | Line 221: | ||
for(int i=0; i<_processor.length; i++) | for(int i=0; i<_processor.length; i++) | ||
sum+=_processor | sum+=_processor[i]; | ||
return sum; | return sum; | ||
} | } | ||
public void setData(int | public void setData(int[] data) { | ||
for(int i=0; i<data.length; i++) | for(int i=0; i<data.length; i++) | ||
_processor | _processor[i] = data[i]; | ||
} | } | ||
public int | public int[] getData() { | ||
return _processor; | return _processor; | ||
} | } | ||
| Line 241: | Line 241: | ||
while( !isFinishedCondition() ) { | while( !isFinishedCondition() ) { | ||
if( pos!=0 && checkLeft(pos) && _processor | if( pos!=0 && checkLeft(pos) && _processor[pos]!=0) { | ||
_processor | _processor[pos-1]++; | ||
_processor | _processor[pos]--; | ||
_movedJob++; | _movedJob++; | ||
System.out.println(pos + " 에서" + (pos-1) + " 로 옮김"); | System.out.println(pos + " 에서" + (pos-1) + " 로 옮김"); | ||
} | } | ||
else if( pos<_processor.length-1 && checkRight(pos) && _processor | else if( pos<_processor.length-1 && checkRight(pos) && _processor[pos]!=0) { | ||
_processor | _processor[pos]--; | ||
_processor | _processor[pos+1]++; | ||
_movedJob++; | _movedJob++; | ||
| Line 277: | Line 277: | ||
for(int i=0; i!=_processor.length; i++) { | for(int i=0; i!=_processor.length; i++) { | ||
ret = (ret<_processor | ret = (ret<_processor[i])?_processor[i]:ret; | ||
} | } | ||
return ret; | return ret; | ||
| Line 286: | Line 286: | ||
for(int i=0; i!=_processor.length; i++) { | for(int i=0; i!=_processor.length; i++) { | ||
ret = (ret>_processor | ret = (ret>_processor[i])?_processor[i]:ret; | ||
} | } | ||
return ret; | return ret; | ||
| Line 303: | Line 303: | ||
// 왼쪽 평균<오른쪽 평균 | // 왼쪽 평균<오른쪽 평균 | ||
for(int i=0; i<index; i++) { | for(int i=0; i<index; i++) { | ||
leftSum+=_processor | leftSum+=_processor[i]; | ||
} | } | ||
rightSum = getSumOfJob() - leftSum; | rightSum = getSumOfJob() - leftSum; | ||
| Line 319: | Line 319: | ||
} | } | ||
/*else if(leftSum/index == rightSum/(_processor.length-index) | /*else if(leftSum/index == rightSum/(_processor.length-index) | ||
&& _processor | && _processor[index] > leftSum/index ) { | ||
return true; | return true; | ||
}*/ | }*/ | ||
| Line 339: | Line 339: | ||
// 왼쪽 평균>오른쪽 평균 | // 왼쪽 평균>오른쪽 평균 | ||
for(int i=0; i<=index; i++) { | for(int i=0; i<=index; i++) { | ||
leftSum+=_processor | leftSum+=_processor[i]; | ||
} | } | ||
if(index==0) | if(index==0) | ||
leftSum = _processor | leftSum = _processor[0]; | ||
rightSum = getSumOfJob() - leftSum; | rightSum = getSumOfJob() - leftSum; | ||
/*if( average != 0 ) { | /*if( average != 0 ) { | ||
System.out.println("인덱스 : " + index ); | System.out.println("인덱스 : " + index ); | ||
System.out.println("평균 : " + _processor | System.out.println("평균 : " + _processor[index] + "왼쪽나머지:" + (leftSum%average) | ||
+ "오른쪽 나머지 : " + (rightSum%average) ); | + "오른쪽 나머지 : " + (rightSum%average) ); | ||
}*/ | }*/ | ||
| Line 360: | Line 360: | ||
} | } | ||
else if( leftSum/(index+1) == rightSum/(_processor.length-index-1 ) | else if( leftSum/(index+1) == rightSum/(_processor.length-index-1 ) | ||
&& _processor | && _processor[index] > rightSum/(_processor.length-index-1) ) { | ||
System.out.println("라이트"); | System.out.println("라이트"); | ||
return true; | return true; | ||
| Line 372: | Line 372: | ||
System.out.println("옮긴 횟수: " + getMovedJob() ); | System.out.println("옮긴 횟수: " + getMovedJob() ); | ||
for(int i=0; i<_processor.length; i++) { | for(int i=0; i<_processor.length; i++) { | ||
System.out.print(_processor | System.out.print(_processor[i] + " " ); | ||
} | } | ||
System.out.println(); | System.out.println(); | ||
| Line 382: | Line 382: | ||
---- | ---- | ||
LoadBalancingProblem | [[LoadBalancingProblem]] | ||
Latest revision as of 00:34, 29 March 2026
== LoadBalancingMain.java ==
/**
* @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 ==
/**
* @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 ==
/**
* @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;
}
}