def childWorker(inQueue, \ outQueue, \ schoolInfo, \ entriesList, \ config): #gc.set_debug(gc.DEBUG_LEAK) procName = multiprocessing.current_process().name newSched = None #Load config file wrkConfig = config #exec(open("settings.py").read(), wrkConfig) schedFitness.fitnessInitialize(schoolInfo, entriesList, wrkConfig) randGenWrk = random.SystemRandom() startTime = time.time() counter = 0 mutateCnt = 0 xOverCnt = 0 while True: workPackage = inQueue.get() counter += 1 # if procName == 'SchedWorker5' and counter%1000==0 : # msgStr = ('Wrkr5 GC Obj %d' % len(gc.get_objects())) # outQueue.put({'msg':msgStr}) if workPackage['cmd'] == 'STOP': break elif workPackage['cmd'] == 'Mutate': newSched = mutate(workPackage['sch1'], randGenWrk) if newSched['score'] < workPackage['sch1']['score']: #print ('Mutate child parent fitness %d %d' % (newSched['score'], workPackage['sch1']['score'])) outQueue.put ({'idx':workPackage['idx'], 'sch':newSched, 'method':'M'}) mutateCnt += 1 elif workPackage['cmd'] == 'XOver': newSched = scheduleSex(workPackage['sch1'], workPackage['sch2'], randGenWrk) if newSched['score'] < workPackage['sch1']['score']: #print ('XOver child parent fitness %d %d' % (newSched['score'], workPackage['sch1']['score'])) outQueue.put ({'idx':workPackage['idx'], 'sch':newSched, 'method':'X'}) xOverCnt += 1 elif workPackage['cmd'] == 'Done': outQueue.put({'done':1}) msgStr = '%s STOP Count %d Rate %1.1f xOver:%d Mutate:%d:' % \ (procName, counter, counter / (time.time()-startTime), xOverCnt, mutateCnt) outQueue.put({'msg':msgStr}) msgStr = procName + ' ' + schedFitness.getFitnessMetrics() outQueue.put({'msg':msgStr})
def childWorker(inQueue, \ outQueue, \ schoolInfo, \ entriesList, \ config): #gc.set_debug(gc.DEBUG_LEAK) procName = multiprocessing.current_process().name newSched = None #Load config file wrkConfig = config #exec(open("settings.py").read(), wrkConfig) schedFitness.fitnessInitialize(schoolInfo, entriesList, wrkConfig) randGenWrk = random.SystemRandom() startTime = time.time() counter = 0 mutateCnt = 0 xOverCnt = 0 while True: workPackage = inQueue.get() counter += 1 # if procName == 'SchedWorker5' and counter%1000==0 : # msgStr = ('Wrkr5 GC Obj %d' % len(gc.get_objects())) # outQueue.put({'msg':msgStr}) if workPackage['cmd'] == 'STOP': break elif workPackage['cmd'] == 'Mutate': newSched = mutate(workPackage['sch1'], randGenWrk) if newSched['score'] < workPackage['sch1']['score']: #print ('Mutate child parent fitness %d %d' % (newSched['score'], workPackage['sch1']['score'])) outQueue.put({ 'idx': workPackage['idx'], 'sch': newSched, 'method': 'M' }) mutateCnt += 1 elif workPackage['cmd'] == 'XOver': newSched = scheduleSex(workPackage['sch1'], workPackage['sch2'], randGenWrk) if newSched['score'] < workPackage['sch1']['score']: #print ('XOver child parent fitness %d %d' % (newSched['score'], workPackage['sch1']['score'])) outQueue.put({ 'idx': workPackage['idx'], 'sch': newSched, 'method': 'X' }) xOverCnt += 1 elif workPackage['cmd'] == 'Done': outQueue.put({'done': 1}) msgStr = '%s STOP Count %d Rate %1.1f xOver:%d Mutate:%d:' % \ (procName, counter, counter / (time.time()-startTime), xOverCnt, mutateCnt) outQueue.put({'msg': msgStr}) msgStr = procName + ' ' + schedFitness.getFitnessMetrics() outQueue.put({'msg': msgStr})
if 'msg' in response: logger.msg (response['msg']) respCount += 1; except Empty: break logger.msg ('Cleaned out %d from output queue' % respCount) for p in processes: try: p.join(timeout=60) except TimeoutError: logger.msg ('Timeout joining process') (lowestScore, lowestScoreIdx) = computeTopScore (rdm) logger.msg ('Best Score %4d' % lowestScore) logger.msg(schedFitness.getFitnessMetrics()) logger.msg ('Scores:') for scoreX in rdm: logger.msg (' %d ' % scoreX['score']) logger.msg ('Printing best score of %d' % lowestScore) scorePrintFolder = os.path.join(outFolder, str(math.floor(lowestScore))) if not os.path.exists(scorePrintFolder): fitnessFile = os.path.join(scorePrintFolder, 'fitnessReport.txt') schedIO.printSched (schedule = rdm[lowestScoreIdx], \ schoolInf = schoolInfo, \ outFolder = scorePrintFolder) validateSched(rdm[lowestScoreIdx], sessionList, entriesList, logger)
if 'msg' in response: logger.msg(response['msg']) respCount += 1 except Empty: break logger.msg('Cleaned out %d from output queue' % respCount) for p in processes: try: p.join(timeout=60) except TimeoutError: logger.msg('Timeout joining process') (lowestScore, lowestScoreIdx) = computeTopScore(rdm) logger.msg('Best Score %4d' % lowestScore) logger.msg(schedFitness.getFitnessMetrics()) logger.msg('Scores:') for scoreX in rdm: logger.msg(' %d ' % scoreX['score']) logger.msg('Printing best score of %d' % lowestScore) scorePrintFolder = os.path.join(outFolder, str(math.floor(lowestScore))) if not os.path.exists(scorePrintFolder): fitnessFile = os.path.join(scorePrintFolder, 'fitnessReport.txt') schedIO.printSched (schedule = rdm[lowestScoreIdx], \ schoolInf = schoolInfo, \ entriesLst = entriesList, \ outFolder = scorePrintFolder)