Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 查找节点之间的最近距离_Perl - Fatal编程技术网

Perl 查找节点之间的最近距离

Perl 查找节点之间的最近距离,perl,Perl,我想找到节点之间最近的距离 以下是我的示例数据: 节点,x,y 1, 3, 5 2, 6, 9 3, 13, 15 4, 16, 20 5, 30, 50 1, 3, 5 2, 6, 9 3, 13, 15 4, 16, 20 5, 30, 50 例如,从节点1到节点2的最近距离为5。我想找到距离所有节点最近的距离,即节点2,3,4,5 如何在Perl中实现这一点 以下是我到目前为止的情况: use strict; use warnings; use Data::Du

我想找到节点之间最近的距离

以下是我的示例数据:

节点,x,y

1, 3, 5 2, 6, 9 3, 13, 15 4, 16, 20 5, 30, 50 1, 3, 5 2, 6, 9 3, 13, 15 4, 16, 20 5, 30, 50 例如,从节点1到节点2的最近距离为5。我想找到距离所有节点最近的距离,即节点2,3,4,5

如何在Perl中实现这一点

以下是我到目前为止的情况:

use strict;
use warnings;
use Data::Dumper;

open(IN , "<" , "sample.txt" ) or die "Can't open this file.";

my @two_dimentional_array;
while (my $line=<IN>)
{
    my @arr_line=split (" *, *" , $line);
        my @one_dimentional_array;
        push @one_dimentional_array , @arr_line;
        push @two_dimentional_array, [@arr_line];
}

for(my $i=0 ; $i<=$#two_dimentional_array ; $i++)
{
    my ($n_1 , $X_1 , $y_1)=@{$two_dimentional_array[$i]};
    for (my $j=0 ; $j<=$#two_dimentional_array ; $j++)
    {
        my ($n_2 , $X_2 , $y_2)=@{$two_dimentional_array[$j]};

        chomp($y_1);
        chomp($y_2);
        if($n_1 != $n_2)
        {
            my $distance=sqrt(($X_2-$X_1)**2 + ($y_2-$y_1)**2);
            print "Distance ".$distance." from node ".$n_1." to node ".$n_2."\n";
        }
    }
}
#print Dumper(\@two_dimentional_array);
使用严格;
使用警告;
使用数据::转储程序;

打开(在“中),此代码将找到第一对相距最小的线

use strict;
use warnings;

# @data contains (node number, x, y) from the file
#
my @data;

open my $fh, '<', 'sample.data' or die $!;

while (<$fh>) {
  my @node = /\d+/g;
  push @data, \@node if @node;
}

# @min contains (first node number, second node number, distance)
# for the most recently-found minimum distance
#
my @min;

for my $node1 (0 .. $#data-1) {
  for my $node2 ($node1+1 .. $#data-1) {
    my $dist;
    $dist += ( $data[$node2][$_] - $data[$node1][$_] ) ** 2 for 1, 2;
    $dist = sqrt $dist;
    @min = ( $data[$node1][0], $data[$node2][0], $dist ) unless @min and $min[2] <= $dist;
  }
}

printf "%d to %d = %f\n", @min;

先生,我想使用散列,那么我如何实现它呢?@Faisahashmi:你为什么要使用散列?
5                  => [2, 6, 9], [1, 3, 5]
5.8309518948453    => [4, 16, 20], [3, 13, 15]
9.21954445729289   => [3, 13, 15], [2, 6, 9]
14.142135623731    => [3, 13, 15], [1, 3, 5]
14.8660687473185   => [4, 16, 20], [2, 6, 9]
19.8494332412792   => [4, 16, 20], [1, 3, 5]
33.1058907144937   => [5, 30, 50], [4, 16, 20]
38.9101529166874   => [5, 30, 50], [3, 13, 15]
47.5078940808788   => [5, 30, 50], [2, 6, 9]
52.4785670536077   => [5, 30, 50], [1, 3, 5]
use strict;
use warnings;

# @data contains (node number, x, y) from the file
#
my @data;

open my $fh, '<', 'sample.data' or die $!;

while (<$fh>) {
  my @node = /\d+/g;
  push @data, \@node if @node;
}

# @min contains (first node number, second node number, distance)
# for the most recently-found minimum distance
#
my @min;

for my $node1 (0 .. $#data-1) {
  for my $node2 ($node1+1 .. $#data-1) {
    my $dist;
    $dist += ( $data[$node2][$_] - $data[$node1][$_] ) ** 2 for 1, 2;
    $dist = sqrt $dist;
    @min = ( $data[$node1][0], $data[$node2][0], $dist ) unless @min and $min[2] <= $dist;
  }
}

printf "%d to %d = %f\n", @min;
1 to 2 = 5.000000