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

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

ただいまの
回答率

90.62%

  • PHP

    19772questions

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

  • Python

    7444questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 611

tacchan

score 52

下記のサイトのプログラムを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])には何が入っているのでしょうか?

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/26 16:09

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

    プログラムに精通していないつたない文章ですみません。

    キャンセル

  • 2015/08/26 17: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)なので、
    結果的に地点ごとに他の地点への距離データベースが構築されていくことになります。

    キャンセル

  • 2015/08/26 20: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 15: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) の時点で大小関係が整列されています。

    キャンセル

  • 2015/08/27 18:54

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

    キャンセル

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

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    ある範囲の整数の和を求めるプログラム

    1から10までの整数の和を求める簡単なプログラムを作っています。 たとえばこれをC言語で実装する場合はfor文を使うのが一般的かと思います。 しかしPythonのfor文はC言語

  • 解決済

    グローバル変数は使えますか?

    Python3.4でクローバル変数は使えますか?使えるのであれば使い方を教えてください。 よろしくお願いします。

  • 解決済

    pythonストップウォッチ

    pythonのストップウォッチを作っています。 nameErrorだそうです。 原因がわかりません。 コードが少し長いのでリンクからみてください。 https://www.drop

  • 受付中

    クラスで定義するメソッドについて

    ネットで公開されているコードを拝見すると、クラスで定義する関数(メソッド)の第一引数にはselfを指定していますが、あれはインスタンスを生成してコンストラクタ内で定義したものを使う

  • 解決済

    php preg_match

    phpのpreg_matchについて質問です matches を指定した場合、検索結果が代入されます。 $matches[0] にはパターン全体にマッチしたテキストが代入され、 

  • 解決済

    PHPのマジックメソッドのPython版

    PHPのメソッドに未定義な関数の呼び出しやプロパティの設定・取得が行われた時に、PHPから呼び出してくれる(いわゆるコールバックしてくれるマジックメソッドがあります。 #!/

  • 解決済

    Pythonでオブジェクトのプロパティに変数でアクセス

    phpでは、以下の様に変数にプロパティ名を代入して、オブジェクトのプロパティの値を取得することができます。 <?php class Test { public $te

  • 解決済

    Pythonでのデバッグ方法について

    お世話になります。 Pythonでは、独自に定義した名前の呼び出し方を間違えた際、実行後にエラーが吐かれると思います。 実行開始後数分程度でエラーが出る分には構いませんが、場合

同じタグがついた質問を見る

  • PHP

    19772questions

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

  • Python

    7444questions

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