def gale1(iter=1000, pop=1600, model=IPMDFC()): n_proc = int(1000.00 / iter) new = gale0(model, new=[], pop=int(pop / n_proc)) while iter: iter -= 1 new = gale0(model, new, pop=int(pop / n_proc)) return new
def runGALE(iterationsP, minBP, maxBP): from galeForModel import GALE from galeForModel import distFromHellScore from modelForGALE import IPMDFC import utility modelObj=IPMDFC() galeOutput = GALE(modelObj, iterationsP) #print("Final gale out put ", galeOutput) for item in galeOutput: print("item length is " , len(item)) print("item is ", item) objectivevals = modelObj.solve(item) print("objective values are ", objectivevals) fromHellScore = distFromHellScore(objectivevals) print("Distance from hell score is: ", fromHellScore) finalScore = utility.getNormalizedScoreForGale(minBP, maxBP, fromHellScore) print("Final score (after normalization ...)", finalScore)
def runGALE(iterationsP, minBP, maxBP): from galeForModel import GALE from galeForModel import distFromHellScore from modelForGALE import IPMDFC import utility modelObj = IPMDFC() galeOutput = GALE(modelObj, iterationsP) #print("Final gale out put ", galeOutput) for item in galeOutput: print("item length is ", len(item)) print("item is ", item) objectivevals = modelObj.solve(item) print("objective values are ", objectivevals) fromHellScore = distFromHellScore(objectivevals) print("Distance from hell score is: ", fromHellScore) finalScore = utility.getNormalizedScoreForGale(minBP, maxBP, fromHellScore) print("Final score (after normalization ...)", finalScore)
for cc in collect: final.extend(cc) ret = gale0( modelObjP ,new=final,pop=len(final)) #print('Time Taken: ', time()-t) # true = DTLZ2(n_dec=30, n_obj=3).get_pareto() #m = measure(model=DTLZ2(n_dec=30, n_obj=3)) #conv = m.convergence(ret) #print("Convergence:",conv) # set_trace() return ret def distFromHellScore(objListParam): import math square = lambda val: math.pow(val,2) sq_root = lambda val: math.sqrt(val) dist_from_hell =0 for f in objListParam: dist_from_hell += square(f) dist_from_hell = sq_root(dist_from_hell) return dist_from_hell if __name__=="__main__": iterations = 100 modelObj=IPMDFC() galeOutput = GALE(modelObj, iterations) #print("Final gale out put ", galeOutput) for item in galeOutput: print("item length is " , len(item)) print("item is ", item) objectivevals = modelObj.solve(item) print("objective values are ", objectivevals) print("Distance from hell score is: ", distFromHellScore(objectivevals))
def gale0(model=IPMDFC(), new=[], pop=int(1e4)): """ Recursive FASTMAP clustering. """ if len(new) == 0: frontier = model.generate(pop) else: frontier = new frontier.extend(model.generate(pop - len(new))) N = np.shape(frontier)[0] leaf = [] norm = np.max(frontier, axis=0) - np.min(frontier, axis=0) def cdom(x, y, better=['less', 'less', 'less']): def loss1(i, x, y): return (x - y) if better[i] == 'less' else (y - x) def expLoss(i, x, y, n): return np.exp(loss1(i, x, y) / n) def loss(x, y): n = min(len(x), len(y)) #lengths should be equal losses = [ expLoss(i, xi, yi, n) for i, (xi, yi) in enumerate(zip(x, y)) ] return sum(losses) / n "x dominates y if it losses least" return loss(x, y) < loss(y, x) def distant(lst): R, C = np.shape(lst) farthest = lambda one, rest: sorted(rest, key=lambda F: aDist(F, one))[ -1] one = lst[randi(0, R - 1)] mid = farthest(one, lst) two = farthest(mid, lst) return one, two def mutate(lst, good, g=0.15): new = [] for l in lst: new.append([a + (b - a) * g for a, b in zip(l, good)]) return new def aDist(one, two): return np.sqrt(np.sum( (np.array(one) / norm - np.array(two) / norm)**2)) def recurse(dataset): R, C = np.shape(dataset) # No. of Rows and Col # Find the two most distance points. one, two = distant(dataset) # Project each case on def proj(test): a = aDist(one, test) b = aDist(two, test) c = aDist(one, two) return (a**2 - b**2 + c**2) / (2 * c) if R < np.sqrt(N): leaf.extend(dataset) else: half1 = cdom(model.solve(one), model.solve(two)) if half1: _ = recurse( sorted(dataset, key=lambda F: proj(F))[:int(R / 2)]) else: _ = recurse( sorted(dataset, key=lambda F: proj(F))[int(R / 2):]) recurse(frontier) a, b = distant(leaf) (good, bad) = (a, b) if cdom(model.solve(a), model.solve(b)) else (b, a) new = mutate(leaf, good, g=0.5) return new
# true = DTLZ2(n_dec=30, n_obj=3).get_pareto() #m = measure(model=DTLZ2(n_dec=30, n_obj=3)) #conv = m.convergence(ret) #print("Convergence:",conv) # set_trace() return ret def distFromHellScore(objListParam): import math square = lambda val: math.pow(val, 2) sq_root = lambda val: math.sqrt(val) dist_from_hell = 0 for f in objListParam: dist_from_hell += square(f) dist_from_hell = sq_root(dist_from_hell) return dist_from_hell if __name__ == "__main__": iterations = 100 modelObj = IPMDFC() galeOutput = GALE(modelObj, iterations) #print("Final gale out put ", galeOutput) for item in galeOutput: print("item length is ", len(item)) print("item is ", item) objectivevals = modelObj.solve(item) print("objective values are ", objectivevals) print("Distance from hell score is: ", distFromHellScore(objectivevals))