スモールワールド -- it seems like a small world!

戻る
スモールワールド -- it seems like a small world!
適当にいくつかの少数のリンクを与えることにより、隔たり次数が相当減少するのである。

$java MyModel

///////////////////////////////////////////////
// 隣接するノードを一覧表示します
///////////////////////////////////////////////
0
	[19] [1] 
1
	[0] [2] 
2
	[1] [3] 
3
	[2] [4] 
4
	[3] [5] 
5
	[4] [6] 
6
	[5] [7] 
7
	[6] [8] 
8
	[7] [9] 
9
	[8] [10] 
10
	[9] [11] 
11
	[10] [12] 
12
	[11] [13] 
13
	[12] [14] 
14
	[13] [15] 
15
	[14] [16] 
16
	[15] [17] 
17
	[16] [18] 
18
	[17] [19] 
19
	[0] [18] 

■クラスタ化指数= 2.000
■隔たり次数    = 5.263

///////////////////////////////////////////////
// 隣接するノードを一覧表示します
///////////////////////////////////////////////
0
	[19] [1] [6] [13] 
1
	[0] [2] 
2
	[1] [3] 
3
	[2] [4] 
4
	[3] [5] 
5
	[4] [6] 
6
	[5] [7] [0] 
7
	[6] [8] 
8
	[7] [9] 
9
	[8] [10] 
10
	[9] [11] [19] 
11
	[10] [12] 
12
	[11] [13] 
13
	[12] [14] [0] 
14
	[13] [15] 
15
	[14] [16] 
16
	[15] [17] 
17
	[16] [18] 
18
	[17] [19] 
19
	[0] [18] [10] 

■クラスタ化指数= 2.300
■隔たり次数    = 3.363



///////////////////////////////////////////////////////////////////////////////////////
0 から自身に戻るまでのPATH一覧 
///////////////////////////////////////////////////////////////////////////////////////

