our
(
$VERSION
) = (
'$Revision: 1.8 $ '
=~ /(\d+\.\d+)/ );
our
@ISA
=
qw (Algorithm::Evolutionary::Individual::Base);
=head1
METHODS
=head2 new
Creates a new random array individual,
with
fixed initial
length
, and uniform distribution
of
values
within a range
=cut
sub
new {
my
$class
=
shift
;
my
$self
;
$self
->{_length} =
shift
|| 10;
$self
->{_array} = ();
$self
->{_rangestart} =
shift
|| 0;
$self
->{_rangeend } =
shift
|| 1;
$self
->{_fitness} =
undef
;
bless
$self
,
$class
;
$self
->randomize();
return
$self
;
}
sub
TIEARRAY {
my
$class
=
shift
;
my
$self
= {
_array
=> \
@_
,
_length
=>
scalar
(
@_
),
_fitness
=>
undef
};
bless
$self
,
$class
;
return
$self
;
}
sub
set {
my
$self
=
shift
;
my
$hash
=
shift
|| croak
"No params here"
;
for
(
keys
%{
$hash
} ) {
$self
->{
"_$_"
} =
$hash
->{
$_
};
}
$self
->{_array} = ();
$self
->{_rangestart} =
$self
->{_rangestart} || 0;
$self
->{_rangeend} =
$self
->{_rangeend} || 1;
$self
->{_fitness} =
undef
;
}
sub
randomize {
my
$self
=
shift
;
my
$range
=
$self
->{_rangeend} -
$self
->{_rangestart};
for
(
my
$i
= 0;
$i
<
$self
->{_length};
$i
++ ) {
push
@{
$self
->{_array}},
rand
(
$range
) +
$self
->{_rangestart};
}
}
sub
Atom{
my
$self
=
shift
;
my
$index
=
shift
;
if
(
@_
) {
$self
->{_array}[
$index
] =
shift
;
}
else
{
return
$self
->{_array}[
$index
];
}
}
sub
FETCH {
my
$self
=
shift
;
return
$self
->Atom(
@_
);
}
sub
STORE {
my
$self
=
shift
;
$self
->Atom(
@_
);
}
sub
addAtom{
my
$self
=
shift
;
my
$atom
=
shift
|| croak
"No atom to add\n"
;
push
( @{
$self
->{_array}},
$atom
);
$self
->{_length}++;
}
sub
PUSH {
my
$self
=
shift
;
push
( @{
$self
->{_array}},
@_
);
$self
->{_length}++;
}
sub
UNSHIFT {
my
$self
=
shift
;
unshift
( @{
$self
->{_array}},
@_
);
$self
->{_length}++;
}
sub
POP {
my
$self
=
shift
;
return
pop
( @{
$self
->{_array}} );
$self
->{_length}--;
}
sub
SHIFT {
my
$self
=
shift
;
return
shift
@{
$self
->{_array}} ;
$self
->{_length}--;
}
sub
SPLICE {
my
$self
=
shift
;
splice
( @{
$self
->{_array}},
shift
,
shift
,
@_
);
}
sub
FETCHSIZE {
my
$self
=
shift
;
return
@{
$self
->{_array}} -1;
}
sub
length
{
my
$self
=
shift
;
return
scalar
@{
$self
->{_array}};
}
sub
fromString {
my
$class
=
shift
;
my
$str
=
shift
;
my
$sep
=
shift
||
","
;
my
@ary
=
split
(
$sep
,
$str
);
my
$self
= {
_array
=> \
@ary
,
_fitness
=>
undef
};
bless
$self
,
$class
;
return
$self
;
}
sub
clone {
my
$indi
=
shift
|| croak
"Indi to clone missing "
;
my
$self
= {
_fitness
=>
undef
,
_length
=>
$indi
->{_length} };
$self
->{_array} = ();
push
(@{
$self
->{_array}}, @{
$indi
->{_array}});
bless
$self
,
ref
$indi
;
die
"Something is wrong "
if
scalar
( @{
$self
->{_array}} ) >
scalar
( @{
$indi
->{_array}} );
return
$self
;
}
sub
asString {
my
$self
=
shift
;
my
$str
=
join
(
", "
, @{
$self
->{_array}}) .
" -> "
;
if
(
defined
$self
->{_fitness} ) {
$str
.=
$self
->{_fitness};
}
return
$str
;
}
sub
asXML {
my
$self
=
shift
;
my
$str
=
$self
->SUPER::asXML();
my
$str2
=
">"
.
join
(
""
,
map
(
"<atom>$_</atom> "
, @{
$self
->{_array}} ));
$str
=~ s/\/>/
$str2
/e ;
return
$str
.
"\n</indi>"
;
}
sub
Chrom {
my
$self
=
shift
;
if
(
defined
$_
[0] ) {
$self
->{_array} =
shift
;
}
return
$self
->{_array}
}