- 論壇徽章:
- 0
|
本帖最后由 hztj2005 于 2018-12-28 09:39 編輯
- <div class="blockcode"><blockquote>
復制代碼
- use List::Util qw/min/;
- use utf8;
- my @datasource=(
- ["scaffold1","127",],
- ["scaffold1","167",],
- ["scaffold1","260",],
- ["scaffold1","462",],
- ["scaffold1","636",],
- ["scaffold1","862",],
- ["scaffold1","999",],#原數(shù)據(jù)此行scaffold2似有誤
- ["scaffold2","128",],
- ["scaffold2","167",],
- ["scaffold2","699",],
- ["scaffold2","888",],
- ["scaffold2","997",],
- );
- my $sumline = @datasource;#行數(shù)
- print $sumline."\n";;
- my $endstr =$datasource[$#datasource][0];
- if($endstr =~ /(\d+)/)
- {
- $scasum = $1;#染色體數(shù)量
- #print $scasum."\n";
- }
- srand;#要先宣告srand函數(shù),才能產(chǎn)生隨機數(shù)的效果
- my @onesca = ();
- my $scastart =0;
- my $scaend =0;
- for(my $k=1;$k<$scasum+1;$k++)
- {
- my $maxvalue = -1;#該染色體最大位點
- for(my $j=$scastart;$j<$sumline;$j++)
- {
- my $endstr2 =$datasource[$j][0];
- #print "-- $endstr2\n"; #
- if($endstr2 =~ /(\d+)/)
- {
- $scaid = $1;#染色體序號
- if($scaid == $k)
- {
- push @onesca,$datasource[$j][1];
- $maxvalue =$datasource[$j][1];
- $scaend = $j+1;#記錄處理下個染色體的開始行
- }else
- {
- last;
- }
- }
- }
-
- print "\n當前染色體最大位點:$maxvalue ||當前染色體開始行:$scastart 下個染色體的開始行:$scaend\n"; #
- if(@onesca)
- {
- for(my $baseid = 0; $baseid<$maxvalue+1; $baseid=$baseid+500)
- {
- pickline($baseid);
- }
- }
- $scastart = $scaend;
- print "\n =======第 $k 個染色體處理結(jié)束========\n"; #
- }
- sub pickline
- {
- my $baseid=shift;
- print ("當前染色體數(shù)組:@onesca\n");
- my @part500 = grep $_<$baseid+500, @onesca;
- print ("500區(qū)間數(shù)組:@part500\n");
-
- my $myneed = int(rand(500)) + $baseid; #$myneed是一個0和500之間的整數(shù)
- my @diff= map{abs($_ - $myneed)} @part500;
- my $near = &min(@diff); #差值最小,最靠近隨機數(shù)
- print "隨機數(shù)->最小差值: $myneed -> $near\n";
-
- for(my $m=$scastart;$m<$scaend;$m++)
- {
- my $posvalue = $datasource[$m][1];
- if(abs($posvalue-$myneed) == $near)
- {
- print "需要的行:".$datasource[$m][0].",$posvalue\n\n";
- }
- }
-
- #print "刪除染色體數(shù)組中已處理的部分;
- while(@onesca and ($onesca[0] < ($baseid+500)))
- {
- shift @onesca; #刪除
- }
-
- }
- exit;
復制代碼
|
|