[0] 
[0] [19] 
[0] [19] [18] 
[0] [19] [18] [17] 
[0] [19] [18] [17] [16] 
[0] [19] [18] [17] [16] [15] 
[0] [19] [18] [17] [16] [15] [14] 
[0] [19] [18] [17] [16] [15] [14] [13] 
[0] [19] [18] [17] [16] [15] [14] [13] [12] 
[0] [19] [18] [17] [16] [15] [14] [13] [12] [11] 
[0] [19] [18] [17] [16] [15] [14] [13] [12] [11] [10] 
[0] [19] [18] [17] [16] [15] [14] [13] [12] [11] [10] [9] 
[0] [19] [18] [17] [16] [15] [14] [13] [12] [11] [10] [9] [8] 
[0] [19] [18] [17] [16] [15] [14] [13] [12] [11] [10] [9] [8] [7] 
[0] [19] [18] [17] [16] [15] [14] [13] [12] [11] [10] [9] [8] [7] [6] 
[0] [19] [18] [17] [16] [15] [14] [13] [12] [11] [10] [9] [8] [7] [6] [5] 
[0] [19] [18] [17] [16] [15] [14] [13] [12] [11] [10] [9] [8] [7] [6] [5] [4] 
[0] [19] [18] [17] [16] [15] [14] [13] [12] [11] [10] [9] [8] [7] [6] [5] [4] [3] 
[0] [19] [18] [17] [16] [15] [14] [13] [12] [11] [10] [9] [8] [7] [6] [5] [4] [3] [2] 
[0] [19] [18] [17] [16] [15] [14] [13] [12] [11] [10] [9] [8] [7] [6] [5] [4] [3] [2] [1] 
[0] [19] [10] 
[0] [19] [10] [9] 
[0] [19] [10] [9] [8] 
[0] [19] [10] [9] [8] [7] 
[0] [19] [10] [9] [8] [7] [6] 
[0] [19] [10] [9] [8] [7] [6] [5] 
[0] [19] [10] [9] [8] [7] [6] [5] [4] 
[0] [19] [10] [9] [8] [7] [6] [5] [4] [3] 
[0] [19] [10] [9] [8] [7] [6] [5] [4] [3] [2] 
[0] [19] [10] [9] [8] [7] [6] [5] [4] [3] [2] [1] 
[0] [19] [10] [11] 
[0] [19] [10] [11] [12] 
[0] [19] [10] [11] [12] [13] 
[0] [19] [10] [11] [12] [13] [14] 
[0] [19] [10] [11] [12] [13] [14] [15] 
[0] [19] [10] [11] [12] [13] [14] [15] [16] 
[0] [19] [10] [11] [12] [13] [14] [15] [16] [17] 
[0] [19] [10] [11] [12] [13] [14] [15] [16] [17] [18] 
[0] [1] 
[0] [1] [2] 
[0] [1] [2] [3] 
[0] [1] [2] [3] [4] 
[0] [1] [2] [3] [4] [5] 
[0] [1] [2] [3] [4] [5] [6] 
[0] [1] [2] [3] [4] [5] [6] [7] 
[0] [1] [2] [3] [4] [5] [6] [7] [8] 
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] 
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] 
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] 
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] 
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] 
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] 
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] 
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] 
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] 
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] 
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] 
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [19] 
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [19] [18] 
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [19] [18] [17] 
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [19] [18] [17] [16] 
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [19] [18] [17] [16] [15] 
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [19] [18] [17] [16] [15] [14] 
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [19] [18] [17] [16] [15] [14] [13] 
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [19] [18] [17] [16] [15] [14] [13] [12] 
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [19] [18] [17] [16] [15] [14] [13] [12] [11] 
[0] [6] 
[0] [6] [5] 
[0] [6] [5] [4] 
[0] [6] [5] [4] [3] 
[0] [6] [5] [4] [3] [2] 
[0] [6] [5] [4] [3] [2] [1] 
[0] [6] [7] 
[0] [6] [7] [8] 
[0] [6] [7] [8] [9] 
[0] [6] [7] [8] [9] [10] 
[0] [6] [7] [8] [9] [10] [11] 
[0] [6] [7] [8] [9] [10] [11] [12] 
[0] [6] [7] [8] [9] [10] [11] [12] [13] 
[0] [6] [7] [8] [9] [10] [11] [12] [13] [14] 
[0] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] 
[0] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] 
[0] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] 
[0] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] 
[0] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] 
[0] [6] [7] [8] [9] [10] [19] 
[0] [6] [7] [8] [9] [10] [19] [18] 
[0] [6] [7] [8] [9] [10] [19] [18] [17] 
[0] [6] [7] [8] [9] [10] [19] [18] [17] [16] 
[0] [6] [7] [8] [9] [10] [19] [18] [17] [16] [15] 
[0] [6] [7] [8] [9] [10] [19] [18] [17] [16] [15] [14] 
[0] [6] [7] [8] [9] [10] [19] [18] [17] [16] [15] [14] [13] 
[0] [6] [7] [8] [9] [10] [19] [18] [17] [16] [15] [14] [13] [12] 
[0] [6] [7] [8] [9] [10] [19] [18] [17] [16] [15] [14] [13] [12] [11] 
[0] [13] 
[0] [13] [12] 
[0] [13] [12] [11] 
[0] [13] [12] [11] [10] 
[0] [13] [12] [11] [10] [9] 
[0] [13] [12] [11] [10] [9] [8] 
[0] [13] [12] [11] [10] [9] [8] [7] 
[0] [13] [12] [11] [10] [9] [8] [7] [6] 
[0] [13] [12] [11] [10] [9] [8] [7] [6] [5] 
[0] [13] [12] [11] [10] [9] [8] [7] [6] [5] [4] 
[0] [13] [12] [11] [10] [9] [8] [7] [6] [5] [4] [3] 
[0] [13] [12] [11] [10] [9] [8] [7] [6] [5] [4] [3] [2] 
[0] [13] [12] [11] [10] [9] [8] [7] [6] [5] [4] [3] [2] [1] 
[0] [13] [12] [11] [10] [19] 
[0] [13] [12] [11] [10] [19] [18] 
[0] [13] [12] [11] [10] [19] [18] [17] 
[0] [13] [12] [11] [10] [19] [18] [17] [16] 
[0] [13] [12] [11] [10] [19] [18] [17] [16] [15] 
[0] [13] [12] [11] [10] [19] [18] [17] [16] [15] [14] 
[0] [13] [14] 
[0] [13] [14] [15] 
[0] [13] [14] [15] [16] 
[0] [13] [14] [15] [16] [17] 
[0] [13] [14] [15] [16] [17] [18] 
[0] [13] [14] [15] [16] [17] [18] [19] 
[0] [13] [14] [15] [16] [17] [18] [19] [10] 
[0] [13] [14] [15] [16] [17] [18] [19] [10] [9] 
[0] [13] [14] [15] [16] [17] [18] [19] [10] [9] [8] 
[0] [13] [14] [15] [16] [17] [18] [19] [10] [9] [8] [7] 
[0] [13] [14] [15] [16] [17] [18] [19] [10] [9] [8] [7] [6] 
[0] [13] [14] [15] [16] [17] [18] [19] [10] [9] [8] [7] [6] [5] 
[0] [13] [14] [15] [16] [17] [18] [19] [10] [9] [8] [7] [6] [5] [4] 
[0] [13] [14] [15] [16] [17] [18] [19] [10] [9] [8] [7] [6] [5] [4] [3] 
[0] [13] [14] [15] [16] [17] [18] [19] [10] [9] [8] [7] [6] [5] [4] [3] [2] 
[0] [13] [14] [15] [16] [17] [18] [19] [10] [9] [8] [7] [6] [5] [4] [3] [2] [1] 
[0] [13] [14] [15] [16] [17] [18] [19] [10] [11] 
[0] [13] [14] [15] [16] [17] [18] [19] [10] [11] [12] 
----------------------------------------------------------
[0] [19] [18] [17] [16] [15] [14] [13] [12] [11] [10] [9] [8] [7] [6] [5] [4] [3] [2] [1] 
[0] [19] [10] [9] [8] [7] [6] [5] [4] [3] [2] [1] 
[0] [1] 
[0] [6] [5] [4] [3] [2] [1] 
[0] [13] [12] [11] [10] [9] [8] [7] [6] [5] [4] [3] [2] [1] 
[0] [13] [14] [15] [16] [17] [18] [19] [10] [9] [8] [7] [6] [5] [4] [3] [2] [1] 
最短経路のホップ数: 1
----------------------------------------------------------
[4] [3] [2] [1] [0] [19] [18] [17] [16] [15] [14] [13] [12] [11] [10] [9] [8] 
[4] [3] [2] [1] [0] [19] [10] [9] [8] 
[4] [3] [2] [1] [0] [6] [7] [8] 
[4] [3] [2] [1] [0] [13] [12] [11] [10] [9] [8] 
[4] [3] [2] [1] [0] [13] [14] [15] [16] [17] [18] [19] [10] [9] [8] 
[4] [5] [6] [7] [8] 
[4] [5] [6] [0] [19] [18] [17] [16] [15] [14] [13] [12] [11] [10] [9] [8] 
[4] [5] [6] [0] [19] [10] [9] [8] 
[4] [5] [6] [0] [13] [12] [11] [10] [9] [8] 
[4] [5] [6] [0] [13] [14] [15] [16] [17] [18] [19] [10] [9] [8] 
最短経路のホップ数: 4
///////////////////////////////////////////////
// 隣接するノードを一覧表示します
///////////////////////////////////////////////
0
	
