2013-03-15 60 views
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; 
      @[email protected]; 
      } 
     } 
     } 
    } 
} 
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放入數組中。這樣做第二對將是6和16.我想重複這個過程N次(例如N = 4)。我以爲要在while(<DAT>)之前加上「DATA ABSORTION」中的另一個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 

回答

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 
+0

究竟應該在哪裏放置'say join「,@blackPair;'代碼行在我的代碼?我認爲這是一個好主意 – 2013-03-15 17:32:28

+0

用它來代替你說的foreach(@blackPair){說}' – mob 2013-03-15 17:42:59