Package abstrasy.pcfx

Source Code of abstrasy.pcfx.PCFx_crossover_px

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_crossover_px extends PCFx {
   
/*****
* Implémente nativement l'algorithme 'points crossover' pour obtenir
* 4 nouveaux chromozomes (2 fils et les 2 parents).
*
* On remarquera que crossover-px permet les doublons.
*
* p1 = [1 2 3 4 5 6]
* p2 = [6 5 4 3 2 1]
*
* pivot1 = 2
* pivot2 = 4
*
* -> e1 = [1 2 4 3 2 6]
*    e2 = [6 5 3 4 5 1]
*
*****/

   
    public PCFx_crossover_px() {
    }

    private final static boolean isIn(Node a, Node liste) throws Exception{
        for(int i=0;i<liste.size();i++){
            if(Node.equalsNodes(a,liste.elementAt(i))){
                return true;
            }
        }
        return false;
    }
   
    private final static int getPos(Node a, Node liste) throws Exception{
        for(int i=0;i<liste.size();i++){
            if(Node.equalsNodes(a,liste.elementAt(i))){
                return i;
            }
        }
        return -1;
    }
   
    /**
     * eval
     *
     * @param startAt Node
     * @return Node
     * @throws Exception
     * @todo Implémenter cette méthode abstrasy.PCFx
     */
    public Node eval(Node startAt) throws Exception {
        /*
         * formes: (crossover-px [liste1] [liste2] pivot1 pivot2)
         *         (crossover-px [liste1] [liste2] pivot1)
         */
        startAt.isGoodArgsCnt(4, 5);
        Node p1 = startAt.getSubNode(1, Node.TYPE_CLIST);
        Node p2 = startAt.getSubNode(2, Node.TYPE_CLIST);
        if(p1.size()!=p2.size()){
            throw new InterpreterException(StdErrors.extend(StdErrors.List_size_mismatch,"(<>? "+p1.size()+" "+p2.size()+")"));
        }
        int pivot1 = (int)startAt.getSubNode(3, Node.TYPE_NUMBER).getNumber();
        int pivot2 = startAt.size()==5 ? (int)startAt.getSubNode(4, Node.TYPE_NUMBER).getNumber() : p1.size()-1;
        if(pivot1<0 || pivot1>=pivot2){
            throw new InterpreterException(StdErrors.extend(StdErrors.Out_of_range,"(starting point "+pivot1+")"));
        }
        if(pivot2<=pivot1 || pivot2>p1.size()-1){
            throw new InterpreterException(StdErrors.extend(StdErrors.Out_of_range,"(ending point "+pivot2+")"));
        }
       
        /*
         * Préparatifs de l'algo
         */
        int l = (pivot2 - pivot1) + 1;
        int l2= pivot2 + 1;
       
        Node e1 = Node.createCList();
        for(int i=0;i<pivot1;i++){
            e1.addElement(p1.elementAt(i));
        }
        for(int i=pivot1;i<(pivot1+l);i++){
            e1.addElement(p2.elementAt(i));
        }
        for(int i=l2;i<p1.size();i++){
            e1.addElement(p1.elementAt(i));
        }
       
        Node e2 = Node.createCList();
        for(int i=0;i<pivot1;i++){
            e2.addElement(p2.elementAt(i));
        }
        for(int i=pivot1;i<(pivot1+l);i++){
            e2.addElement(p1.elementAt(i));
        }
        for(int i=l2;i<p1.size();i++){
            e2.addElement(p2.elementAt(i));
        }
       
        Node o3 = Node.createCList();
        for(int i=0;i<p1.size();i++){
            o3.addElement(p1.elementAt(i));
        }
       
        Node o4 = Node.createCList();
        for(int i=0;i<p1.size();i++){
            o4.addElement(p2.elementAt(i));
        }
       
        // déréférencer...
        return Node.createCList()
            .append(e1.select(0, e1.size()))
            .append(e2.select(0, e2.size()))
            .append(o3.select(0, o3.size()))
            .append(o4.select(0, o4.size()));

    }

}
TOP

Related Classes of abstrasy.pcfx.PCFx_crossover_px

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.