1
	
2
	
3
	
4
	
5
	
6
	
7
	
8
	
9
	
10
	
11
	
12
	
13
	
14
	
15
	
16
	
17
	
18
	
19
	

///////////////////////////////////////////////
// 隣接するノードを一覧表示します
///////////////////////////////////////////////
0
	[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] 
1
	[0] 
2
	[0] 
3
	[0] 
4
	[0] 
5
	[0] 
6
	[0] 
7
	[0] 
8
	[0] 
9
	[0] 
10
	[0] 
11
	[0] 
12
	[0] 
13
	[0] 
14
	[0] 
15
	[0] 
16
	[0] 
17
	[0] 
18
	[0] 
19
	[0] 

■クラスタ化指数= 1.900
■隔たり次数    = 1.900


::::::::::::::
Element.java
::::::::::::::
import java.util.*;

/**
$Id: graphtest.html,v 1.1 2009/06/22 16:12:11 kishi Exp kishi $
@author KISHI Yasuhiro
*/

public class Element {
    private List links;
    private String name;

    public Element( String name ) {
        this.name = name;
    }

    /** リンクを追加する */
    public void addLink( Element element ) {
        if ( links == null ) {
            links = new LinkedList();
        }

        links.add( element );
    }

    /** 相手とリンクしているか否か */
    public boolean hasRelationWith( Element counterElement ) {
        return ( links != null ) && links.contains( counterElement );
    }

