>The definitions are slightly out of order (verbs in randomize cannot be
>fixed because they are defined after randomize), so here is the code:

Right!

>Perhaps try this:
>next1  =:  ((i. <./)@:score { ]) randomize@:copy100@:]

Right again!  Althogh I was thinking about the double reference to CHARS.

 

________________________________
From: Viktor Cerovski <[email protected]>
To: [email protected]
Sent: Sun, December 20, 2009 12:32:54 PM
Subject: Re: [Jprogramming] Limit limitation


The definitions are slightly out of order (verbs in randomize cannot be
fixed because they are defined after randomize), so here is the code:


  CHARS    =: ' ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  mutation  =: CHARS&(] ,: [ {~ $...@] ?...@$#@[)
  fivePct  =: 0.05 >: $ ?...@$  0:
  randomize =: (fivePct f.)`(mutation f.)}
  score    =: +/@:~:"1
  copy100  =: 100 $ ,:
  NotDone  =: 1 - -:
  initial  =: CHARS ([ {~ ?...@$&#~ ) [
  next  =:  ([ (] {~ (i. <./)@:score) randomize@:copy100@:])
  evolve=: (next ^: NotDone ^: 1e5 initial) f.
  
  next1  =:  ((i. <./)@:score { ]) randomize@:copy100@:]
  evolve1=: (next1 ^: NotDone ^: 1e5 initial) f.
  
  evolve'METHINKS IT IS LIKE A WEASEL'
METHINKS IT IS LIKE A WEASEL
  evolve1'METHINKS IT IS LIKE A WEASEL'
METHINKS IT IS LIKE A WEASEL


Jose Mario Quintana wrote:
> 
>    CHARS     =: ' ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>    randomize =: (fivePct f.)`(mutation f.)}
>    fivePct   =: 0.05 >: $ ?...@$  0: 
>    mutation  =: CHARS&(] ,: [ {~ $...@] ?...@$#@[)  
>    score     =: +/@:~:"1
>    copy100   =: 100 $ ,:
>    NotDone      =: 1 - -:
>    initial   =: CHARS ([ {~ ?...@$&#~ ) [
>    next  =:  ([ (] {~ (i. <./)@:score) randomize@:copy100@:])
>    
> The following is a simple practical workaround; of course, it still has a
> limit (which often is a good thing to have) but it is user-controlled and
> it has an overhead but it might be possible, or it might not be possible,
> for the implementation to eventually catch up).
>    evolve=: (next ^: NotDone ^: 1e5 initial) f.
>    
>    evolve'METHINKS IT IS LIKE A WEASEL'
> METHINKS IT IS LIKE A WEASEL
>  A one-liner that seems open for reduction:
>       (([ (] {~ (i. <./)@:(
> 
> ________________________________
> From: Dan Bron <[email protected]>
> To: Programming Forum <[email protected]>
> Sent: Thursday, October 8, 2009 11:43:59 AM
> Subject: [Jprogramming] Limit limitation
> 
> I'm seeking a stylish workaround to the a constraint on applications of 
> ^:_  .
> 
> The idiom  ^:_  is well designed and well documented.  It is one of the
> most useful tools in the J kit and has broad applicability.  However,
> there are some cases where it's almost, but not quite, applicable.  
> 
> Consider the form  f^:g^:_  where  g  is a conditional which determines if
> f  is to be applied (again).  Of course if g returns 0, then f isn't
> applied, and  f^:g  becomes an identity function, which means its output
> will match its input, and  ^:_  will terminate.  So usually  ^:g^:_  acts
> as a while loop, independent of the operation of f, terminating iff g is
> 0. 
> 
> But now consider an f that is not one-to-one.  That is, an f where two or
> more distinct inputs may produce identical outputs.  Using this f in 
> f^:g^:_ becomes problematic.  If f receives two inputs in a row which map
> to the same output, then the loop will terminate early (that is, even if g
> is 1).
> 
> Here's a recent example.  I'm trying to code the "evoluationary algorithm"
> from RC  http://rosettacode.org/wiki/Evolutionary_algorithm  .  The code I
> have so far reads [1]:
> 
>     CHARS    =: ' ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>     randomize =: fivePct`mutation}
>     fivePct  =: 0.05 >: $ ?...@$  0: 
>     mutation  =: (UCALPHA,' ')&(] ,: [ {~ $...@] ?...@$ #...@[)  
>     score    =: +/@:~:"1
>     copy100  =: 100 $ ,:
>     done      =: 1 - -:
>     initial  =: CHARS ([ {~ ?...@$&#~ ) [
>     
>         f        =:  ([ (] {~ (i. <./)@:score) randomize@:copy100@:])
> 
>     (f^:done^:_: initial) 'METHINKS IT IS LIKE A WEASEL'
> 
> The problem I'm hitting is that f here isn't deterministic.  It takes a
> "parent", generates a random population, and selects the fittest member of
> that population -- which could legitimately be the original parent.  Hence
> input and output are identical and  f^:done^:_:  terminates "early".  What
> is I want is for  f^:done^:_:  to terminate iff  done  is true (that is, 
> 'METHINKS IT IS LIKE A WEASEL' -: y  ). 
> 
> Now, I understand that  ^:_  is doing the right thing.  I just want it to
> do a slightly different thing, and I'm asking for elegant ways to achieve
> that.  I know I've hit this wall before.  Has anyone else?  Can you
> suggest a stylish workaround?
> 
> One method I'm considering is artificially (but reversibly) changing the
> output of  f  at every iteration, as in  defining  f_new =: -.&.>@:{. ,&<
> f  (that is, concatenating a boolean and negating it every iteration).  
> 
> -Dan
> 
> [1]  Bear in mind this code is still in development, and may suffer from
> problems other than the one in question.
> 
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
> 
> +/@:~:"1)) (0.05 >: $ ?...@$0:)`(' ABCDEFGHIJKLMNOPQRSTUVWXYZ'&(] ,: [ {~ 
> $...@]
> ?...@$#@[))}@:(100$ ,:)@:])^:(1 - -:)^:1e5 (' ABCDEFGHIJKLMNOPQRSTUVWXYZ' ([
> {~ ?...@$&#~) [)) 'METHINKS IT IS LIKE A WEASEL'
> METHINKS IT IS LIKE A WEASEL
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
> 
> 

-- 
View this message in context: 
http://old.nabble.com/Re%3A-Limit-limitation-tp26865246s24193p26865434.html
Sent from the J Programming mailing list archive at Nabble.com.

----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to