Пример #1
0
class DE():
    def __init__(self, model="DTLZ7"):
        self.top_bound = [3.6, 0.8, 28.0, 8.3, 8.3, 3.9, 5.5]
        self.bottom_bound = [2.6, 0.7, 17.0, 7.3, 7.3, 2.9, 5]
        self.f2_high = -10**6
        self.f2_low = 10**6
        self.f1_high = -10**6
        self.f1_low = 10**6
        self.evals = 0
        self.median = []
        if model == "Osyczka":
            self.model = Osyczka()
        elif model == "Golinski":
            self.model = Golinski()
        elif model == "Kursawe":
            self.model = Kursawe()
        elif model == "Schaffer":
            self.model = Schaffer()
        elif model == "DTLZ7":
            self.model = DTLZ7(10, 2)
        self.best_solution = Thing()
        self.best_solution.score = 0
        self.best_solution.energy = 1
        self.best_solution.have = []
        self.previous_era = []

    #Returns three different things that are not 'avoid'.
    def threeOthers(self, lst, avoid):
        def oneOther():
            x = self.a(lst)
            while x in seen:
                x = self.a(lst)
            seen.append(x)
            return x

        # -----------------------
        seen = list(avoid.have)
        this = oneOther()
        that = oneOther()
        theOtherThing = oneOther()
        return this, that, theOtherThing

    def a(self, lst):
        return lst[self.n(len(lst))]

    def n(self, number):
        return int(uniform(0, number))

    def candidate(self):
        # something = [uniform(self.model.low(d), self.model.high(d))
        # for d in self.model.decisions()]
        something = self.model.get_random_state()
        new = Thing()
        new.have = something
        new.score = self.model.energy(new.have)
        new.energy = self.model.energy(new.have)
        return new

    def run(
            self,
            maximum=100,  # number of repeats 
            np=100,  # number of candidates
            f=0.75,  # extrapolate amount
            cf=0.3,  # prob of cross-over 
            epsilon=0.01,
            s=0.1):
        print "asd" + str(np)
        frontier = [self.candidate() for _ in range(np)]
        print "test"
        median = []
        print maximum
        for k in range(0, 100):
            total, n, output = self.update(f, cf, frontier)
            self.evals += n
            frontier.sort(key=lambda x: x.energy)
            #print output + "Frontier energy:" + str(total) + " Count:" + str(n) + " Max Energy:" + str(frontier[0].energy) + " Min Energy:" + str(frontier[len(frontier)-1].energy)
            min = frontier[0].energy
            max = frontier[len(frontier) - 1].energy
            median.append(frontier[int(len(frontier) / 2)].score)
            big = max - (max - min) * s / 100
            new_frontier = [x for x in frontier if x.energy <= big]
            frontier = new_frontier
            if (n > 0 and total / n >
                (1 - epsilon)) or n <= 0 or len(frontier) < 3:
                break
        print "Median values:"
        print median
        return self.previous_era

    def update(self, f, cf, frontier, total=0.0, n=0):
        output = ""
        MAX_LIVES = 10
        ERA_LENGTH = 10
        era_List = []
        current_era = []
        lives = MAX_LIVES
        for x in frontier:
            s = x.energy
            new = self.extrapolate(frontier, x, f, cf)
            #     if self.model.type1(x.have, new.have):
            #         output += "."
            if s < new.energy:
                output += "."
        #     elif self.model.type1(new.have, x.have):
        #         x.energy = new.energy
        #         x.score = new.score
        #         x.have  = new.have
        #         output += "+"
            elif new.energy < s:
                x.energy = new.energy
                x.score = new.score
                x.have = new.have
                output += "+"
        #     if self.model.type1(new.have, self.best_solution.have):
        #         self.best_solution.score = new.score
        #         self.best_solution.have = new.have
        #         self.best_solution.energy = new.energy
        #         self.best_solution.evals = self.evals + n
        #         output += "!"
            if new.energy < self.best_solution.energy:
                self.best_solution.score = new.score
                self.best_solution.have = new.have
                self.best_solution.energy = new.energy
                self.best_solution.evals = self.evals + n
                output += "!"
            if len(output) == 50:
                print output + " Best Solution: [",
                for a in self.best_solution.have:
                    print("%.2f " % a),
                print "] Energy: " + str(
                    self.best_solution.score) + " Evals: " + str(self.evals +
                                                                 n)
            current_era.append(x.have)
            if len(current_era) == ERA_LENGTH and len(era_List) > 0:
                increment = self.model.type2(current_era, era_List[-1])
                lives += increment
                if lives <= 0:
                    self.previous_era = era_List[-1]
                    print "Early termination"
                    break
                era_List.append(current_era)
                current_era = []
            n += 1
            total += x.energy
        return total, n, output

    def extrapolate(self, frontier, one, f, cf):
        out = Thing(id=one.id,
                    have=list(one.have),
                    score=self.model.energy(one.have),
                    energy=self.model.energy(one.have))
        two, three, four = self.threeOthers(frontier, one)
        changed = False
        for d in self.model.decisions():
            x, y, z = two.have[d], three.have[d], four.have[d]
            if random() < cf:
                changed = True
                new = x + f * (y - z)
                out.have[d] = max(0.0, min(new, 1.0))  # keep in range
        if not changed:
            d = self.a(self.model.decisions())
            out.have[d] = two.have[d]
        out.score = self.model.energy(out.have)  # remember to score it
        out.energy = self.model.energy(out.have)
        return out