    public List getLinks() {
        return links;
    }

    public String getName() {
        return name;
    }

    /** 自身がもつリンクをクリアする */
    public void deleteLinks() {
        links.clear();
    }
}
::::::::::::::
MyModel.java
::::::::::::::
import java.util.*;

/**
* $Id: graphtest.html,v 1.1 2009/06/22 16:12:11 kishi Exp kishi $
* @author KISHI Yasuhiro
* 2005.05.06 このモデルを使うクライアントからはElementを意識になくてもいいように変更
* 少ないリンク(クラスタ化指数に比例)で隔たり次数を小さくする方法を考えてみる
*/

public class MyModel {
    /** Elementのインスタンスをリスト化したもの */
    private List list;

    /**
    @param 要素数
    */
    public MyModel( int count ) {
        list = new LinkedList();
        for ( int i = 0;i < count;i++ ) {
            list.add( new Element( String.valueOf( i ) ) );
        }
    }

    /** 指定した要素が持つリンクを全てクリアする */
    public void deleteLinks( int index ) {
        Element element = ( Element ) list.get( index );
        element.deleteLinks();
    }

    /** クラスター化指数を求める */
    public double getClusteredDegree() {
        double degree = 0.0;

        // 全要素を走査
        int linkCount = 0;
        Iterator iterator = list.iterator();
        while ( iterator.hasNext() ) {

            Element element = ( Element ) iterator.next();
            List links = element.getLinks();
            linkCount += links.size();

        }
        degree = ( double ) linkCount / list.size();

        return degree;
    }

    /** 要素同士をつなぐ
    * @param index1 要素の位置
    * @param index2 要素の位置
    */
    public void linkElements( int index1, int index2 ) {
        Element e1 = ( Element ) list.get( index1 );
        Element e2 = ( Element ) list.get( index2 );

        if ( !e1.hasRelationWith( e2 ) ) {
            e1.addLink( e2 );
        }
        if ( !e2.hasRelationWith( e1 ) ) {
            e2.addLink( e1 );
        }
    }

    /** ダンプする */
    public void dumpList() {
        System.out.println( "///////////////////////////////////////////////" );
        System.out.println( "// 隣接するノードを一覧表示します" );
        System.out.println( "///////////////////////////////////////////////" );

        Iterator iterator = list.iterator();
        while ( iterator.hasNext() ) {

            Element element = ( Element ) iterator.next();
            System.out.println( element.getName() );

            // リンクしている要素を出力
            System.out.print( "\t" );
            List links = element.getLinks();
            if ( links != null ) {
                Iterator itrt = links.iterator();
                while ( itrt.hasNext() ) {
                    Element linkedElement = ( Element ) itrt.next();
                    System.out.print( "[" + linkedElement.getName() + "] " );
                }
                System.out.println();
            } else {
                System.out.println( "*** has no link ***" );
            }
        }
        System.out.println();

    }

    public List getList() {
        return list;
    }

    /**
    * 隔たり次数を求める
    * -- 全要素に対して最短経路のホップ数を求めて、平均値を出せば、「隔たり次数」を求めることが可能
    * @return 隔たり次数
    */
    public double getDistantDegree() {
        PathTraverser traverser = new PathTraverser( list );
        int combinationCount = 0;
        int distance = 0;
        for ( int i = 0;i < list.size();i++ ) {

            for ( int j = i + 1;j < list.size();j++ ) {

                List combination = traverser.getAllPathsBetween( i, j );
                int minimumHopCount = PathCombinationDumper.getMinimunHopCount( combination );

                // System.out.println( i + "," + j);
                // System.out.println("minimumHopCount="+minimumHopCount);

                distance += minimumHopCount;
                combinationCount++;
            }
        }

        return ( double ) distance / combinationCount;
    }

