[Java]gestoei met references

Pagina: 1
Acties:

  • steveman
  • Registratie: Mei 2001
  • Laatst online: 19:48

steveman

Comfortabel ten onder

Topicstarter
Zat ik leuk wat te prutsen met een genetisch algoritme, raak ik in de knoop met references!

(genotype van individuen in een vector veranderen door crossover en mutatie en dan allemaal dezelfde individuen over houden :( )

Om het probleem wat eenvoudiger te benaderen had ik even een klasse Refs gemaakt om uit te zoeken wat er fout gaat, ongetwijfeld een ontzettend beginnersprobleem :$ maar ik zit er mooi mee!

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.util.*;
public clas Refs{
   public static void main(String argv[]){
      Vector v1 = new Vector();
      Vector v2 = new Vector();

      Ob objectje = new Ob();
      objectje.i=1;

      v1.add(objectje);
      v2.add(objectje);

      Ob temp = new Ob();
      temp = (Ob)v1.elementAt(0);
      temp.i=666;
      v1.setElementAt(temp,0);

     System.out.println((Ob)v1.elementAt(0); + " " + (Ob)v2.elementAt(0));

     }//main

     public static class Ob{
     int i;
     ob(){
         i=0;
     }
     public String toString(){
         return ""+i;
     }
     }//ob
}//Refs      

Dit geeft als output: 666 666
Terwijl ik zou willen: 666 1

Is hier een eenvoudige oplossing voor?

[ Voor 0% gewijzigd door steveman op 03-12-2006 18:37 . Reden: line 14 foute cast ]

"Take the risk of thinking for yourself. Much more happiness, truth, beauty, and wisdom will come to you that way." -Christopher Hitchens | In memoriam? 🏁 ipv kruis!


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 05-11 19:33
Als je regel 14 weglaat, dan zou het wel moeten werken.

Je maakt namelijk een nieuwe object aan, waarna je de variabel gelijk gebruikt om een ander object in op te slaan. De aangemaakte instantie (op regel 13) ben je dan dus gelijk kwijt. temp verwijst vanaf regel 14 ook naar de instantie waarnaar objectje verwijst.

Die cast op regel 14 lijkt me ook uiterst vreemd. Moet dat niet (Ob) zijn ipv. (objectje)? Het lijkt me niet dat het zo compiled.

[ Voor 87% gewijzigd door Michali op 03-12-2006 17:49 ]

Noushka's Magnificent Dream | Unity


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 01-12 20:19

Gerco

Professional Newbie

Op regels 10 en 11 voeg je hetzelfde object twee maal toe aan de vector. De vector maakt geen kopie van dat object, alleen een verwijzing. Als je vervolgens die verwijzing uit de vector haalt en het onderligende object verandert, lijkt het natuurlijk alsof je andere object ook verandert, maar dat is niet zo, want je hebt maar 1 object.

Om dit te laten werken moet je twee verschillende instanties van Ob aanmaken. Op deze manier:
Java:
1
2
3
Vector v = new Vector();
v.add(new Ob());
v.add(new Ob());

Nu heb je twee verschillende Ob objecten in de Vector die je ook verschillende waardes kan geven.

Nu zie je ook gelijk dat het terugplaatsen van het object in de vector (setElementAt) overbodig is. Wat je in en uit die vector haalt is slechts een verwijzing naar een object en als je dat onderliggende object verandert, hoef je in de Vector niets meer te doen.

Die cast is inderdaad erg raar, kan me niet voorstellen dat dat compiled.

[ Voor 24% gewijzigd door Gerco op 03-12-2006 18:20 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • steveman
  • Registratie: Mei 2001
  • Laatst online: 19:48

steveman

Comfortabel ten onder

Topicstarter
Over het compileren, foutje met overtypen geweest (van m'n offline laptop(geen wifi hier) naar deze pc) de cast moet idd (Ob) zijn, goed opgemerkt btw!

Hmm, dus terugkoppelend naar m'n genetische algoritme probleem, ik zou dus een nieuwe vector dus moeten volstoppen met new individual() 's en een functie maken die de waarden uit een individual kan kopieren. De nieuwe vector langslopen en het element op positie i toekennen aan een temp, waarden kopieren naar die temp en de mutatie en crossover erop loslaten...

Thx voor de info, ga er zodra ik weer thuis ben meteen mee aan de slag!

"Take the risk of thinking for yourself. Much more happiness, truth, beauty, and wisdom will come to you that way." -Christopher Hitchens | In memoriam? 🏁 ipv kruis!


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 01-12 20:19

Gerco

Professional Newbie

Ik zou zoiets doen:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class GenericAlgorithm {

  public static void main(String[] args) {
    List current = new ArrayList();
    Individual someone = new Individual(some, parameters);
    Individual someoneelse = new Individual(some, more, parameters);

    current.put(someone);
    current.put(someoneelse);

    List nextGen = new ArrayList(current.size());
    for(int i = 0; i<current.size(); i++) {
      Individual person1 = current.get(i);
      Individual person2 = current.get(/* random getal oid? */);

      nextGen.put(crossover(person1, person2));
    }
  }

  private Individual crossover(Individual person1, Individual person2) {
    Individual result = new Individual();

    // Get properties from person1 and 2, crossover

    return result;
  }
}


Je kan het iets meer waarheidsgetrouw maken door de crossover functie te implementeren in de Individual class. Dan kun je zoiets zeggen:
Java:
1
  nextGen.put(person1.produceOffspring(person2));


Alleen de Individual objects horen tenslotte hun eigen interne huishouding te weten en hoe ze die met andere individuals kunnen combineren. Daarnaast spreekt het gewoon meer tot de verbeelding :)

[ Voor 20% gewijzigd door Gerco op 03-12-2006 19:04 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • martennis
  • Registratie: Juli 2005
  • Laatst online: 27-11 19:57
kun je het object misschien klonen met clone() methode?
of gewoon een 2e object aanmaken?

of heb ik de TS niet begrepen? :$

[ Voor 39% gewijzigd door martennis op 03-12-2006 20:07 ]


  • steveman
  • Registratie: Mei 2001
  • Laatst online: 19:48

steveman

Comfortabel ten onder

Topicstarter
martennis schreef op zondag 03 december 2006 @ 20:06:
kun je het object misschien klonen met clone() methode?
of gewoon een 2e object aanmaken?

of heb ik de TS niet begrepen? :$
object.clone() zou normaal gesproken moeten werken denk ik, echter betreft het hier een object dat ik zelf maak, dus tenzij ik hem zelf implementeer doet ie niets.

Maar!

Het uebervoorbeeld van GA:
Generatie: 1
0.18518518518518517 vgxgbxniisxtcivadeozswiksdd

[...]

Generatie: 37
0.6296296296296297 me tcinkx ntwpikkf aeweisel

[...]
Generatie: 84
0.9629629629629629 me thinks itw like a weasel

Generatie : 85
1.0 me thinks its like a weasel
Gelukt, woei!

Nu de parameters van m'n spamfilteropdracht optimaliseren B)

"Take the risk of thinking for yourself. Much more happiness, truth, beauty, and wisdom will come to you that way." -Christopher Hitchens | In memoriam? 🏁 ipv kruis!

Pagina: 1