U E D R , A S I H C RSS

Load Balancing Problem/Leonardong

No older revisions available

No older revisions available



LoadBalancingProblem

----
~python
##1h 11m
import copy

class SuperComputer:
    def __init__(self):
        self.numOfCPU = 0
        self.eachWork = list()
        self.minWork = 0
        self.maxWork = 0

    def computeMinMaxWork(self):
        self.minWork = self.eachWork[0]
        self.maxWork = self.eachWork[0]
        for i in range( 1, self.numOfCPU):
            if self.minWork > self.eachWork[i]:
                self.minWork = self.eachWork[i]
            if self.maxWork < self.eachWork[i]:
                self.maxWork = self.eachWork[i]

    def isCompelte(self):
        if self.maxWork - self.minWork > 1:
            return False
        return True
    def input(self, aNumOfCPU, aEachWorks):
        self.numOfCPU = aNumOfCPU
        self.eachWork = copy.deepcopy(aEachWorks)
        self.computeMinMaxWork()

    def isThisOverWork(self, aID):
        self.computeMinMaxWork()
        if self.getWork(aID) > self.minWork:
            return True
        return False

    def shareWork( self, aID ):
        if aID != 1:
            self.decreaseWork(aID)
            self.increaseWork(aID-1)
        if aID != self.numOfCPU:
            self.decreaseWork(aID)
            self.increaseWork(aID+1)

    def getWork(self, aID):
        assert 0 < aID <= self.numOfCPU
        return self.eachWork[aID-1]

    def decreaseWork(self, aID):
        assert 0 < aID <= self.numOfCPU
        self.eachWork[aID-1] = self.eachWork[aID-1] - 1

    def increaseWork(self, aID):
        assert 0 < aID <= self.numOfCPU
        self.eachWork[aID-1] = self.eachWork[aID-1] + 1

    def run(self):
        round = 0
        while not self.isCompelte():
            for id in range( 1, self.numOfCPU+1 ):
                if self.isThisOverWork(id):
                    self.shareWork(id)
                    print self.eachWork
            round = round + 1

        print self.eachWork
        print "??"
        print round
            
####################################################################
import unittest
    
class SuperComputerTestCase(unittest.TestCase):    
    def testIsComplete(self):
        com = SuperComputer()
        
        numOfCPU = 3
        eachWork = [0,0,0]
        com.input( numOfCPU, eachWork )
        self.assertEqual( com.isCompelte(), True )

        numOfCPU = 3
        eachWork = [0,99,3]
        com.input( numOfCPU, eachWork )
        self.assertEqual( com.isCompelte(), False )
        
    def testShareWork(self):
        com = SuperComputer()

        numOfCPU = 8
        eachWork = [16, 17, 15, 0, 20, 1, 1, 2]
        com.input( numOfCPU, eachWork )

        id = 1
        com.shareWork( id )
        
        expected = 15
        self.assertEqual( com.getWork(id), expected)
        id = 2
        expected = 18
        self.assertEqual( com.getWork(id), expected)
        
    def testIsThisOverWork(self):
        com = SuperComputer()

        numOfCPU = 10 
        eachWork = [0, 0, 100, 0, 0, 0, 0, 0, 0, 0]
        com.input( numOfCPU, eachWork )

        id = 3
        self.assertEqual( com.isThisOverWork(id), True )
        id = 1
        self.assertEqual( com.isThisOverWork(id), False )

    def testRun(self):
        com = SuperComputer()

        numOfCPU = 10 
        eachWork = [0, 0, 100, 0, 0, 0, 0, 0, 0, 0]
        com.input( numOfCPU, eachWork )
        com.run()

if __name__ == '__main__':
    unittest.main()   
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:40
Processing time 0.0148 sec