    /** テスト用のメソッド */
    static public void main( String[] args ) {

        //-----------------------------------------------------------------
        // 【初期状態】では単なる環状リンクになるように設定する
        //-----------------------------------------------------------------
        MyModel model = new MyModel( 20 );
        List list = model.getList();

        // 先頭末尾をリンクさせる
        model.linkElements( 0, list.size() - 1 );

        // 並び合う要素にリンクを設定する(先頭末尾以外)
        for ( int i = 0;i < list.size() - 1;i++ ) {
            model.linkElements( i, i + 1 );
        }

        model.dumpList();
        // クラスター化指数を求める
        System.out.printf( "■クラスタ化指数=%6.3f\n", model.getClusteredDegree() );
        // 隔たり次数を求める
        System.out.printf( "■隔たり次数    =%6.3f\n", model.getDistantDegree() );
        System.out.println();

        //--------------------------------------
        // 適当にリンクを設定する
        int index1 = ( int ) ( list.size() / 3 );
        int index2 = ( int ) ( list.size() * 2 / 3 );
        int index3 = ( int ) ( list.size() / 2 );

        model.linkElements( 0, index1 );
        model.linkElements( 0, index2 );
        model.linkElements( list.size() - 1, index3 );

        model.dumpList();
        // クラスター化指数を求める
        System.out.printf( "■クラスタ化指数=%6.3f\n", model.getClusteredDegree() );
        // 隔たり次数を求める
        System.out.printf( "■隔たり次数    =%6.3f\n", model.getDistantDegree() );
        System.out.println();

        //-------------------------------------------------------------
        // 隔たり次数を求めるコンポーネントの動作確認用のコード
        //-------------------------------------------------------------
        PathTraverser traverser = new PathTraverser( list );
        traverser.getAllPathsFrom( 0 );

        List combination;
        System.out.println( "----------------------------------------------------------" );
        /* 0番目の要素から1番目の要素までへのパスを求める */
        combination = traverser.getAllPathsBetween( 0, 1 );
        PathCombinationDumper.dump( combination );
        System.out.println( "最短経路のホップ数: " + PathCombinationDumper.getMinimunHopCount( combination ) );

        System.out.println( "----------------------------------------------------------" );
        /* 4番目の要素から8番目の要素までへのパスを求める */
        combination = traverser.getAllPathsBetween( 4, 8 );
        PathCombinationDumper.dump( combination );
        System.out.println( "最短経路のホップ数: " + PathCombinationDumper.getMinimunHopCount( combination ) );

        //----------------------------------------------------------------
        // 理想的なリンク構造を試す
        // 全要素を直接あるいは間接に繋ぐには最低N-1個のコネクションが必要
        //----------------------------------------------------------------
        // 一旦全てのリンクをクリア
        for ( int i = 0;i < list.size();i++ ) {
            model.deleteLinks( i );
        }
        model.dumpList();

        // 要素0に対して残りの要素を全てリンクされる(→0がハブとなる)
        for ( int i = 1;i < list.size();i++ ) {
            model.linkElements( 0, i );
        }
        model.dumpList();

        // クラスター化指数を求める
        System.out.printf( "■クラスタ化指数=%6.3f\n", model.getClusteredDegree() );
        // 隔たり次数を求める
        System.out.printf( "■隔たり次数    =%6.3f\n", model.getDistantDegree() );
        System.out.println();
    }

}
::::::::::::::
PathCombinationDumper.java
::::::::::::::
import java.util.*;

/**
$Id: graphtest.html,v 1.1 2009/06/22 16:12:11 kishi Exp kishi $
@author KISHI Yasuhiro
*/
public class PathCombinationDumper {

    static public void dump( List pathCombination ) {

        Iterator iterator = pathCombination.iterator();
        while ( iterator.hasNext() ) {
            Stack path = ( Stack ) iterator.next();
            Enumeration enumeration = path.elements();
            while ( enumeration.hasMoreElements() ) {
                Element e = ( Element ) enumeration.nextElement();
                System.out.print( "[" + e.getName() + "] " );
            }
            System.out.println();
        }
    }

    /** 最短経路を求める(あとで実装) */
    static public void getShortestPath ( List pathCombination ) {

        Iterator iterator = pathCombination.iterator();
        while ( iterator.hasNext() ) {
            Stack path = ( Stack ) iterator.next();
        }
    }

