• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:出現割合が目標に近づくような列の生成方法)

出現割合が目標に近づくような列の生成方法

このQ&Aのポイント
  • 1日に1種類の製品しか作れない工場で、製品A、B、Cをそれぞれa:b:cの割合で生産したいとします。
  • 目標の割合に近づけるために、どういう順で作る製品を選ぶか決める手続きは何かないでしょうか。
  • 乱数を発生させて割り振る方法では、一定の率で部分的な偏りが生じる可能性があります。ある時点までに選んだ製品の履歴を見る必要なく、数値の取り扱いによって次に生産すべき製品を決める方法が望ましいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.5

ANo.4へのコメントについてです。 > その期間を2日から考えるのかどうか,また2日と10日と100日を同じ重みにするかどうかについてもはっきりしていません。  誤解なさっています。「2日」だの「100日」だの「重み」だの、一切関係ありません。  毎日、「生産開始以降その日まで」が「その期間」です。 > ここで数種の製品について簡単な比で表される目標割合として電卓をたたいて「次はどれ」と簡単に決められるような計算でしょうか?  ANo.4の説明が分かりにくかったようで、どうもすみません。 dの計算方法が決まっていれば簡単です。  生産開始の前日に、帳面にΔ[1] = 0, Δ[2] = 0, …, Δ[N] = 0と記録します。  生産開始の第1日目から毎朝、「本日何を生産しようかな」ということを決める計算を行います。そのやり方は以下の通り。 =================  前日に帳面に記録しておいたΔ[1]~Δ[N]の値を使って、 (1)もし種類1の製品を作るなら、Δ[1]は(1 - B[1]) だけ減る。のこりの(N-1)種類については、Δ[2]は B[2] だけ増える、Δ[3]は B[3] だけ増える、…、Δ[N]は B[N] だけ増える。するとdは幾らになるかな? (2)もし種類2の製品を作るなら、Δ[2]は(1 - B[2]) だけ減る。のこりの(N-1)種類については、Δ[1]は B[1] だけ増える、Δ[3]は B[3] だけ増える、…、Δ[N]は B[N] だけ増える。するとdは幾らになるかな? (3)もし種類3の製品を作るなら、Δ[3]は… : (N)もし種類Nの製品を作るなら、Δ[N]は(1 - B[N]) だけ減る。のこりの(N-1)種類については、Δ[1]は B[1] だけ増える、Δ[2]は B[2] だけ増える、…、Δ[N-1]は B[N-1] だけ増える。するとdは幾らになるかな? と、N通りのdを計算してみて、dが最も小さくなった種類kの製品を作ることにするんです。そして、「(k)もし種類kの製品を作るなら、」で計算したΔの値を帳面に記録しておきます。 =================

mide
質問者

お礼

ご親切に詳しくありがとうございました。 今度は手順がよく理解できたので,実際に列を生成してみて目標に近くなることが分かりました。 Δ[j]はとても便利なものですね。

その他の回答 (4)

  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.4

