SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

PEARライブラリ活用

PHPにおけるグラフ描画とアルゴリズム

PEARライブラリ活用 (3)


  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード サンプル (3.0 KB)

計算機科学や数学において「グラフ」と言えば、点と点を結ぶ線の集合を指します。本稿では、PEARライブラリの「Image_GraphViz」と「Structures_Graph」を利用して、グラフを生成、描画する方法を紹介します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

本稿で扱うグラフ

 「グラフ」という語を広辞苑(第5版)で引くと、載っている意味は次の3つです。

  1. 互いに連関する二つまたは二つ以上の量の間の関係を表す図形。例えば関数fに対し、xがfの定義域を動くときの点(x, f(x))の軌跡をfのグラフという。またx、yに関する方程式をみたす点(x, y)の軌跡をその方程式のグラフという。
  2. 全体に対する割合を示したり、数量の大小を比較したりするための図表。円グラフ・棒グラフなど。
  3. 写真を主にした雑誌。画報。

 しかし、本稿で扱うグラフは、この3つのいずれでもありません。国語辞典には載っていないことが多いようですが、計算機科学や数学において「グラフ」と言えば、図のような、点(pointあるいはvertex、node)と点を結ぶ線(lineあるいはarc、edge)の集合を指します。

グラフの例1
グラフの例1

 グラフはプログラミングにおいてよく用いられる基本的なデータ構造の一つです。「データ構造」についてまったく知らないという人はあまりいないでしょう。最も基本的なものはおそらく配列です。他に、ベクタやリスト、セット、ハッシュテーブル、木などといったデータ構造が、広く使われているプログラミング言語には用意されています。

 グラフは、ここで挙げたものほど基本的とは言えないかもしれません。そのため、広く使われているプログラミング言語でも、グラフを標準ではサポートしていないものが多いです。グラフが用意されていない場合は自分で実装しなければなりません。データ自体は、隣接行列(この行列のij成分は、i番目のノードとj番目のノードがつながっているなら1、つながっていないなら0)あるいは隣接リスト(このリストのi番目の要素は、i番目のノードがつながっているノードの番号のリスト)で簡単に表せます。グラフのためのアルゴリズムを実装するのは少し面倒でしょう。

 幸いなことに、PHPにはグラフが用意されています。PEAR Structures_Graphです。本稿では、Structures_Graphの使い方を確認し、グラフを用いたアルゴリズムを動かしてみます。

グラフの適用例

 グラフはどのような場面で利用するのでしょうか。

 地図をグラフで表現するというのは、直観的に分かりやすい例でしょう。地図上の各地点をノードに、2地点間の距離をエッジにします。このグラフ上で最短経路を求めるアルゴリズムを実行すれば、実際の地図上での最短経路が分かります。最短経路を求めるアルゴリズムには、よく知られたものがあります。参考文献を参照してください。

 地図のような直接的な例以外にも、グラフはさまざまな場面で利用されます。例えば、最近よく聞く「ソーシャルグラフ」の「グラフ」は、本稿で扱っているグラフからきています。解きたい問題をグラフで表現することができれば、グラフ上で使えるさまざまなアルゴリズムを適用できるようになるのです。グラフのアルゴリズムを利用して解くパズルはたくさんあります。

 全体がつながっていて閉路(ループ)のない特殊なグラフが木で、これもざまざまな場面で利用されています(例えばXML文書は木で表現できます)。木はグラフの一種なのですが、PEARではInformation:Treeという、グラフとは関係のないパッケージで実装されているので、両方を統一的に扱うのは少し面倒です。

対象読者

  • PHPの基本的な使い方を知っている方
  • PHPでグラフを処理する方法に興味がある方

必要な環境

 PEAR Image_GraphVizとPEAR Structures_GraphGraphvizが動作する環境が必要です。筆者はWindows XPにXAMPP 1.6.6aとGraphviz 2.18、PEAR Image_GraphViz 1.3.0 RC3をインストールし、IE 7とFirefox 2、Opera 9、Safari 3で動作を確認しました(Graphvizのインストールについては本文中で解説します)。

 なお、PEAR Structures_Graph 1.0.2はXAMPP 1.6.6aに含まれています。XAMPP 1.6.6aにはPEAR Image_GraphViz 1.2.1が含まれていましたが、バグがあるようなので次のようにして1.3.0 RC3にアップグレードしました。

c:
cd \xampp\php
pear upgrade -f Image_GraphViz-beta

 コマンドの実行前に、c:\xampp\php\pear.iniの「"\xampp」を「"C:\xampp」に修正しました(参考:PEAR error on Config.php Line 1003 in Vista (solution))。

Graphvizのインストール

 Graphvizはグラフをさまざまな形式で描画することができるソフトウェアです。ソースコードと共にhttp://www.graphviz.org/で配布されており、無料で利用することができます。

 PEAR Image_GraphVizは内部でGraphvizを呼び出してグラフを描画します。ですから、PEAR Image_GraphVizを使うためには、まずGraphvizが動作するように環境を整えておく必要があります。以下に手順を示します(Windowsの場合)。

  1. Graphvizのダウンロードページから、インストーラをダウンロードする。
  2. ダウンロードしたインストーラを実行し、インストールする(オプション等はすべてデフォルトのまま)。
  3. システム環境変数PATHに、Graphvizの実行ファイルのディレクトリ(C:\Program Files\Graphviz\bin)を追加する。
  4. コンピュータを再起動する。

次のページ
PEAR Image_GraphVizでグラフを描画する

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
PEARライブラリ活用連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 矢吹 太朗(ヤブキ タロウ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2418 2008/05/16 16:13

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング