過去の桐井戸端BBS (桐ver.8)
15017 どのレコードとどのレコードの組み合わせで合計が120になるかというようなロジックを教えてください 沖縄のあっきぃ〜 2002/02/02-14:03
実は次のデータで、合計が120名になるようにするには、どのレコードとどのレコードの組み合わせでできるか、
というロジックがどうしてもわからなくて困っております。
是非とも教えて頂きたくお願いします。

Aパターン 20名+100名
Bパターン 40名+80名
Cパターン 20名+30名+70名
Dパターン 10名+20名+30名+60名
: : :
: : :


人数
10名
20名
30名
40名
50名
60名
70名
80名
90名
100名

是非教えて下さい。お願いします。
15018 Re:抽出したい 【多遊】 2002/02/02-18:52
記事番号15017へのコメント
沖縄のあっきぃ〜さん
>みなさんこんにちは。とっても久しぶりに投稿しました。

沖縄のあっきぃ〜さん>こんにちは。

>どのレコードとどのレコードの組み合わせでできるか、
>というロジックがどうしてもわからなくて困っております。
「ロジックですね。」きっとあるのでしょうが、わかりませんので、
総当たりのプログラムをご紹介いたします。

なお、「10名・・・100名」くらいの10種類くらいでしたら
総当たりさせても1分かかりません。お試しください。

変数宣言 整数{&i,&有無[10]}
&i=1
繰り返し &有無[1]=0,1
繰り返し &有無[2]=0,1
  ・・・追加してください・・・
繰り返し &有無[9]=0,1
繰り返し &有無[10]=0,1

 ケース開始
  ケース(10*&有無[1]+20*&有無[2]+30*&有無[3]+40*&有無[4]+50*&有無[5]+60*&有無[6]+70*&有無[7]+80*&有無[8]+90*&有無[9]+100*&有無[10]=120)
   &STR=#u
   条件(&有無[1]=1) &STR=&STR+"10名+"
   条件(&有無[2]=1) &STR=&STR+"20名+"
   条件(&有無[3]=1) &STR=&STR+"30名+"
      ・・・追加してください・・・
   条件(&有無[8]=1) &STR=&STR+"80名+"
   条件(&有無[9]=1) &STR=&STR+"90名+"
   条件(&有無[10]=1) &STR=&STR+"100名+"
   &STR=#部分列(&STR,1,#文字数(&STR)-1)+"=120名"
   メッセージボックス #文字列(&i)+"番目の式",&STR
   &i=&i+1
 ケース終了

繰り返し終了
  ・・・
繰り返し終了

(最後の繰り返し終了は10行です。)

繰り返しの連続ですので字下げの方が見やすいのでしょうが掲示板ということで、
最小限に記載します。また、行数の関係で途中は省略しています。
計算式(コマンド)を複写してご利用ください。

15023 選果場問題ですね 佐田 守弘 2002/02/03-03:32
記事番号15017へのコメント
沖縄のあっきぃ〜さん
これと類似なのが選果場で野菜や果物などを一定の目方になるような組み合わせを行う問題ですね。
実際には次の様な問題を解く必要があるのではないでしょうか。
〔想定〕
農協の選果場に農園から多数の野菜(ここではジャガイモと仮定)が運ばれて来る。
入荷したジャガイモは大体250〜350g程度だが、皆重さが違う。
これを3個組み合わせて900gになる様に袋詰めしたい。
必ず3個の組み合わせで、組み合わせた重量は900g以上902g以下にする。
その際に、ジャガイモは10個だけスケールに乗って重量が計られているので、
この10個の中から該当するもの3個を払い出す。払い出された後には次のジャガイモが補充される。

実際にこの様な設備は、コンピュータスケールとして稼働していますが、
組み合わせを行うロジックはおそらく特許を取る程の技術だと思いますから、
特許情報を調べれば何らかの参考情報が得られるかも知れません。

以下はもし私が考えるとしたらのアイデアです。実際にはどうなっているかは知りません。
@あらかじめ250〜350gまでを10段階に分類して、それぞれのスケールのホッパに分けておく。
A計量されている10個の中から最初の2個を乱数などで任意に選ぶ。
B残りの1個は、合計して900〜902gの範囲になるものを選ぶ。
C選べない時には、最初の2個のうち1個を変えて、Bの処理を行う。
以上の様な計算を繰り返すのではないかと思います。

佐田守弘(KS-00119)
15026 Re:抽出したい うにん 2002/02/03-21:33
記事番号15017へのコメント
合計が条件を満たす任意の数の組合せ、だとちょっと無理ですが、
例のように組合わせる要素の数の上限(例では4つ)が決っていれば、結合表でできます。

kumiawase.tblという表を作り、[人数]項目に数値で10〜100まで10レコードと、未定義の行を1行入れます。

結合表を作るには、3回自己結合して(つまり同じ表を4回使います)、
結合条件には

(["kumiawase.tbl".人数]=#u .or ["kumiawase.tbl".人数]<["kumiawase.tbl:<1>".
人数]) .and (["kumiawase.tbl:<1>".人数]=#u .or ["kumiawase.tbl:<1>".人数]<["kumiawase.tbl:<2>".人数]) .and (["kumiawase.tbl:<2>".人数]=#u .or
["kumiawase.tbl:<2>".人数]<["kumiawase.tbl:<3>".人数])

["kumiawase.tbl".人数]+["kumiawase.tbl:<1>".人数]+["kumiawase.tbl:<2>".人数]+["kumiawase.tbl:<3>".人数]=120

と指定します。結果。

10 20 30 60
10 20 40 50
10 20 90
10 30 80
10 40 70
10 50 60
20 30 70
20 40 60
30 40 50
   20 100
   30 90
    40 80
    50 70

15045 Re:抽出したい 沖縄のあっきぃ〜 2002/02/05-10:03
記事番号15018へのコメント
ありがとうございます。
私は一括処理を一度もしたことがないので、この機に勉強しようと思います。
多遊さんの明記してくれたプログラムは私自身がコマンドをわかりませんので、
勉強しながら他のことも学べるのかなと思っております。
またわからないことがあれば教えて下さい。ありがとうございました。
15046 Re:選果場問題ですね 沖縄のあっきぃ〜 2002/02/05-10:22
記事番号15023へのコメント
確かに佐田さんの言う通りですね。佐田さんから頂きましたお返事の
@〜Cはかなり参考になると思います。
このやり方を工夫して桐の関数を利用すればできるかも、と思いました。
またわからないことがあれば是非アドバイスをお願いします。
ありがとうございました。
15063 Re:抽出したい 沖縄のあっきぃ〜 2002/02/06-10:59
記事番号15026へのコメント
>合計が条件を満たす任意の数の組合せ、だとちょっと無理ですが、例のように
>組合わせる要素の数の上限(例では4つ)が決っていれば、結合表でできます。・・・

うにんさん、ありがとうございます。
一括処理でしかできないんだ、と思っていた私には、表の関数を使ってできるんだ、
ということがわかっただけでも、とってもいい収穫ができたと思います。
結合の機能を使ってできる、ということですが、結合を今回初めて勉強しまして、
しょっちゅうエラーばっかりでてしまいます。もう少し勉強してうにんさんの結合条件を実行しようと思います。
またいろいろ教えて下さい。
ありがとうございました。

戻る