#!/usr/bin/perl -w $ZONES = 10 ; $N = 100 ; for $i (1..$N){ $t[$i]= 1+$i%$ZONES; $x[$i]= -100 + rand(200); $y[$i]= -100 + rand(200); } for $i (1..$N){ for $j (1..$i){ $d[$i][$j] = sqrt( ($x[$i]-$x[$j])**2 + ($y[$i]-$y[$j])**2 ); $d[$j][$i]=$d[$i][$j]; } } $min = 9e99; for (;;) { $lasti = 1 + int (rand($N)); $t[0]=$t[$lasti]; $t[$lasti] = 1+ int (rand($ZONES)); $iter++; @sum= (); $func = 0; for $i (1..$ZONES){ for $j (1..$N){ next if ($t[$j]!=$i); for $k (1..$j-1){ if ($t[$k]==$i){ $sum[$i] += $d[$j][$k]; } } } if (defined $sum[$i]){ $func += $sum[$i]; } } if ($func < $min){ print "$iter: $func\n"; for $i (1..$ZONES){ if (defined $sum[$i]){ print "$i $sum[$i] ->"; }else{ print "$i ->"; } for $j (1..$N){ if ($t[$j]==$i) { print " $j"; } } print "\n"; } $min = $func; }else{ $t[$lasti]=$t[0]; } } __END__