    /** 最小ホップ数を求める */
    static public int getMinimunHopCount ( List pathCombination ) {

        int min = Integer.MAX_VALUE;
        Iterator iterator = pathCombination.iterator();
        while ( iterator.hasNext() ) {
            Stack stack = ( Stack ) iterator.next();
            // System.out.println("size=" + stack.size());
            if ( stack.size() < min ) {
                min = stack.size();
            }
        }

        // 自身は含まないのでマイナス1する
        return min -1;
    }
}
::::::::::::::
PathTraverser.java
::::::::::::::
import java.util.*;

/**
$Id: graphtest.html,v 1.1 2009/06/22 16:12:11 kishi Exp kishi $
@author KISHI Yasuhiro
*/

public class PathTraverser {
    private List list;

    public PathTraverser( List list ) {
        this.list = list;
    }

    public void getAllPathsFrom( int from ) {
        Element fromElement = ( Element ) list.get( from );

        //=================================================
        // ある特定の要素から存在する経路を全走査
        //=================================================
        System.out.println();
        System.out.println();
        System.out.println( "///////////////////////////////////////////////////////////////////////////////////////" );
        System.out.println( fromElement.getName() + " から自身に戻るまでのPATH一覧 " );
        System.out.println( "///////////////////////////////////////////////////////////////////////////////////////" );
        System.out.println();

        Stack stack = new Stack();
        traverseAll( fromElement, stack, 0 );
    }

    /** 再帰メソッド */
    private void traverseAll( Element element, Stack stack, int depth ) {

        /* --- DEBUG用
               if ( depth > 5 ) {
                   return ;
               }
        */

        // スタック内に既に同一要素が存在する場合は先には進まない
        if ( !stack.contains( element ) ) {
            stack.push( element );
            printAll( stack );
        } else {
            return ;
        }

        List links = element.getLinks();
        Iterator iterator = links.iterator();
        while ( iterator.hasNext() ) {
            Element linkedElement = ( Element ) iterator.next();

            // indent( depth );
            // System.out.println( linkedElement.getName() );

            traverseAll( linkedElement, stack, depth + 1 );
        }

        stack.pop();

    }

    public List getAllPathsBetween( int from, int to ) {
        Element fromElement = ( Element ) list.get( from );
        Element toElement = ( Element ) list.get( to );

        //=================================================
        // from,toによりPATHを求める
        //=================================================
        List pathCombination = new LinkedList();

        // stack.setSize( 0 );	// スタックを空にする
        Stack stack = new Stack();
        retrievePaths( fromElement, toElement, stack, pathCombination );

        return pathCombination;
    }

    private void retrievePaths( Element element, Element toElement, Stack stack , List pathCombination ) {

        // スタック内に既に同一要素が存在する場合は先には進まない
        if ( !stack.contains( element ) ) {
            stack.push( element );
        } else {
            return ;
        }

        if ( element.equals( toElement ) ) {
            // 目的の要素に達した場合に実体コピーをリンクに追加
            pathCombination.add( ( Stack ) stack.clone() );
        }

        List links = element.getLinks();
        Iterator iterator = links.iterator();
        while ( iterator.hasNext() ) {
            Element linkedElement = ( Element ) iterator.next();

            // indent( depth );
            // System.out.println( linkedElement.getName() );

            retrievePaths( linkedElement, toElement, stack, pathCombination );
        }

        stack.pop();

    }

    private void indent( int depth ) {
        for ( int i = 0;i < depth;i++ ) {
            System.out.print( " " );
        }
    }

    private void printAll( Stack stack ) {

        Enumeration enumeration = stack.elements();
        while ( enumeration.hasMoreElements() ) {
            Element e = ( Element ) enumeration.nextElement();
            System.out.print( "[" + e.getName() + "] " );
        }
        System.out.println();

    }
}
::::::::::::::
StackTest.java
::::::::::::::
import java.util.*;

/**
$Id: graphtest.html,v 1.1 2009/06/22 16:12:11 kishi Exp kishi $
@author KISHI Yasuhiro
*/

public class StackTest {

