クロワッサンを買う順番は誰ですか


9

チームは毎朝誰かがクロワッサンを持っていくべきだと決めました。毎回同じ人物である必要はないので、次の順番を決定するシステムが必要です。この質問の目的は、クロワッサンを明日もたらすのが誰の順番になるかを決定するためのアルゴリズムを決定することです。

制約、仮定、目的:

  • クロワッサンを持参する順番は、前日の午後に決定されます。
  • 特定の日に、何人かの人々は欠席します。アルゴリズムは、その日に出席する人を選ぶ必要があります。すべての欠席が前日に判明しているため、クロワッサンの購入者は前日の午後に決定できます。
  • 全体として、ほとんどの人がほとんどの日に立ち会います。
  • 公平を期すために、誰もがクロワッサンを他の人と同じ回数購入する必要があります。(基本的に、すべてのチームメンバーがクロワッサンに費やす金額が同じであると想定します。)
  • 名簿の退屈を緩和するために、ランダム性、または少なくとも知覚されるランダム性のいくつかの要素があるとよいでしょう。これは厳密な制約ではありません。より審美的な判断です。ただし、同じ人物を2回続けて選ぶことはできません。
  • クロワッサンを持参する人は、事前に知っておく必要があります。したがって、P氏がD日にクロワッサンを持ち込む場合、この事実は、P氏がいる前日に決定する必要があります。たとえば、クロワッサンの持参人が常に前日に決定されている場合は、前日に立ち会う人の1人である必要があります。
  • チームメンバーの数は十分に少ないため、ストレージとコンピューティングリソースは事実上無制限です。たとえば、アルゴリズムは、過去に誰がクロワッサンを連れてきたかの完全な履歴に依存できます。毎日、高速PCで数分までの計算で問題ありません。

これは実際の問題のモデルであるため、シナリオをより適切にモデル化していると思われる場合は、仮定に挑戦または調整することができます。

原産地:クロワッサンを買うために起こっている人を見つけることにより、フロリアンMargaine。ここでの私の再定式化には、少し異なる要件があります。


1
質問は正確には何でしたか?私たちは、人々がほぼ同じ量欠席していると仮定できますか?これを最も少ない回数で行った人、または単にランダムな人を連れて行くことの何が問題になっていますか?
PAL GD

@PålGD人々がほぼ同じ量だけ欠席していると仮定すると、単純化されます。あなたが望むならそれをしてください、しかしあなたのアルゴリズムがパートタイマーのために働くなら、それはより良いです。これを最も少なく行った人を採用することは1つの解決策です(1日前に知っているという要件に注意してください)、それは解決策を完全に簡単なものにしません)。ランダムな人も働くことができますが、ランダム性はあなたが拘束したいかもしれない公平性からの逸脱をもたらします。
Gilles「SO-邪悪なことをやめなさい」2013

何?唾液分泌画像はありませんか?パン屋に滑り込むのではなく、数学をやっている私たちの机で奴隷になってほしいですか?
カレブ2013

@ギレス-参考までに、この質問のバージョンを使用してP.SEで実験を実行します。どちらのサイトも少し古くなっているので、各コミュニティの回答がどのように形成されるかを知りたいと思います。

回答:


7

私が認識しているこの種の問題の解決策には、偏った宝くじフィルター処理/生成されたランダムシーケンスの 2つのカテゴリがあります

最初に、状態を保持しない簡単で間違ったソリューションを省きましょう。状態を維持しない宝くじスタイルのソリューションでは、2項分布での勝利数があり、「何度も」の基準を満たしません。すべての人を等しく選択するランダムシーケンスを選択できます(リストを移動するだけで、順列はランダム性を提供します)。追跡しない限り、平等な労力を維持するのではなく、二項分布に再び気づくでしょう。

また、実際にランダムであることを約束します。これは、たとえば、決定論的アルゴリズムに基づいて休暇をスケジュールできないようにして、クロワッサンを購入する番になったときに(休暇をすべて使い切るまで)存在しないようにすることができます。 。

