商品の販売数の計算方法について
更新日: 2026/3/25

概要

本サービスの各コンテストでは、各会社の実際の販売数を決定するために、統計的手法と在庫制約を組み合わせた二段階のプロセスを採用しています。

第一段階では、価格、広告費、従業員数、前期シェア率の4つの要素を考慮して各会社の販売シェア率を計算します。第二段階では、このシェア率と市場需要から潜在的販売数を算出し、在庫制約を考慮して実際の販売数を決定します。


第一段階:販売シェア率の計算

入力パラメータ

各会社 ii について、以下のデータを収集します:

  • PiP_i: 販売価格
  • AiA_i: 広告費
  • EiE_i: 従業員数
  • Si,t1S_{i,t-1}: 前期(ターン t1t-1)における販売シェア率

また、製品ごとに以下の係数が設定されています:

  • α\alpha: 価格の影響係数(α0\alpha \geq 0
  • β\beta: 広告費の影響係数(β0\beta \geq 0
  • γ\gamma: 従業員数の影響係数(γ0\gamma \geq 0
  • δ\delta: 前期シェア率の影響係数(0δ10 \leq \delta \leq 1

ステップ1:統計的評価

各要素について、正規分布を用いた統計的評価を行います。

会社 ii を除く他のすべての会社(n1n-1 社)のデータから、平均と標準偏差を計算します:

価格の場合:

Pˉi=1n1jiPj\bar{P}_{-i} = \frac{1}{n-1} \sum_{j \neq i} P_j σP,i=max(1,1n1ji(PjPˉi)2)\sigma_{P,-i} = \max\left(1, \sqrt{\frac{1}{n-1} \sum_{j \neq i} (P_j - \bar{P}_{-i})^2}\right)

会社 ii の価格が他社と比較して下位何%に位置するかを計算:

CDFP(i)=Φ(PiPˉiσP,i)\text{CDF}_P(i) = \Phi\left(\frac{P_i - \bar{P}_{-i}}{\sigma_{P,-i}}\right)

ここで、Φ\Phi は標準正規分布の累積分布関数です。

価格は低いほど有利であるため、百分位数を反転させます:

PercentileP(i)=1CDFP(i)\text{Percentile}_P(i) = 1 - \text{CDF}_P(i)

同様に、広告費と従業員数についても計算します。これらは高いほど有利なので、反転は不要です:

PercentileA(i)=1Φ(AiAˉiσA,i)\text{Percentile}_A(i) = 1 - \Phi\left(\frac{A_i - \bar{A}_{-i}}{\sigma_{A,-i}}\right) PercentileE(i)=1Φ(EiEˉiσE,i)\text{Percentile}_E(i) = 1 - \Phi\left(\frac{E_i - \bar{E}_{-i}}{\sigma_{E,-i}}\right)

ステップ2:係数による重み付け

各百分位数に対して、べき乗による重み付けを行います:

CP(i)=max(PercentileP(i)α,min(1n,0.001))C_P(i) = \max\left(\text{Percentile}_P(i)^\alpha, \min\left(\frac{1}{n}, 0.001\right)\right) CA(i)=max(PercentileA(i)β,min(1n,0.001))C_A(i) = \max\left(\text{Percentile}_A(i)^\beta, \min\left(\frac{1}{n}, 0.001\right)\right) CE(i)=max(PercentileE(i)γ,min(1n,0.001))C_E(i) = \max\left(\text{Percentile}_E(i)^\gamma, \min\left(\frac{1}{n}, 0.001\right)\right)

ステップ3:総合係数の計算

3つの重み付けされた係数を乗算して、会社 ii の総合係数を求めます:

Ci=CP(i)×CA(i)×CE(i)C_i = C_P(i) \times C_A(i) \times C_E(i)

すべての会社の総合係数の合計を計算します:

Ctotal=i=1nCiC_{\text{total}} = \sum_{i=1}^{n} C_i

当期のシェア率を正規化します:

Si,tcurrent=CiCtotalS_{i,t}^{\text{current}} = \frac{C_i}{C_{\text{total}}}

ステップ4:前期シェア率との混合

前期シェア率と当期シェア率を係数 δ\delta で混合して、最終的なシェア率を決定します:

Si,t=δSi,t1+(1δ)Si,tcurrentS_{i,t} = \delta \cdot S_{i,t-1} + (1 - \delta) \cdot S_{i,t}^{\text{current}}

注:

  • δ=0\delta = 0 の場合、完全に当期の評価のみで決定
  • δ=1\delta = 1 の場合、前期のシェア率がそのまま維持される
  • 0<δ<10 < \delta < 1 の場合、段階的にシェアが変化

特殊ケース(第1ターン):

前期の販売実績が存在しない場合、すべての会社に均等なシェア率を初期値として割り当てます:

Si,0=1nS_{i,0} = \frac{1}{n}

第二段階:実際の販売数の決定

ステップ1:潜在的販売数の計算

市場全体の需要量を DtotalD_{\text{total}} とします。各会社の潜在的販売数は、シェア率を用いて計算されます:

Qipotential=Dtotal×Si,tQ_i^{\text{potential}} = \lfloor D_{\text{total}} \times S_{i,t} \rfloor

注:\lfloor \cdot \rfloor は床関数(切り捨て)を表します。

ステップ2:在庫制約下での販売数決定

各会社 ii の在庫数を IiI_i とします。実際の販売数は、反復アルゴリズムにより以下のように決定されます:

初期化:

Qireal=0iQ_i^{\text{real}} = 0 \quad \forall i Dremaining=DtotalD_{\text{remaining}} = D_{\text{total}}

反復プロセス:

残余需要が存在し、かつ在庫を持つ会社が存在する限り、以下を繰り返します:

  1. 在庫が残っている会社の集合を A\mathcal{A} とします:

    A={iIi>0}\mathcal{A} = \{i \mid I_i > 0\}
  2. 在庫を持つ会社の潜在的販売数の合計を計算:

    QApotential=iAQipotentialQ_{\mathcal{A}}^{\text{potential}} = \sum_{i \in \mathcal{A}} Q_i^{\text{potential}}
  3. 各会社 iAi \in \mathcal{A} に対して、需要シェアを計算:

    ϕi=QipotentialQApotential\phi_i = \frac{Q_i^{\text{potential}}}{Q_{\mathcal{A}}^{\text{potential}}}
  4. 各会社が今回のイテレーションで販売する数量を決定:

    ΔQi=min(ϕi×Dremaining,Ii)\Delta Q_i = \min\left(\lfloor \phi_i \times D_{\text{remaining}} \rfloor, I_i\right)
  5. 実際の販売数と在庫を更新:

    QirealQireal+ΔQiQ_i^{\text{real}} \leftarrow Q_i^{\text{real}} + \Delta Q_i IiIiΔQiI_i \leftarrow I_i - \Delta Q_i
  6. 残余需要を更新:

    DremainingDremainingiAΔQiD_{\text{remaining}} \leftarrow D_{\text{remaining}} - \sum_{i \in \mathcal{A}} \Delta Q_i

終了条件:

以下のいずれかの条件を満たした場合、反復を終了します:

  • Dremaining=0D_{\text{remaining}} = 0
  • A=\mathcal{A} = \emptyset
  • QApotential=0Q_{\mathcal{A}}^{\text{potential}} = 0
  • iAΔQi=0\sum_{i \in \mathcal{A}} \Delta Q_i = 0

結論:各会社の実際の販売数

上記のアルゴリズムの実行後、各会社 ii実際の販売数は以下となります:

Qireal\boxed{Q_i^{\text{real}}}

この値が、ターン tt における会社 ii の最終的な販売数として記録されます。