[Cs254f11] length of individual thoughts...

Wm. Josiah Erikson wjerikson at hampshire.edu
Fri Dec 2 14:33:36 EST 2011


Hehe. Yes. Now I pose an interesting question (well, at least *I* think 
it's interesting):

Does doing this in one's tournament selection (preferring smaller 
individuals with the same error) prevent program bloat? (Yes, I think, 
from preliminary experiments) And does it inhibit evoluation?

I'm not sure yet on the second question, but I think the answer is 
probably yes as well. It certainly does with small population sizes, 
like 100 - you just hit a local minimum and sit there almost 
immediately. With a population size of 1000, given what I'm doing, it 
seems less clear that this is occurring, and the things I'm getting are 
certainly a lot shorter and more readable! This doesn't necessarily mean 
they are better, but perhaps it's easier to discern what they are 
actually doing and if it's at all interesting (probably not).

     -Josiah



On 12/2/11 2:16 PM, Lee Spector wrote:
> On Dec 2, 2011, at 2:02 PM, Wm. Josiah Erikson wrote:
>
>> You interpreted what I was doing correctly, and actually that "mistake" you pointed out was intentional, because to do it "right", the line gets even more insane:
>>
>> (first (first (sort #(<  (codesize (first %1)) (codesize (first %2))) (filter #(= (second %) (second (first sorted))) sorted))))
>>
>> And it doesn't gain you anything.
>>
> Yeah, well...... in a sense, but in another it gains you clarity of purpose when you try to read/change your code, which is actually pretty valuable.
>
>
>> But I don't quite know how to write the second thing you suggest. Let's take a stab:
>>
>> (let
>>       [sorted (sort (fn [[prog1 err1] [prog2 err2]] (or (<  err1 err2)(<  (codesize prog1) (codesize prog2)))) population)]
> Close, but not quite.
>
> First, let's reformat this -- I can't stress enough how much this can help, at least for me, and I suspect for everyone:
>
> (let [sorted (sort (fn [[prog1 err1] [prog2 err2]]
>                       (or (<  err1 err2)
>                           (<  (codesize prog1)
>                              (codesize prog2))))
>                     population)]
>
> We're sorting population by a function of two arguments that are destructured into program/error pairs, and the guts of the thing is:
>
> (or (<  err1 err2)
>      (<  (codesize prog1)
>         (codesize prog2)))
>
> So you're telling sort that pair number 1 comes before pair number 2 if its error is lower OR its size is smaller. Which means it'll make it come first if it's smaller, even if it's ... AHA -- you discovered this and emailed me mid sentence!
>
> Now you propose (reformatted!):
>
> (let
>       [sorted (sort (fn [[prog1 err1] [prog2 err2]]
>                       (or (<  err1 err2)
>                           (and (<  (codesize prog1) (codesize prog2))
>                                (= err1 err2))))
>                     population)]
>
> And that looks right to me!
>
>   -Lee
>
>
>
>
>
>> ...
>>
>> I think that's what you meant, and is, indeed, a better idea. Thanks :)
>>
>>     -Josiah
>>
>>
>>
>> On 12/2/11 12:20 PM, Lee Spector wrote:
>>> Close.... or rather, I think it will work but slightly by accident.
>>>
>>> I'm assuming that "sorted" here contains a sequence of [program error] pairs -- note that in some of my example code I had those pairs the other way around, so make sure you're treating them consistently!
>>>
>>> In any event, with that assumption (which is the only thing that makes sense given the rest of your code) your call to filter is producing a sequence of only those that have the same error as the first one (which will be the best). Then you're sorting those on the basis of which has the lowest codesize, but you're calling codesize on the whole pairs rather than on just the programs. Which I guess always comes to the same thing, since the error will just add 1 to everything uniformly. So it'll do the right thing but not quite in the right way (which you could do by calling codesize on just the programs).
>>>
>>> Alternatively, and this is probably what I'd do, you could change the predicate used in the call to sort that gives a value to "sorted" it say that %1 should come before %2 if either %1 has a lower error OR if they have the same error by the program in %1 has a lower codesize.
>>>
>>>   -Lee
>>>
>>>
>>> On Dec 2, 2011, at 11:24 AM, Wm. Josiah Erikson wrote:
>>>
>>>> So in the way I'm evolving things, I've often got a population full of individuals with similar error. Given Lee's
>>>>
>>>> (let [sorted (sort #(<   (second %1) (second %2)) population)]
>>>>
>>>> would this function get the smallest individual that had the best error? :
>>>>
>>>> (first (first (sort #(<   (codesize %1) (codesize %2)) (filter #(= (second %) (second (first sorted))) sorted))))
>>>>
>>>> (It seems to work)
>>>>
>>>> Is there an easier way to do that? Is this even a good idea? I'm currently just using it as the final return value so that my final result is as easy to read as possible :)
>>>> _______________________________________________
>>>> Cs254f11 mailing list
>>>> Cs254f11 at lists.hampshire.edu
>>>> https://lists.hampshire.edu/mailman/listinfo/cs254f11
>>> --
>>> Lee Spector, Professor of Computer Science
>>> Cognitive Science, Hampshire College
>>> 893 West Street, Amherst, MA 01002-3359
>>> lspector at hampshire.edu, http://hampshire.edu/lspector/
>>> Phone: 413-559-5352, Fax: 413-559-5438
>>>
>>> _______________________________________________
>>> Cs254f11 mailing list
>>> Cs254f11 at lists.hampshire.edu
>>> https://lists.hampshire.edu/mailman/listinfo/cs254f11
>> -- 
>> Wm. Josiah Erikson
>> Network Engineer
>> Hampshire College
>> Amherst, MA 01002
>> (413) 559-6091
>>
>> _______________________________________________
>> Cs254f11 mailing list
>> Cs254f11 at lists.hampshire.edu
>> https://lists.hampshire.edu/mailman/listinfo/cs254f11
> --
> Lee Spector, Professor of Computer Science
> Cognitive Science, Hampshire College
> 893 West Street, Amherst, MA 01002-3359
> lspector at hampshire.edu, http://hampshire.edu/lspector/
> Phone: 413-559-5352, Fax: 413-559-5438
>

-- 
Wm. Josiah Erikson
Network Engineer
Hampshire College
Amherst, MA 01002
(413) 559-6091



More information about the Cs254f11 mailing list