package abstrasy.pcfx;
import abstrasy.Node;
import abstrasy.interpreter.InterpreterException;
import abstrasy.interpreter.StdErrors;
/**
* Abstrasy Interpreter
*
* Copyright : Copyright (c) 2006-2012, Luc Bruninx.
*
* Concédée sous licence EUPL, version 1.1 uniquement (la «Licence»).
*
* Vous ne pouvez utiliser la présente oeuvre que conformément à la Licence.
* Vous pouvez obtenir une copie de la Licence à l’adresse suivante:
*
* http://www.osor.eu/eupl
*
* Sauf obligation légale ou contractuelle écrite, le logiciel distribué sous
* la Licence est distribué "en l’état", SANS GARANTIES OU CONDITIONS QUELLES
* QU’ELLES SOIENT, expresses ou implicites.
*
* Consultez la Licence pour les autorisations et les restrictions
* linguistiques spécifiques relevant de la Licence.
*
*
* @author Luc Bruninx
* @version 1.0
*/
public class PCFx_populate_random extends PCFx {
/*****
* Implémente nativement l'algorithme 'random populate' du script suivant:
* =======================================================================
*
(define 's [ 1 2 3 4 5 6 ])
(define 'p [])
(define 'i 6) # doit être plus petit que la factorielle de (length s).
(while{i} do{
(define 'n (;s))
(define 'pn [])
(while{n} do{
(define 'k (round (random (- (length n) 1) ) ) )
(append! (@n k) to pn)
(remove! k from n)
})
(if{not (value? pn in p)} then{
(append! pn to p)
(decr! i)
})
})
(display "s = " s)
(display "p : " p)
=>
s = [1 2 3 4 5 6]
p : [
[3 6 2 4 5 1]
[1 4 5 6 2 3]
[4 2 3 5 6 1]
[1 5 4 6 3 2]
[1 6 3 4 5 2]
[3 1 4 6 2 5]
]
Ready...
*
* On un tableau de génomes aléatoires obtenus à partir du génome original.
*
*****/
public PCFx_populate_random() {
}
private final static boolean isIn(Node a, Node liste) throws Exception{
for(int i=0;i<liste.size();)
if(Node.equalsNodes(a,liste.elementAt(i++)))
return true;
return false;
}
/**
* eval
*
* @param startAt Node
* @return Node
* @throws Exception
* @todo Implémenter cette méthode abstrasy.PCFx
*/
public Node eval(Node startAt) throws Exception {
/*
* formes: (populate-random [liste] individus)
*
*/
startAt.isGoodArgsCnt(2,3);
Node p1 = startAt.getSubNode(1, Node.TYPE_CLIST);
int individus = startAt.size()==3 ? (int)startAt.getSubNode(2, Node.TYPE_NUMBER).getNumber() : p1.size();
double max = Math.max(1,p1.size());
double i=(max-1);
while(i>1)
max=max*i--;
//System.out.println("*"+max+" ,*"+individus);
if(individus<=0 || individus>max)
throw new InterpreterException(StdErrors.Out_of_range);
Node p2 = Node.createCList();
for(int j=0;j<p1.size();j++){
p2.addElement(p1.elementAt(j).secure());
}
Node p = Node.createCList();
while(individus>0){
Node n = p2.select(0, p2.size());
Node pn= Node.createCList();
while(n.size()>0){
int k = (int)Math.round(Math.random()*(n.size()-1));
pn.addElement(n.elementAt(k));
n.removeElementAt(k);
}
p.addElement(pn);
individus--;
}
return p;
}
}