use strict; use Data::Dumper; my @inputlist; my @outputlist; my @list; sub AddInput { my $name = $_[0]; # push @list, { name => $name, inputs => "-" }; push @list, { name => $name }; push @outputlist, $name; } sub AddOutput { my $name = $_[0]; # push @list, { name => $name, outputs => "-" }; push @list, { name => $name }; push @inputlist, $name; } sub AddNeuron { my $name = $_[0]; push @list, { name => $name }; push @inputlist, $name; push @outputlist, $name; } sub AddConnection { my ($from, $to) = @_; for my $l ( @list ) { if ( $l->{"name"} eq $from ) { push @{$l->{"outputs"}}, $to; } if ( $l->{"name"} eq $to ) { push @{$l->{"inputs"}}, $from; } } } sub AddRandomConnection { my @arr; my $i = scalar(@inputlist); print "we have $i elements to choose from\n"; my $rand_i = int(rand($i)); my $from = $inputlist[$rand_i]; print "we picked $rand_i : $from\n"; my $o = scalar(@outputlist); print "we have $i elements to choose from\n"; my $rand_o = int(rand($o)); my $to = $outputlist[$rand_o]; print "we picked $rand_o : $to\n"; #TODO: need to make sure you can't come to and from same node for my $l ( @list ) { if ( $l->{"name"} eq $from ) { push @{$l->{"outputs"}}, $to; } if ( $l->{"name"} eq $to ) { push @{$l->{"inputs"}}, $from; } } } AddInput("I1"); AddInput("I2"); #AddInput("I3"); AddOutput("O1"); AddOutput("O2"); #AddNeuron("N1"); #AddNeuron("N2"); print Data::Dumper->Dump([@list]); print "Add a direct connection\n"; AddConnection("I1", "O2"); print Data::Dumper->Dump([@list]); print "Add a random connection\n"; AddRandomConnection(); print Data::Dumper->Dump([@list]);