それでは、2つのタイプのソリューションについて説明します。

  1. 私たちはかなりから選ぶことができるという偏った宝くじ、最初のノート構築するためにすべての私たちの宝くじのための番号を生成する(有限偏差)連続分布を。敗者は、最小の番号を持つ人になることができます。次に、最も簡単なバイアスは、各個人が自分のシェアよりも多く買ったか少なく買ったかを追跡することです。クロワッサンの単位でバイアスを測定できます。分布の幅と形状を変更することにより、ランダム度を調整できます。これにより、個人が「同じ回数」からどれだけ離れることができるかが決まります。ガウシアンは簡単です。彼らは長すぎる(「不公平」)尾を持たずに合理的な驚きを可能にします。したがって、ソリューションの基本的な形は(Scalaコードで)

    case class Employee(var bias: Double) {
      def eat         { bias -= 1 }
      def buy(n: Int) { bias += n }
      def roll        = bias + stdev * Random.nextGaussian
    }
    

    あなたが最後に買った人を追跡し、彼らに多額のバイアスボーナス(例:)を与えて、10*stdev休暇の構造が誰もが「最後の」時間を買ったことを許していたエッジの場合を除いて、人々が連続して2回購入するのを防ぐことができます。(つまり、購入してから休暇に行きます。)彼らが選択された日に存在しないのと同じことです。(誰かが存在しない場合は、一日おきに、彼らは最終的になり、彼らは彼らのバイアスボーナスを通じて燃やすとして出てくる。私は、この機能ではなく、バグを検討してください。)

    そのため、その日の現在の従業員のリストを収集し、すべての人に宝くじに出向いてもらい、最低の人を選び、更新します。購入ボーナスを従業員数と同じにするかどうか(コストは無視できるが、クロワッサンを取得するための旅行は負担が大きい場合)、出席する従業員の数(旅行は簡単だがコストが負担になる場合は良い)を選択できます。 )、またはその間にあるもの(両方の負担を認識するため)。出席している人にのみ「食べる」ペナルティを課した方がいいでしょうが、休暇を取るだけでは適切な提案が得られないと感じた場合は、どちらの方法でも可能です。

  2. フィルターされたランダムシーケンスを作成するには、最初にランダムシーケンスを生成する必要があります。従業員のリストをシャッフルすることは、開始するのと同じくらい良い方法です。毎日、リストを順番にたどってください。誰かがいないために購入できなかったり、以前に知らされたり購入したりできない場合は、スキップしてください。今、あなたは問題を抱えています:あなたはスキップされた人々を集めています。それでも大丈夫です。シーケンスの最後に達したら、シャッフルする前に、スキップした従業員のリストを完全なリストに追加します。これで、出現する確率はスキップされた回数に比例し、「同じ回数」のプロパティが維持されます。

    log2(N)NN!NNlog2[(N!NN)1/N]1log(2)+log22π/NN1.4NN=10 1.14

個人的には、ランダム性の制御が優れているため、バイアスのある宝くじの解決策を好みます。フィルター処理されたシーケンスを使用すると、シーケンスを生成するためのより複雑な方法を考え出すことができます。たとえば、ランダムな順列をとるのではなく、ローカルスワップを特定の距離まで実行するか、プールから完全にスワップアウトすることを許可します(ただし、スキップされたリストに移動します)。ただし、これらの処理には、より多くのアルゴリズムが必要です。宝くじでは、標準偏差を調整するだけです。


4

{P1,...,Pn}vik1Pik10

lvk=i=1n(vik)l

ki1(vik)lvk

P1

P1

v

vikkvk

Pi

Pik+1kPjPj

Pivik

そして、これが永遠に続くとき、彼らは幸せに暮らし、クロワッサンの価格を等しく共有します。

P1lll=kl

P1P2

P1vik

追記:英語が下手で申し訳ありませんが、私はネイティブスピーカーではないため、遅れています...間違いを訂正してください(そして、ストーリーにスパイスを追加する場合があります...)


2

あなたが持っているすべての反復

  • 出席して購入できる人のリスト
  • 以前のバイヤー

リスト内の人の中からランダムに人を選び、以前の購入者を除外した場合、目的は達成されます。

  1. 前の反復からの最小量の情報を使用し、ランダムに選択するため、アルゴリズムは「最大に」ランダムです。
  2. 平均して、人々は抽出に参加するたびに(N /(N-1))クロワッサンの料金を支払い、アルゴリズムを可能な限り公平にします。
  3. これを最大限にランダムにするために、リピートなしのルールを削除することをお勧めします。

私が提案した他のアルゴリズムは、ランダム性や公平性が低くなっています。

  1. 「デッキシャッフル」アルゴリズムは、支払う必要がある確率が一定ではないという意味で、実際にはランダムではありません(最初のピックでは1 / N、2番目のピックでは1 /(N-1)... 1番目のピックでは1- -まだ選択されていない場合)。さらに、最初にピックされた場合、次のN回のピックのチャンスはまったくありません。システムは、ピッキングされるまでまれに、その後絶えず入ってくることによって簡単に壊れます。

  2. 乱数のプロパティに依存するのではなく、すべての人に同じ数のクロワッサンを積極的に取得しようとする「代償」アルゴリズムは、ランダムまたは公平(またはその両方)に失敗します。


NmN/m1

N

@RexKerrなぜ従業員よりも多くのクロワッサンを買うのですか?
Sklivvz 2013

よくわかりません。私はどこにそうすることを提案しましたか?
レックスカー2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.