ANo.3の二番煎じになりますけど。  N種類 J={1,2,‥, N}の製品について、種類jの製品を1日で生産する個数はA[j]である。「種類jの製品を生産した日数」H[j]は非負の整数である。種類jの製品を生産した個数はA[j]H[j]であり、全製品の生産個数は Σ{i∈J} A[i]H[i] である。  A[j]H[j] / Σ{i∈J}A[i]H[i] が B[j] になるべく近くなるようにしたい。 という問題でしょう。  ご質問でもご指摘の通り「なるべく近く」を測るための尺度d(H)がはっきりしない訳で、尺度はたとえば、   Δ[j] = (B[j]Σ{i∈J}A[i]H[i]) - A[j]H[j] とするとき   d(H) = Σ{j∈J} |Δ[j]| とか   d(H) = Σ{j∈J} w[j] (Δ[j])^2 (w[j]はjごとに決めてある係数) とか、   d(H) = max{ |Δ[j]|/Σ{i∈J}A[i]H[i])|j∈J} とか、いろいろ考えられます。ま、それは価値観に合うように選んでいただくしかありません。  それはさておき、ひとつのやり方として: ========== まだ何も生産していない時点では、   Δ[j] = 0 (j∈J) である。ある日に種類kの製品を作ったとすると、   Δ[j]は A[k](1 - B[j]) だけ減る。   Δ[j]は B[j]A[k] だけ増える。 そこで、その日に作る種類kは、尺度d(H)が最小になるように選ぶ。 =========  このやり方だと、「ある時点までに選んだ製品の履歴」は不要で、これまでに種類jの生産にあてた日数の合計H[j](j∈J)だけを記録しておけばいい。  さて直感的には、フツーの意味で尺度dが「なるべく近く」を表していれば、「尺度dにおいて、このやりかたが最適である」ということを証明できそうです。ここで言う「最適」とは、「生産日数の合計 T=Σ{j∈J}H[j} を決めたとき、d(H)が最小になるようなH[j](j∈J)」が、上記のやりかたで得られるH[j]と、すべてのTについて一致する、という意味です。  逆に「上記のやりかたが最適であるためには、尺度dはどんな性質を満たせば良いか」と問えば、これは手強そうな数学の問題です。  なお、どのjについてもA[j]=1なら、このご質問は「N次元空間中に定めたある曲線(この場合は直線)を、N次元格子点の列で近似する」という、CGではおなじみの問題と同じです。

mide
質問者

お礼

ご回答ありがとうございます。 簡単のため,どのjについてもA[j]=1です。 B[j]は目標の割合ですね。 「近い」の尺度は,なんらかの計算方法を選ぶべきだとは思うのですが,特にこれと決まっているわけではありません。 生産日数の合計T,つまり割合が目標に近いかどうかを評価する期間をどう取っても,目標の割合から大きくはずれないようにしたいのですが…。その期間を2日から考えるのかどうか,また2日と10日と100日を同じ重みにするかどうかについてもはっきりしていません。すみません。 >「N次元空間中に定めたある曲線(この場合は直線)を、N次元格子点の列で近似する」という、CGではおなじみの問題と同じです。 CGについては知らないのですが,ここで数種の製品について簡単な比で表される目標割合として電卓をたたいて「次はどれ」と簡単に決められるような計算でしょうか?

回答No.3

