hi,
i have been translating an algorithm from ruby to java. unfortunately i
stuck with one line of code and would like to ask for some help.
My problem is the following line:
b.data[b.data.index(token)+1]
and here is the context(which i not relevant in my opinion):
def self.reproduce(a, b)
data_size = @@costs[0].length
available = []
0.upto(data_size-1) { |n| available << n }
token = a.data[0]
spawn = [token]
available.delete(token)
while available.length > 0 do
#Select next
if token != b.data.last &&
available.include?(b.data[b.data.index(token)+1])
next_token = b.data[b.data.index(token)+1]
elsif token != a.data.last &&
available.include?(a.data[a.data.index(token)+1])
next_token = a.data[a.data.index(token)+1]
else
next_token = available[rand(available.length)]
end
#Add to spawn
token = next_token
available.delete(token)
spawn << next_token
a, b = b, a if rand < 0.4
end
return Chromosome.new(spawn)
end
my problem is the following: if the array b.data has 10 elements, then
the "+1" could set it to position 10, so that b.data[10] would give back
an error, like the java.lang.IndexOutOfBoundsException, which I get in
Java, when translating. in ruby the code is working, in java obviously
not. could somebody give me a hint, where my error in reasoning is.
thanks in advance
here is my java code:
public void reproduce(int even, int uneven){
int dataSize = DataConverter.costs.length;
LinkedList<Integer> available = new LinkedList<Integer>();
for(int i=0; i<dataSize; i++){
available.add(i);
}
int token = toBreed.get(even).seed.get(0);
ArrayList<Integer> spawn = new ArrayList<Integer>();// TODO correct
spawn?
int counter = 0;
/*token =*/ available.remove(token);// TODO correct?
int last = toBreed.get(uneven).seed.size()-1;// TODO whats that?
while(available.size()>0){
int nextToken;
int hold = toBreed.get(uneven).seed.indexOf(token)+1;
System.out.println("hold "+hold);
int containU = toBreed.get(uneven).seed.get(hold);
int containE =
toBreed.get(even).seed.get(toBreed.get(even).seed.indexOf(token)+1);
if(token != toBreed.get(uneven).seed.get(last) &&
available.contains(containU)){
nextToken = containU;
}else{
if(token!= toBreed.get(even).seed.get(last) &&
available.contains(containE)){
nextToken = containE;
}else{
nextToken =
available.get((int)Math.round(Math.random()*available.size()));
}
}
System.out.println(counter+": "+token+"; "+ nextToken );
// add to spawn
token = nextToken;
Integer rToken = new Integer(token);
available.remove(rToken);
spawn.add(nextToken);
counter +=1;
if(Math.random()<0.4){
int holder = even;
even = uneven;
uneven = holder;
}
}
Chromosome spawnCh = new Chromosome(spawn);
offspring.add(spawnCh);
}
···
--
Posted via http://www.ruby-forum.com/.