Пример #2
0
class DE():
    def __init__(self, model = "DTLZ7"):
        self.top_bound = [3.6, 0.8, 28.0, 8.3, 8.3, 3.9, 5.5]
        self.bottom_bound = [2.6, 0.7, 17.0, 7.3, 7.3, 2.9, 5]
        self.f2_high = -10**6
        self.f2_low = 10**6
        self.f1_high = -10**6
        self.f1_low = 10**6
        self.evals = 0
        self.median = []
        if model == "Osyczka":
            self.model = Osyczka()
        elif model == "Golinski":
            self.model = Golinski()
        elif model == "Kursawe":
            self.model = Kursawe()
        elif model == "Schaffer":
            self.model = Schaffer()
        elif model == "DTLZ7":
            self.model = DTLZ7(10, 2)
        self.best_solution = Thing()
        self.best_solution.score = 0;
        self.best_solution.energy = 1;
        self.best_solution.have = []
        self.previous_era = []
        
    #Returns three different things that are not 'avoid'.
    def threeOthers(self, lst, avoid):
        def oneOther():
            x = self.a(lst)
            while x in seen: 
                x = self.a(lst)
            seen.append( x )
            return x
        # -----------------------
        seen = list(avoid.have)
        this = oneOther()
        that = oneOther()
        theOtherThing = oneOther()
        return this, that, theOtherThing

    def a(self, lst):
        return lst[self.n(len(lst))]

    def n(self, number):
        return int(uniform(0, number))

    def candidate(self):
        # something = [uniform(self.model.low(d), self.model.high(d))
        # for d in self.model.decisions()]
        something = self.model.get_random_state()
        new = Thing()
        new.have  = something
        new.score = self.model.energy(new.have)
        new.energy = self.model.energy(new.have)
        return new
    
    def run(self, maximum = 100,  # number of repeats 
            np      = 100,  # number of candidates
            f       = 0.75, # extrapolate amount
            cf      = 0.3,  # prob of cross-over 
            epsilon = 0.01,
            s       = 0.1
    ):
        print "asd" + str(np)
        frontier = [self.candidate() for _ in range(np)] 
        print "test"
        median = []
        print maximum
        for k in range(0, 100):
            total, n, output = self.update(f, cf, frontier)
            self.evals += n
            frontier.sort(key=lambda x: x.energy)
            #print output + "Frontier energy:" + str(total) + " Count:" + str(n) + " Max Energy:" + str(frontier[0].energy) + " Min Energy:" + str(frontier[len(frontier)-1].energy)
            min = frontier[0].energy
            max = frontier[len(frontier)-1].energy
            median.append(frontier[int(len(frontier)/2)].score)
            big = max - (max-min)*s/100
            new_frontier = [x for x in frontier if x.energy <= big]
            frontier = new_frontier
            if (n > 0 and total/n > (1 - epsilon)) or n <= 0 or len(frontier) < 3:
                break
        print "Median values:"
        print median
        return self.previous_era

    def update(self, f, cf, frontier, total = 0.0, n = 0):
        output = ""
        MAX_LIVES = 10
        ERA_LENGTH = 10
        era_List = []
        current_era = []
        lives = MAX_LIVES
        for x in frontier:
            s = x.energy
            new = self.extrapolate(frontier, x, f, cf)
        #     if self.model.type1(x.have, new.have):
        #         output += "."
            if s < new.energy:
                output += "."
        #     elif self.model.type1(new.have, x.have):
        #         x.energy = new.energy
        #         x.score = new.score
        #         x.have  = new.have
        #         output += "+"
            elif new.energy < s:
                x.energy = new.energy
                x.score = new.score
                x.have  = new.have
                output += "+"
        #     if self.model.type1(new.have, self.best_solution.have):
        #         self.best_solution.score = new.score
        #         self.best_solution.have = new.have
        #         self.best_solution.energy = new.energy
        #         self.best_solution.evals = self.evals + n
        #         output += "!"    
            if new.energy < self.best_solution.energy:
                self.best_solution.score = new.score
                self.best_solution.have = new.have
                self.best_solution.energy = new.energy
                self.best_solution.evals = self.evals + n
                output += "!"
            if len(output) == 50:
                print output + " Best Solution: [",
                for a in self.best_solution.have:
                    print("%.2f " % a),
                print "] Energy: " + str(self.best_solution.score) + " Evals: " + str(self.evals + n)
            current_era.append(x.have)
            if len(current_era) == ERA_LENGTH and len(era_List) > 0:
                increment = self.model.type2(current_era, era_List[-1])
                lives += increment
                if lives <= 0:
                    self.previous_era = era_List[-1]
                    print "Early termination"
                    break
                era_List.append(current_era)
                current_era = []
            n += 1
            total += x.energy
        return total, n, output
        
    def extrapolate(self, frontier, one, f, cf):
        out = Thing(id = one.id, have = list(one.have), score = self.model.energy(one.have), energy = self.model.energy(one.have))
        two, three, four = self.threeOthers(frontier, one)
        changed = False
        for d in self.model.decisions():
            x, y, z = two.have[d], three.have[d], four.have[d]
            if random() < cf:
                changed = True
                new = x + f*(y - z)
                out.have[d]  = max(0.0, min(new, 1.0)) # keep in range
        if not changed:
            d = self.a(self.model.decisions())
            out.have[d] = two.have[d]
        out.score = self.model.energy(out.have) # remember to score it
        out.energy = self.model.energy(out.have)
        return out
