質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1538閲覧

PythonのプログラムをPHPで書き直したい

tacchan

総合スコア60

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2015/08/26 02:36

下記のサイトのプログラムをPHPで書き直そうとしています。

http://www.geocities.jp/m_hiroi/light/pyalgo62.html

この中の一番下のプログラム3巡回セールスマン問題 (クラスカルのアルゴリズムの変形版)のぶぶんについてです。

質問したいのは、class Edgeのなかのdef cmp(x, y)が何の役割を持っているのかということです。

__~~__というメソッドなので、PHPでいうところのコンストラクタの役割を果たしていることはわかるのですが、(厳密にはPythonにはコンストラクタの考えがないということはわかっています)
このメソッドが必要な箇所がよくわかりません。
メソッドの処理内容はxのweightとyのweightの差を求めているということはわかります。

また実際、def make_edge(size)の中のe = Edge(i, j, distance_table[i][j])には何が入っているのでしょうか?

丁寧な説明、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

バージョン2.7のドキュメントで見つけました。
http://docs.python.jp/2.7/reference/datamodel.html#customization
大小比較するときに呼ばれるメソッドのようですね。
class Edgeのインスタンス同士の比較用に、weightプロパティの大小で決定するということで、
これがないとインスタンスのアドレス同士の比較というトンチンカンな振る舞いになってしまうため、
比較基準を正しく与えているということのようです。

投稿2015/08/26 03:31

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tacchan

2015/08/26 07:09

回答ありがとうございます。 初心者で、用語をうまく扱えないためイメージでの文章になってしまいますが、 つまり インスタンスe = Edge(i, j, distance_table[i][j])のプロパティ?(要素?)はそのまま、i、j、distance_table[i][j]の三つなので、 異なるインスタンス同士の比較をしようにもどれを基準に比べていいのかわからない。 そこで、__cmp__を使ってどのように二つのインスタンスをくらべればいいのかを定義してあげることによって、そのあとedges = PQueue()に入れたときに正常に作動するという認識でよろしいでしょうか? プログラムに精通していないつたない文章ですみません。
退会済みユーザー

退会済みユーザー

2015/08/26 08:49

PQueue()に関しては同じ作者の他のページ: http://www.geocities.jp/m_hiroi/light/pyalgo03.html にソースが出ていますね。 edges = PQueue() は単にclass PQueueのインスタンス生成で、データ比較用のヒープを確保しているようです。 e = Edge(i, j, distance_table[i][j]) で、地点iと地点jの間の距離(weight)を与えて、クラスEdgeのインスタンスを生成、 そのeをクラスPQueueインスタンスのedgeに対してedge.push(e)なので、 結果的に地点ごとに他の地点への距離データベースが構築されていくことになります。
tacchan

2015/08/26 11:45

何度も解説ありがとうございます。 >結果的に地点ごとに他の地点への距離データベースが構築されていくことになります。 この部分で少し疑問点が出てしまったのですが、「地点ごとに」とは地点i(つまり1~n)に対して他地点への距離の短い順に並べられるということですか? それとも、i、j関係なく短い順に並べられるということですか? i=1に対して1<=j<=sizeの距離 次にi=2に対して1<=j<=sizeの距離 ~~以下i=sizeまで続く となるのか、もしくは i,jは関係なく距離が短い順となる のかがよくわからなくなってしまいました。 当初は自分の考えは「i,jは関係なく距離が短い順となる」だったので確認しておきたいのでよろしくお願いします。
退会済みユーザー

退会済みユーザー

2015/08/27 06:46

edges = make_edge(point_size) が呼ばれた時点で、 def make_edge(size):にて定義された処理が走ります。 global distance_tableによってグローバル変数distance_tableを参照する宣言がされ、 edges = PQueue()にて、優先度つき待ち行列が初期化されます、詳しくは http://www.geocities.jp/m_hiroi/light/pyalgo03.html の「●プログラムリスト2」をご参照ください。 e = Edge(i, j, distance_table[i][j])にて、def __init__(self, p1, p2, weight):で定義された処理が走ります。 eにはclass Edgeのインスタンスが入り、次の edges.push(e) にて優先度つき待ち行列に組み込まれます。 優先度つき待ち行列に組み込まれる際に、 class PQueue:にて定義される、def push(self, data):にて定義された処理が走ります。 そこで、def _upheap(buff, n):にて定義された処理が走り、 大小比較された上で順序の入れ替えが起こります。 結果、edges.push(e) の時点で大小関係が整列されています。
tacchan

2015/08/27 09:54

回答ありがとうございます。 自分の考えていた処理の順番と同じことが確認できましたので、安心しました。 何度もご教授下さりありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問