    static public void main( String[] args ) {
        Stack stack = new Stack();

        Element e1 = new Element( "John" );
        Element e2 = new Element( "Paul" );
        Element e3 = new Element( "George" );
        Element e4 = new Element( "Ringo" );

        push( stack, e1 );
        push( stack, e2 );
        push( stack, e3 );
        push( stack, e4 );

        // PEEKしてみる -- pop()のように要素を取り出さずに、参照のみ行う
        Element top = ( Element ) stack.peek();
        System.out.println( "一番最後に追加された要素は、" + top.getName() + " です。" );

        // 要素が既にある場合に同じものを追加した場合の動作確認
        push( stack, e3 );

        for ( int i = 0;i < 5;i++ ) {
            pop( stack );
        }
    }

    static public void push( Stack stack, Element e ) {
        if ( !stack.contains( e ) ) {
            stack.push( e );
            printAll( stack );
        } else {
            System.out.println( "既に、" + e.getName() + " はセットされています!" );
        }
    }

    static public void pop( Stack stack ) {
        if ( stack.size() > 0 ) {
            stack.pop();
            printAll( stack );
        } else {
            System.out.println( "取り出せる要素はもう残っていません!" );
        }
    }

    static public void printAll( Stack stack ) {
        Enumeration enumeration = stack.elements();
        while ( enumeration.hasMoreElements() ) {
            Element e = ( Element ) enumeration.nextElement();
            System.out.print( "[" + e.getName() + "] " );
        }
        System.out.println();
    }
}

/*
$ javap java.util.Stack
Compiled from "Stack.java"
public class java.util.Stack extends java.util.Vector{
    public java.util.Stack();
    public java.lang.Object push(java.lang.Object);
    public synchronized java.lang.Object pop();
    public synchronized java.lang.Object peek();
    public boolean empty();
    public synchronized int search(java.lang.Object);
}
 
$ javap java.util.Enumeration
Compiled from "Enumeration.java"
public interface java.util.Enumeration{
    public abstract boolean hasMoreElements();
    public abstract java.lang.Object nextElement();
}
 
$ javap java.util.Vector
Compiled from "Vector.java"
public class java.util.Vector extends java.util.AbstractList implements java.util.List,java.util.RandomAccess,java.lang.Cloneable,java.io.Serial
izable{
    protected java.lang.Object[] elementData;
    protected int elementCount;
    protected int capacityIncrement;
    public java.util.Vector(int, int);
    public java.util.Vector(int);
    public java.util.Vector();
    public java.util.Vector(java.util.Collection);
    public synchronized void copyInto(java.lang.Object[]);
    public synchronized void trimToSize();
    public synchronized void ensureCapacity(int);
    public synchronized void setSize(int);
    public synchronized int capacity();
    public synchronized int size();
    public synchronized boolean isEmpty();
    public java.util.Enumeration elements();
    public boolean contains(java.lang.Object);
    public int indexOf(java.lang.Object);
    public synchronized int indexOf(java.lang.Object, int);
    public synchronized int lastIndexOf(java.lang.Object);
    public synchronized int lastIndexOf(java.lang.Object, int);
    public synchronized java.lang.Object elementAt(int);
    public synchronized java.lang.Object firstElement();
    public synchronized java.lang.Object lastElement();
    public synchronized void setElementAt(java.lang.Object, int);
    public synchronized void removeElementAt(int);
    public synchronized void insertElementAt(java.lang.Object, int);
    public synchronized void addElement(java.lang.Object);
    public synchronized boolean removeElement(java.lang.Object);
    public synchronized void removeAllElements();
    public synchronized java.lang.Object clone();
    public synchronized java.lang.Object[] toArray();
    public synchronized java.lang.Object[] toArray(java.lang.Object[]);
    public synchronized java.lang.Object get(int);
    public synchronized java.lang.Object set(int, java.lang.Object);
    public synchronized boolean add(java.lang.Object);
    public boolean remove(java.lang.Object);
    public void add(int, java.lang.Object);
    public synchronized java.lang.Object remove(int);
    public void clear();
    public synchronized boolean containsAll(java.util.Collection);
    public synchronized boolean addAll(java.util.Collection);
    public synchronized boolean removeAll(java.util.Collection);
    public synchronized boolean retainAll(java.util.Collection);
    public synchronized boolean addAll(int, java.util.Collection);
    public synchronized boolean equals(java.lang.Object);
    public synchronized int hashCode();
    public synchronized java.lang.String toString();
    public synchronized java.util.List subList(int, int);
    protected synchronized void removeRange(int, int);
}
*/





戻る inserted by FC2 system