Пример #3
0
class DE():
    def __init__(self, model = "Osyczka"):
        self.top_bound = [3.6, 0.8, 28.0, 8.3, 8.3, 3.9, 5.5]
        self.bottom_bound = [2.6, 0.7, 17.0, 7.3, 7.3, 2.9, 5]
        self.f2_high = -10**6
        self.f2_low = 10**6
        self.f1_high = -10**6
        self.f1_low = 10**6
        self.evals = 0
        self.median = []
        if model == "Osyczka":
            self.model = Osyczka()
        elif model == "Golinski":
            self.model = Golinski()
        elif model == "Kursawe":
            self.model = Kursawe()
        elif model == "Schaffer":
            self.model = Schaffer()
        self.best_solution = Thing()
        self.best_solution.score = 0;
        self.best_solution.energy = 1;
        self.best_solution.have = []
        
    #Returns three different things that are not 'avoid'.
    def threeOthers(self, lst, avoid):
        def oneOther():
            x = self.a(lst)
            while x in seen: 
                x = self.a(lst)
            seen.append( x )
            return x
        # -----------------------
        seen = list(avoid.have)
        this = oneOther()
        that = oneOther()
        theOtherThing = oneOther()
        return this, that, theOtherThing

    def a(self, lst):
        return lst[self.n(len(lst))]

    def n(self, number):
        return int(uniform(0, number))

    def candidate(self):
        something = [uniform(self.model.low(d), self.model.high(d))
        for d in self.model.decisions()]
        new = Thing()
        new.have  = something
        new.score = self.model.energy(new.have)
        new.energy = self.model.aggregate_energy(new.have)
        return new
    
    def run(self, max     = 100,  # number of repeats 
            np      = 100,  # number of candidates
            f       = 0.75, # extrapolate amount
            cf      = 0.3,  # prob of cross-over 
            epsilon = 0.01,
            s       = 0.1
    ):
        frontier = [self.candidate() for _ in range(np)] 
        median = []
        for k in range(max):
            total, n, output = self.update(f, cf, frontier)
            self.evals += n
            frontier.sort(key=lambda x: x.energy)
            #print output + "Frontier energy:" + str(total) + " Count:" + str(n) + " Max Energy:" + str(frontier[0].energy) + " Min Energy:" + str(frontier[len(frontier)-1].energy)
            min = frontier[0].energy
            max = frontier[len(frontier)-1].energy
            median.append(frontier[int(len(frontier)/2)].energy)
            big = max - (max-min)*s/100
            new_frontier = [x for x in frontier if x.energy <= big]
            frontier = new_frontier
            if (n > 0 and total/n > (1 - epsilon)) or n <= 0 or len(frontier) < 3:
                break
        # print "Median values:"
        # print median
        return self.best_solution.have

    def update(self, f, cf, frontier, total = 0.0, n = 0):
        output = ""
        for x in frontier:
            s = x.energy
            new = self.extrapolate(frontier, x, f, cf)
            if s < new.energy:
                output += "."
            elif new.energy < s:
                x.energy = new.energy
                x.score = new.score
                x.have  = new.have
                output += "+"
            if new.energy < self.best_solution.energy:
                self.best_solution.score = new.score
                self.best_solution.have = new.have
                self.best_solution.energy = new.energy
                self.best_solution.evals = self.evals + n
                output += "!"
            if len(output) == 50:
                print output + " Best Solution: [",
                for a in self.best_solution.have:
                    print("%.2f " % a),
                print "] Energy: " + str(self.best_solution.score) + " Evals: " + str(self.evals + n)
            n += 1
            total += x.energy
        return total, n, output
        
    def extrapolate(self, frontier, one, f, cf):
        out = Thing(id = one.id, have = list(one.have), score = self.model.energy(one.have), energy = self.model.aggregate_energy(one.have))
        two, three, four = self.threeOthers(frontier, one)
        changed = False
        for d in self.model.decisions():
            x, y, z = two.have[d], three.have[d], four.have[d]
            if random() < cf:
                changed = True
                new = x + f*(y - z)
                out.have[d]  = self.model.trim(new, d) # keep in range
        if not changed:
            d = self.a(self.model.decisions())
            out.have[d] = two.have[d]
        out.score = self.model.energy(out.have) # remember to score it
        out.energy = self.model.aggregate_energy(out.have)
        return out
