- 締切済み
方法論
多次元配列 Array [n]["グループ"] = array("key", "値") グループは 二種類 "A"と"B" keyは固有整数 値は 0から100のdobule型 "A"と"B"の数は同等もしくは同等ではない なので配列の数もn個となる このように定義された配列の中からある条件の組み合わせを作りたいと思っています。 条件とは ・グループ "A"より"B"の値が1以上大きく、かつそのなかでもっとも距離が近い組み合わせ。 ・ペアになった組み合わせ以外のもので次のペアを組み合わせる ・ペアになったものは Pair[n] = array("Aのkey", "Bのkey")の配列へ代入する ・ペアになりきれずに残ったものは Protrude[n] = keyの配列へ代入する 優先順位 精度 > 速度 > 負荷 これを実現するためのロジックをみなさまはどのような方法で組まれますでしょうか? アイデアをご教授いただけますようお願いいたします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- kmee
- ベストアンサー率55% (1857/3366)
そういう意味でしたか。 「これを実現するためのロジック」ということなので、全体の流れと思いました。 私なら、まずは $keysA=array(Aのkey全て) $keysB=array(Bのkey全て) を2重ループにします。 もっと便利だったり効率がいい方法はあるかもしれません。 ですが、それを考えたり調べたりする時間で、2重ループのプログラムを完成させることができます。 単純なコードになるので、間違えることも少ないでしょう。
- kmee
- ベストアンサー率55% (1857/3366)
その説明でも、「距離」についてよくわかりません。 距離1:= abs(Aのkey - Bのkey) なのですか? 距離2:= abs(Aの値 - Bの値) なのですか? 1に近い、というなら 距離3:= abs(「距離1または距離2」-1) なのでしょうか? > ・グループ "A"より"B"の値が1以上大きく、かつそのなかでもっとも距離が近い組み合わせ。 とから、前半が「距離」と推測すると 距離4:= (Bの値 - Aの値 >=1.0 ) ? (Bの値 - Aの値) : ∞ ; ということなのでしょうか。 また、「ペアになった組み合わせ以外のもので次のペアを組み合わせる」とはどんなことなのでしょうか? Aのkey,Bのkey = (0,2),(4,2) があったとして、(0,2)が採用されたら、 ・(4,2)は B=2が採用されているので、候補とはならない ・(4,2)は 「(0,2)」では無いので、次の候補となりえる のどちらなのでしょうか? とりあえず、効率無視の総当たり、上記の条件がどれでも使えるような抽象的なものです。 (1) 候補リスト[i] = array( Aのkey, Bのkey,評価のための情報(「距離」等... ) というような、AのkeyとBのkeyとの組み合わせについての「候補リスト」を作る (2) 条件を満す最適な候補を採用する。→ Pairに追加 採用できなかったら(5)へ (3) (2)で採用した組合せ以外が残るように、候補リストを変更する (4) (2)へ戻る (5) 候補が残っていたら、Protrudeに追加 (2)の方法が問題になってくるでしょう。 同率の場合の扱いによって、全体の結果が変わります。 また、最短距離のペアを採用しない方が全体のペア数が多くなる、ということもあるでしょう。
- agunuz
- ベストアンサー率65% (288/438)
>もっとも距離が近い組み合わせ。 「距離」って何ですか?
補足
A-Bの値がもっとも1に近い組み合わせという意味になります。
補足
回答かりがとうございます。 まず、距離についてですが >・グループ "A"より"B"の値が1以上大きく、かつそのなかでもっとも距離が近い組み合わせ 質問にて以上のように書いていますので、Bの値 - Aの値 >= 1 となります(私の勘違いで、質問および補足にてA-Bと書いたのですが、質問の文言を正とするためここで改めます。) またもっとも近いとはdouble型であるため1.1であったり1.01であったりします。(この限りではない) そうした場合1.01となる組み合わせを見つけ出すことを目的としています。 >Aのkey,Bのkey = (0,2),(4,2) これについては(0,2)を採用した場合、次のペアは0と2以外のものにて総当たりとなります。 私の日本語が下手なのかなかなか伝わらないものですね。 私はフローが知りたいのではなくて いかにして一つの多次元配列にある値を総当たりさせるロジックを組むかということを聞いています。つまり、人によってはfor文だったりforeachだったりforやforeachの入れ子だったり一度別の配列へ入れなおすとか目的を達成するためにいろいろな書き方があるとおもいます。そのような他人さまの書き方を参考にしたり採用させてもらったりしたいのです。 例えるならば(あくまでも物の例えです) ボルトをBとナットをAとしボルトの軸の径とナットの穴の径がそれぞれの値で距離とはボルトとナットの間にまくシールパッキンと考えてみてください。 シールパッキンの厚みが1とするのでボルトの軸径+1が必要です。 ボルトの軸径とナットの穴径には大きいものや小さいもの同じものさまざまあります。 それぞれのボルトとナットには個体番号があります。 理想はボルトの軸径とシールパッキンの厚みを足したときナットの穴径とが一致すればいいのですが、そうはなかなかいきません。 ですので、ボルトの軸径より小さい穴へのナットはどうしても入れることができませんので、大きいものを探していくこととなります。 その場合、軸径+1より大きい穴径があった場合シールパッキンを重ねればその差は埋まるものと考え組み合わせが可能と考えます。 (2重にしたら2だろうという突っ込みは無しです) 一本のボルトに一つのナットなのでペアができればそのボルトやナットはほかのボルトやナットとペアになることはできません。 この際気をつけないといけないのが、ボルトの軸径やナットの穴径が整列されていないことであり、 ボルトの軸径を基準にしてナットを見つけていく場合と、ナットの穴径を基準にしていく場合とでは組み合わせが異なる場合があるということ。 このことから完全に総当たりをして最適なものを見つけないといけないということです。 同率の場合とありましたが、ナットの穴径が同一のものが複数ある場合があります。この場合どのナットを使ってもの構わないということ。 ボルトの軸径が同一の場合も複数ある場合がありますが、これもどのボルトを使ってペアになっても構わないということ。 そうして作っていったペアにより残ったボルトとナットが出てくるようになります。 この残るものが何なのかをしりたいのです。 残ったものに対してペアを作るため最も適した軸径や穴径を用意したらいいのかを見つける作業をするために上記のロジックが必要となります。 そのため全体のペアの数においては、ボルトの軸径+1 <= ナットの穴径 であるならば最終的にペアとなるため、 1に近い値のペアをつくることが結果的にペアの総数が多くなると思っています。 10:5の比率であれば、どちらか小さい数>=ペア数となるはずです。