- 论坛徽章:
- 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",],#原数据此行scaffold2似有误
- ["scaffold2","128",],
- ["scaffold2","167",],
- ["scaffold2","699",],
- ["scaffold2","888",],
- ["scaffold2","997",],
- );
- my $sumline = @datasource;#行数
- print $sumline."\n";;
- my $endstr =$datasource[$#datasource][0];
- if($endstr =~ /(\d+)/)
- {
- $scasum = $1;#染色体数量
- #print $scasum."\n";
- }
- srand;#要先宣告srand函数,才能产生随机数的效果
- 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 个染色体处理结束========\n"; #
- }
- sub pickline
- {
- my $baseid=shift;
- print ("当前染色体数组:@onesca\n");
- my @part500 = grep $_<$baseid+500, @onesca;
- print ("500区间数组:@part500\n");
-
- my $myneed = int(rand(500)) + $baseid; #$myneed是一个0和500之间的整数
- my @diff= map{abs($_ - $myneed)} @part500;
- my $near = &min(@diff); #差值最小,最靠近随机数
- print "随机数->最小差值: $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 "删除染色体数组中已处理的部分;
- while(@onesca and ($onesca[0] < ($baseid+500)))
- {
- shift @onesca; #删除
- }
-
- }
- exit;
复制代码
|
|