Пример #4
0
class DE():
    def __init__(self, model="Osyczka"):
        self.top_bound = [3.6, 0.8, 28.0, 8.3, 8.3, 3.9, 5.5]
        self.bottom_bound = [2.6, 0.7, 17.0, 7.3, 7.3, 2.9, 5]
        self.f2_high = -10**6
        self.f2_low = 10**6
        self.f1_high = -10**6
        self.f1_low = 10**6
        self.evals = 0
        self.median = []
        if model == "Osyczka":
            self.model = Osyczka()
        elif model == "Golinski":
            self.model = Golinski()
        elif model == "Kursawe":
            self.model = Kursawe()
        elif model == "Schaffer":
            self.model = Schaffer()
        self.best_solution = Thing()
        self.best_solution.score = 0
        self.best_solution.energy = 1
        self.best_solution.have = []

    #Returns three different things that are not 'avoid'.
    def threeOthers(self, lst, avoid):
        def oneOther():
            x = self.a(lst)
            while x in seen:
                x = self.a(lst)
            seen.append(x)
            return x

        # -----------------------
        seen = list(avoid.have)
        this = oneOther()
        that = oneOther()
        theOtherThing = oneOther()
        return this, that, theOtherThing

    def a(self, lst):
        return lst[self.n(len(lst))]

    def n(self, number):
        return int(uniform(0, number))

    def candidate(self):
        something = [
            uniform(self.model.low(d), self.model.high(d))
            for d in self.model.decisions()
        ]
        new = Thing()
        new.have = something
        new.score = self.model.energy(new.have)
        new.energy = self.model.aggregate_energy(new.have)
        return new

    def run(
            self,
            max=100,  # number of repeats 
            np=100,  # number of candidates
            f=0.75,  # extrapolate amount
            cf=0.3,  # prob of cross-over 
            epsilon=0.01,
            s=0.1):
        frontier = [self.candidate() for _ in range(np)]
        median = []
        for k in range(max):
            total, n, output = self.update(f, cf, frontier)
            self.evals += n
            frontier.sort(key=lambda x: x.energy)
            #print output + "Frontier energy:" + str(total) + " Count:" + str(n) + " Max Energy:" + str(frontier[0].energy) + " Min Energy:" + str(frontier[len(frontier)-1].energy)
            min = frontier[0].energy
            max = frontier[len(frontier) - 1].energy
            median.append(frontier[int(len(frontier) / 2)].energy)
            big = max - (max - min) * s / 100
            new_frontier = [x for x in frontier if x.energy <= big]
            frontier = new_frontier
            if (n > 0 and total / n >
                (1 - epsilon)) or n <= 0 or len(frontier) < 3:
                break
        # print "Median values:"
        # print median
        return self.best_solution.have

    def update(self, f, cf, frontier, total=0.0, n=0):
        output = ""
        for x in frontier:
            s = x.energy
            new = self.extrapolate(frontier, x, f, cf)
            if s < new.energy:
                output += "."
            elif new.energy < s:
                x.energy = new.energy
                x.score = new.score
                x.have = new.have
                output += "+"
            if new.energy < self.best_solution.energy:
                self.best_solution.score = new.score
                self.best_solution.have = new.have
                self.best_solution.energy = new.energy
                self.best_solution.evals = self.evals + n
                output += "!"
            if len(output) == 50:
                print output + " Best Solution: [",
                for a in self.best_solution.have:
                    print("%.2f " % a),
                print "] Energy: " + str(
                    self.best_solution.score) + " Evals: " + str(self.evals +
                                                                 n)
            n += 1
            total += x.energy
        return total, n, output

    def extrapolate(self, frontier, one, f, cf):
        out = Thing(id=one.id,
                    have=list(one.have),
                    score=self.model.energy(one.have),
                    energy=self.model.aggregate_energy(one.have))
        two, three, four = self.threeOthers(frontier, one)
        changed = False
        for d in self.model.decisions():
            x, y, z = two.have[d], three.have[d], four.have[d]
            if random() < cf:
                changed = True
                new = x + f * (y - z)
                out.have[d] = self.model.trim(new, d)  # keep in range
        if not changed:
            d = self.a(self.model.decisions())
            out.have[d] = two.have[d]
        out.score = self.model.energy(out.have)  # remember to score it
        out.energy = self.model.aggregate_energy(out.have)
        return out