>1日に1種類の製品しか作れないある工場で 1日に作る生産数にたいする条件は?製品ごとに作れる数が決まっておりフル生産する? 生産数は調整できるが、一定期間での必要数は与えられる?等々どうなのかしら? >できればある時点までに選んだ製品の履歴を見る必要なく,何らかの数値の取り扱いで次に生産すべき製品を決められるとありがたいです。 製品はどれも1日あたり一定量(α)生産するとします。ある時点で各製品の生産実績量をZA,ZB,ZCとします。ZA+ZB+ZC=Zとすると、生産割合(a,b,c)=(ZA/Z,ZB/Z,ZC/Z)です。さて、その次にAを生産するとすると、ZA’=ZA+α,ZB'=ZB,ZC=ZCとなり、生産割合(a',b',c')=(ZA'/(Z+α),ZB'/(Z+α),ZC'/(Z+α))に変わります。AではなくBやCを生産することにすれば別の数値になります。なので、それらの3通りのうち目標割合に最も近いのを作るようにすればどうでしょう?近さの判定は例えば、(a目標値-a')^2+(b目標値-b')^2+(c目標値-c')^2 → 最小 ただ、現在の割合実績(a,b,c)より(a',b',c')が目標値より遠ざかる可能性もあります。何かを一定量作らなければならないとしたら、避けられない事態です。

mide
質問者

お礼

ご回答ありがとうございます。 >1日に作る生産数にたいする条件は? 簡単のため1日にどの製品も1個という生産量です。 >一定期間での必要数は与えられる? それに関する条件はありません。 >それらの3通りのうち目標割合に最も近いのを作るようにすればどうでしょう? ごもっともです。ただ,Zのようなそれまでの全生産数のみでなく,より短い(最近の)期間についても生産割合が目標になるべく近くなるというようにできないかなと思うのです。とはいえ一時的に目標値から遠ざかるのはもちろん避けられないと思います。

  • naniwacchi
  • ベストアンサー率47% (942/1970)
回答No.2

こんにちわ。 >乱数を発生させてa:b:cの割合で割り振ることも考えましたが, >それだと一定の率で部分的に偏りが生じると思います。 乱数は、大きな母集団をとったときに平均的になる。ということですから、 短いものも含めてとなるとどうしても無理が出てくると思います。 ちなみに、人間が作った乱数だと同じ数が連続することはほぼない(意識が働いてしまう)が、 乱数表のような乱数は同じ数が連続することもままある。ということがあります。 ですので、一定の率で偏ることは十分ありえます。 結局、a:b:cで日にちも分割することになるのかと・・・ たとえば、a:b:c= 1:2:3であれば、cacbcbのように並びで工夫するといったところでしょうか。

mide
質問者

お礼

ご回答ありがとうございます。 はい,その並びの工夫のしかたが問題というか,あれこれ工夫しなくても機械的な数値の扱いで(できれば簡単に)並びを生成できないかと思うのですが…。

  • ramayana
  • ベストアンサー率75% (215/285)
回答No.1

こんなのはどうでしょう。a+b+c=1とします。 (1)整数a[10]、b[10]、c[10]で、a[10]+b[10]+c[10]=10 となるもののうち、a[10]/10、b[10]/10、c[10]/10 がa、b、c をもっともよく近似するものを選ぶ。日を10日ごとに区切って、各グループの最初の a[10] 日は A を生産、次の b[10] 日は B を生産、残りの c[10] 日は C を生産するように暫定計画を作る。これを「暫定計画10」と呼ぶことにする。 (2)整数a[100]、b[100]、c[100]で、a[100]+b[100]+c[100]=100 となるもののうち、a[100]/100、b[100]/100、c[100]/100 がa、b、c をもっともよく近似するものを選ぶ。日を100日ごとに区切って、各グループのa[100] 日は A を生産、b[100] 日は B を生産、残りの c[100] 日は C を生産するように暫定計画を作る。これを「暫定計画100」と呼ぶことにする。 ただし、100日ごとのグループのうち最初の90日は暫定計画10と同じものを生産するものとし、最後の10日間だけで100日間の製品別生産量を調整する。 (3)整数a[1000]、b[1000]、c[1000]で、a[1000]+b[1000]+c[1000]=1000 となるもののうち、a[1000]/1000、b[1000]/1000、c[1000]/1000 がa、b、c をもっともよく近似するものを選ぶ。日を1000日ごとに区切って、各グループの a[1000] 日は A を生産、 b[1000] 日は B を生産、残りの c[1000] 日は C を生産するように暫定計画を作る。これを「暫定計画1000」と呼ぶことにする。 ただし、1000日ごとのグループのうち最初の900日は暫定計画100と同じものを生産するものとし、最後の100日間だけで1000日間の製品別生産量を調整する。 (4)同様にして、暫定計画10000、暫定計画100000、暫定計画1000000、・・・と作成していく。こうすると、いつまでも暫定計画ばかりで本物の計画が確定しないようにもみえるが、そうではない。暫定計画10 で最初の90 日の生産物が確定。暫定計画100 で最初の900 日の生産物が確定。等々となるので、実際に何日目に何を生産するかは、この手順で確定する。 (5)以上は、暫定計画の期間を10 倍ずつ増やしていく方法だったが、2倍ずつでも7倍ずつでも、自由に選べる。また、この「何倍」というのも固定する必要はない。最初10倍、次に3倍、・・・というのもあり得る。 (6)最も効率が良い方法を選ぶとすれば、できるだけ小さい分母で a、b、c を近似すればよさそう。そのためには、「連分数」のテクニックを応用すればよさそう(このテクニックについては省略します)。

mide
質問者

お礼

ご回答ありがとうございます。 なるべく目標に近い短いスパンを繰り返していって,一段上の単位になるときに補正するというやり方ですね。欲をいえば各期間の補正部分のスパンの生産割合が他のスパンとだいぶ変わるかなと思うのですが…。 連分数は難しくてうまく扱えないのですが,そのテクニックが駆使できたらいいでしょうね。

関連するQ&A