Package abstrasy.pcfx

Source Code of abstrasy.pcfx.PCFx_crossover_pmx

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_pmx extends PCFx {
   
/*****
* Implémente nativement l'algorithme 'partially mapped crossover' du script suivant:
* =================================================================================
*

#
# crossover-pmx (partially mapped crossover)
#
(define 'p1 [1 2 3 4 5 6 7 8])
(define 'p2 [3 7 5 1 6 8 2 4])

(define 'pivot1 3)
(define 'pivot2 5)

(define 'l (+ (- pivot2 pivot1) 1))
(define 'l2 (+ pivot2 1))

(define 'a1 (select p1 pivot1 l))
(define 'a2 (select p2 pivot1 l))
(define 'b1 (merge (select p1 0 pivot1) (select p1 l2 (- (length p1) l2))))
(define 'b2 (merge (select p2 0 pivot1) (select p2 l2 (- (length p2) l2))))

(display "p1 = " p1)
(display "p2 = " p2)

(display)
(display "a1 = " a1 ", b1 = " b1)
(display "a2 = " a2 ", b2 = " b2)

(define 'r1 (foreach a1 list{ (args 'a ...) (if{value? a in b2} then{a}) }))
(define 'r2 (foreach a2 list{ (args 'a ...) (if{value? a in b1} then{a}) }))

(display)
(display "r1 = " r1)
(display "r2 = " r2)


(define 'b21
  (foreach b2 list{(args 'b ...)
    (define 'found (find b in r1))
    (if{found} then{
      (@r2 (@found 0))
    }
    else{
      b
    })
  })
)

(define 'b12
  (foreach b1 list{(args 'b ...)
    (define 'found (find b in r2))
    (if{found} then{
      (@r1 (@found 0))
    }
    else{
      b
    })
  })
)

(define 'a21
  (foreach a2 list{(args 'a ...)
    (define 'found (find a in r2))
    (if{found} then{
      (@r1 (@found 0))
    }
    else{
      a
    })
  })
)

(define 'a12
  (foreach a1 list{(args 'a ...)
    (define 'found (find a in r1))
    (if{found} then{
      (@r2 (@found 0))
    }
    else{
      a
    })
  })
)

(define 'a1-b21 (merge (select b21 0 pivot1) a1 (select b21 pivot1 (- (length b21) pivot1))))
(define 'a2-b12 (merge (select b12 0 pivot1) a2 (select b12 pivot1 (- (length b12) pivot1))))

(define 'a21-b1 (merge (select b1 0 pivot1) a21 (select b1 pivot1 (- (length b1) pivot1))))
(define 'a12-b2 (merge (select b2 0 pivot1) a12 (select b2 pivot1 (- (length b2) pivot1))))

(display)
(display "b21 = " b21)
(display "b12 = " b12)
(display "a21 = " a21)
(display "a12 = " a12)

(display)
(display "a1-b21 = " a1-b21)
(display "a2-b12 = " a2-b12)
(display "a21-b1 = " a21-b1)
(display "a12-b2 = " a12-b2)

=>

p1 = [1 2 3 4 5 6 7 8]
p2 = [3 7 5 1 6 8 2 4]

a1 = [4 5 6], b1 = [1 2 3 7 8]
a2 = [1 6 8], b2 = [3 7 5 2 4]

r1 = [4 5]
r2 = [1 8]

b21 = [3 7 8 2 1]
b12 = [4 2 3 7 5]
a21 = [4 6 5]
a12 = [1 8 6]

a1-b21 = [3 7 8 4 5 6 2 1]
a2-b12 = [4 2 3 1 6 8 7 5]
a21-b1 = [1 2 3 4 6 5 7 8]
a12-b2 = [3 7 5 1 8 6 2 4]

Ready...

*
* On obtient 4 nouveaux chromozomes (2 fils et les 2 parents).
*
*****/

   
    public PCFx_crossover_pmx() {
    }

    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-pmx [liste1] [liste2] pivot1 pivot2)
         *         (crossover-pmx [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 a1 = Node.createCList();
        for(int i=pivot1;i<(pivot1+l);i++){
            a1.addElement(p1.elementAt(i));
        }
       
        Node a2 = Node.createCList();
        for(int i=pivot1;i<(pivot1+l);i++){
            a2.addElement(p2.elementAt(i));
        }
       
        Node b1 = Node.createCList();
        for(int i=0;i<pivot1;i++){
            b1.addElement(p1.elementAt(i));
        }
        for(int i=l2;i<p1.size();i++){
            b1.addElement(p1.elementAt(i));
        }
       
        Node b2 = Node.createCList();
        for(int i=0;i<pivot1;i++){
            b2.addElement(p2.elementAt(i));
        }
        for(int i=l2;i<p2.size();i++){
            b2.addElement(p2.elementAt(i));
        }
       
       
        Node r1 = Node.createCList();
        for(int i=0;i<a1.size();i++){
            Node a = a1.elementAt(i);
            if(isIn(a,b2)){
                r1.addElement(a);
            }
        }
       
        Node r2 = Node.createCList();
        for(int i=0;i<a2.size();i++){
            Node a = a2.elementAt(i);
            if(isIn(a,b1)){
                r2.addElement(a);
            }
        }
       
       
        Node b21 = Node.createCList();
        for(int i=0;i<b2.size();i++){
            Node b = b2.elementAt(i);
            int found = getPos(b,r1);
            if(found>=0){
                b21.addElement(r2.elementAt(found));
            }
            else{
                b21.addElement(b);
            }
        }
       
        Node b12 = Node.createCList();
        for(int i=0;i<b1.size();i++){
            Node b = b1.elementAt(i);
            int found = getPos(b,r2);
            if(found>=0){
                b12.addElement(r1.elementAt(found));
            }
            else{
                b12.addElement(b);
            }
        }
       
        Node a21 = Node.createCList();
        for(int i=0;i<a2.size();i++){
            Node a = a2.elementAt(i);
            int found = getPos(a,r2);
            if(found>=0){
                a21.addElement(r1.elementAt(found));
            }
            else{
                a21.addElement(a);
            }
        }
       
        Node a12 = Node.createCList();
        for(int i=0;i<a1.size();i++){
            Node a = a1.elementAt(i);
            int found = getPos(a,r1);
            if(found>=0){
                a12.addElement(r2.elementAt(found));
            }
            else{
                a12.addElement(a);
            }
        }
       
       
        // sécuriser la finalité...
        Node a1b21 = Node.createCList();
        for(int i=0;i<pivot1;i++){
            a1b21.addElement(b21.elementAt(i));
        }
        for(int i=0;i<a1.size();i++){
            a1b21.addElement(a1.elementAt(i));
        }
        for(int i=pivot1;i<b21.size();i++){
            a1b21.addElement(b21.elementAt(i));
        }
       
        Node a2b12 = Node.createCList();
        for(int i=0;i<pivot1;i++){
            a2b12.addElement(b12.elementAt(i));
        }
        for(int i=0;i<a2.size();i++){
            a2b12.addElement(a2.elementAt(i));
        }
        for(int i=pivot1;i<b12.size();i++){
            a2b12.addElement(b12.elementAt(i));
        }
       
        Node a21b1 = Node.createCList();
        for(int i=0;i<pivot1;i++){
            a21b1.addElement(b1.elementAt(i));
        }
        for(int i=0;i<a21.size();i++){
            a21b1.addElement(a21.elementAt(i));
        }
        for(int i=pivot1;i<b1.size();i++){
            a21b1.addElement(b1.elementAt(i));
        }
       
        Node a12b2 = Node.createCList();
        for(int i=0;i<pivot1;i++){
            a12b2.addElement(b2.elementAt(i));
        }
        for(int i=0;i<a12.size();i++){
            a12b2.addElement(a12.elementAt(i));
        }
        for(int i=pivot1;i<b2.size();i++){
            a12b2.addElement(b2.elementAt(i));
        }
       
        // déréférencer...
        return Node.createCList()
            .append(a1b21.select(0, a1b21.size()))
            .append(a2b12.select(0, a2b12.size()))
            .append(a21b1.select(0, a21b1.size()))
            .append(a12b2.select(0, a12b2.size()));

    }

}
TOP

Related Classes of abstrasy.pcfx.PCFx_crossover_pmx

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.