0

2列のファイルからデータをロードし、アルゴリズム計算を行ってから、この係数を持つ要素のペアをファイルに書き込み、それらを。という配列に配置するプログラムを作成しました@blackPair。ファイルからデータを取得するアルゴリズムをN回繰り返したいのですが、@blackPair配列にあるデータは繰り返しません。

私はこのようなことを考えました:

#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';

my $iter;
my $startNode;
my $endNode;
my %k;
my %end;
my %node;
my %edge;
my @blackPair=();
my $counts=0;
my $inputfile = "file3";
################# DATA ABSORTION

open(DAT,$inputfile) || die("Could not open file!");
while(<DAT>)
{
    my ($entry) = $_;
    chomp($entry);
    my ($startNode, $endNode) = split(/ /,$entry);
    $k{$endNode}++;
    $k{$startNode}++;
    $edge{$startNode}{$endNode}=1;
    $edge{$endNode}{$startNode}=1;
}
################# ALGORITHM
my $minCentrality=2;
foreach my $i (keys %edge) {
    foreach my $j (keys %{$edge{$i}}){
    my @couple =($j,$i);
    if($i<$j){
         if (($k{$i}-1) !=0 && ($k{$j}-1) !=0){
        my $triangleCount=0;
        @couple=($i,$j) if ($k{$i}<$k{$j});
        foreach (keys %{$edge{$couple[0]}}){
            $triangleCount++ if exists $edge{$couple[1]}{$_};
        }
        my $centrality=($triangleCount+1)/($k{$couple[0]}-1);
        if ($centrality<$minCentrality){
            $minCentrality=$centrality;
            @blackPair=@couple;
          } 
        }
      }
    }
}
foreach (@blackPair){
say; 
}
Close(DAT);

ファイルは次のとおりです。

1 2
1 3
1 4  
1 5
1 6
1 9
2 3
4 5
5 9
6 7
6 8
6 16
7 8
9 10
9 11
10 11
10 12
10 14
11 12
11 13
12 13
12 14
14 15
16 17
16 18
17 18
17 19
18 19
18 20
19 20

に表示される最初のペア@blackPairは6と1です。それらを見つけた後、プログラムが検索を再開しますが、ペア1と6を配列にチャージしないようにします。2番目のペアは6と16になります。このプロセスをN回繰り返したい(たとえば、N = 4)。while(<DAT>)「DATAABSORTION」の前にもう1つ、のwhile(counts<=4){中に入れようと思いましwhile(<DAT>)if(<DATA> != @blackPair){。私が思ったことはあります

 while(counts <= 4) { 

 while(<DAT>)
 {
 if(<DAT> != @blackPair){
       my ($entry) = $_;
       chomp($entry);
       .....
 }
     #### ALGORITHM
 counts++;
 }

しかし、それは機能しません。何か助けはありますか?

4回の反復の後@blackPair、次のペアが存在するはずです。

 6 1
 16 6
 9 1
 9 5
4

1 に答える 1

1

<DAT> != @blackPair間違いなくあなたが望むものではありません。

  • !=数値比較用です。ne文字列の比較(演算子)を実行するか、スマートマッチ演算子を使用してリストのメンバーシップを確認します( ~~ \@blackPair
  • ただし、適切な演算子を使用しても、実際には役に立ちません。これ@blackPairは、入力データがすでにマングルされているためです(の元の入力行に対応する@blackPair要素が含まれている可能性があります)(6,1)"1 6\n"

代わりに、各反復でグラフを更新するのはどうですか?

for my $count (1..4) {
    my $minCentrality = 2;
    ...

    say join " ", @blackPair;
    # now update the graph
    delete $edge{$blackPair[0]}{$blackPair[1]};
    delete $edge{$blackPair[1]}{$blackPair[0]};
    $k{$blackPair[0]}--;
    $k{$blackPair[1]}--;
} # next iteration
于 2013-03-15T17:24:58.557 に答える