前段時間、ある空港のオーナーが私に数学的な助けを求め、ユーザーがどのパッケージを選ぶかを計算する手助けをしてほしいと言ってきました。私は、数学モデルを構築するために必要なデータが必要だと返答しました。しかし、彼らはデータを提供することを拒否しました。おそらく、データを収集することができなかったか、データの匿名化が面倒だったからでしょう。
そこで、協議の結果、私はデータを必要とせず、データに基づいて調整可能なモデルを構築し、コストを削減するためのいくつかの提案も行いました。その結果、彼らは私により高い報酬を支払うことに同意しました。
彼らの空港では PHP を使用していますが、計算の便宜上、私は pytorch を使用しました。彼らはこのモデルを実行するために Python を使える人を見つける必要があるようです。
モデルパラメータ#
ユーザーの予算が従う確率密度関数を、流量需要が従う確率密度関数を、ノードの品質需要が従う確率密度関数をと仮定します。
ユーザーが上記の 3 つの要因に対する重視の比率の確率密度関数をと仮定し、次のように定義します:
- 、、、そうでなければ
- は予算の重み、は流量の重み、は品質の重みです。
各パッケージには価格、流量、品質の 3 つの属性があります。ユーザーがどのパッケージを購入するか考えるとき、階層分析法に従って意思決定を行うと仮定します。上記の、、のパラメータはパラメータ推定が必要です。
、、を製品配列ベクトルとし、それぞれ製品の価格、流量、品質を表します。製品配列ベクトルは製品の特性によって決定され、パラメータ推定は必要ありません。
import torch
# パッケージの価格、流量、品質を定義
packageNumber = 3
packagePrice = [1, 2, 3]
packageTrafficLimit = [1, 2, 3]
packageQuality = [1, 2, 3]
階層分析法による定量化#
予算の満足度はと定義できます。ここではパッケージ価格、は予算です。
流量の満足度は(平方根の下が 0 未満の場合は 0 と定義)と定義できます。ここではパッケージ流量、はパッケージ需要です。
ノード品質の満足度はと定義できます。ここではノード品質の定量指標、はノード品質需要です。
ユーザーは満足度を選択します。
最大のパッケージ
また、すべてのパッケージの満足度が 0.1 未満であれば、そのパッケージは選択されません。
ベクトル形式で表すと、次のようになります:
対応する Python コードは次のとおりです。
# ユーザーのパラメータとパッケージから満足度へのマッピングを定義
def user_satisfaction(vector_x, vector_y, pr, t, q):
# XとYがtorchテンソルであることを確認
vector_x = torch.tensor(vector_x, dtype=torch.float32)
vector_y = torch.tensor(vector_y, dtype=torch.float32)
term1 = vector_y[:, 0] * 10 ** (-pr / vector_x[:, 0])
term2 = vector_y[:, 1] * torch.sqrt(4 * t / vector_x[:, 1] - 0.75)
term3 = vector_y[:, 2] * (q / vector_x[:, 2]) ** (1 / 3)
return term1 + term2 + term3
ユーザーモデリング#
ユーザー予算分布#
予算はおおよそパレート分布に従うと考えられ、初期パラメータをと仮定します。すなわち、
ここで 0.6 は正確な値を得るためにパラメータ推定が必要です。
パレート分布は通常、不平等な分布を説明するために使用され、例えば富や収入、対応する予算などです。現実の世界では、富の分布はしばしば非常に不平等であり、少数の人々が大部分の富を所有しています。したがって、ユーザーの予算を反映するために、パレート分布を使用することは適切であると考えられます。
さらに、パレート分布は「80/20 ルール」と密接に関連しており、80% の効果(消費など)が 20% の原因(消費者など)から生じるというものです。多くの経済モデルにおいて、この現象は一般的であり、少数の消費者が大部分の消費支出を占めています。
パレート分布の 2 つのパラメータのうち、最初のパラメータはカットオフ値であり、のとき、です。カットオフ値はパラメータ推定できませんが、1 と仮定することは適切です。
流量需要分布#
流量需要は近似的に正規分布に従うと考えられ、パラメータはとします。すなわち、
これらの 2 つのパラメータはパラメータ推定が必要です。
品質需要分布#
品質をで定量化すると、1 は完全なリムジン空港、10 は全 IPLC 多入口スマート解析空港(性能はゲーム加速器に近い)とします。この場合、品質需要もパレート分布に従うと考えられ、パラメータはとします。すなわち、
このパレート分布も同様に、2 番目のパラメータのみがパラメータ推定を必要とします。
重み分布#
、、の分布は、実際には等辺三角形の中に均等に配置されていることに注意してください。この等辺三角形は三角錐の底面です。この三角錐の 3 つの側面は、直角辺の長さが 1 の直角三角形です。
等辺三角形の 3 つの頂点は、それぞれ 1 つの重みが 1 で他の 2 つの重みが 0 である場合を表します。
を使用する場合、3 つの状況はそれぞれ、、に対応します。をより均等な等辺三角形にするためには、この領域を、、に線形変換する必要があります。この線形変換は簡単に求めることができます。
まず、とを整列させると、他の 2 つの点は、になります。したがって、変換行列は次のようになります。
平行移動ベクトルはであり、すなわち
ただし、3 つの要因の重視については、一般的に人々はノードの品質を気にせず、価格と流量だけを考慮すると考えられます。したがって、半分の二項正規分布を選択することができます。以前のパラメータは次のようになります。
すなわち、確率密度関数は
これらの 2 つのパラメータもパラメータ推定は必要ないと考えられます。
from torch.distributions import Pareto, Normal
from torch.distributions.multivariate_normal import MultivariateNormal
# ユーザー予算分布を定義
user_budget_distribution = Pareto(1, 0.6)
# ユーザー流量需要分布を定義
user_traffic_demand_distribution = Normal(130, 30)
# ユーザー品質需要分布を定義
user_quality_demand_distribution = Pareto(1, 2)
# ユーザー重視分布を定義
user_weight_mean = torch.tensor([0.5, 0.5])
user_weight_covariance = torch.tensor([[1 / 9, 0], [0, 1 / 9]])
user_weight_distribution = MultivariateNormal(user_weight_mean, user_weight_covariance)
# サンプルを生成
sample_size = 10000 # サンプル数
user_budget_sample = user_budget_distribution.sample((sample_size,))
user_traffic_demand_sample = user_traffic_demand_distribution.sample((sample_size,))
user_quality_demand_sample = user_quality_demand_distribution.sample((sample_size,))
user_weight_sample = user_weight_distribution.sample((sample_size,))
# ユーザーのパッケージ選択をシミュレート
y_1 = user_weight_sample[:, 0]
y_2 = user_weight_sample[:, 1]
y_3 = 1 - y_1 - y_2
user_sample = torch.stack([user_budget_sample, user_traffic_demand_sample, user_quality_demand_sample], dim=1)
user_weight_sample = torch.stack([y_1, y_2, y_3], dim=1)
user_satisfaction_of_packages = []
for i in range(packageNumber):
pr = packagePrice[i]
t = packageTrafficLimit[i]
q = packageQuality[i]
satisfactions = user_satisfaction(user_sample, user_weight_sample, pr, t, q)
user_satisfaction_of_packages.append(satisfactions)
user_satisfaction_of_packages = torch.stack(user_satisfaction_of_packages, dim=1)
max_values, max_indices = torch.max(user_satisfaction_of_packages, dim=1)
indices = torch.where(max_values < 0.1, torch.tensor(-1), max_indices)
パラメータ推定#
以上より、推定が必要なパラメータは次の通りです:
- ユーザー予算のパレート分布のパラメータ:
- 流量需要分布の平均と分散:、
- 品質需要のパレート分布のパラメータ:
これらのパラメータは神経ネットワークを通じて推定できるようですが、私は研究していません。初期パラメータは使用できないわけではありません。
コストの最小化#
パラメータ定義#
ユーザーのノードの好みを
と仮定し、と規定します。
ユーザーが各ノードで実際に使用する流量は
ここで、はユーザーが実際に使用する総流量です。
ここでは、ユーザーが流量を超過使用することを避けるために、好まないノードに切り替えることはないと仮定します。
各ノードが受け入れることができるユーザー数の制限を考慮せず、ユーザーはノードの流量を先に使い切ると仮定します。したがって、各ノードの限界コストは
となり、コストはとなります。
ここでは限界コストが一定であると仮定していますが、一般的に空港は規模の経済(限界コストが使用量に応じて低下する)です。
価格をとすると、限界利益はとなります。
したがって、利益データを得て、各パッケージの平均利益は
となります。
オーバーブッキング問題#
ノードの流量限界コストを決定するためには、オーバーブッキング比を計算する必要があります。とし、ここでは実際の流量限界コスト、はオーバーブッキング比です。
オーバーブッキングが多すぎて可用性が低下しないようにするために、をオーバーブッキング可用性と定義し、意味は:の確率でオーバーブッキングによって利用できなくならないことを意味します。
ここで、超パラメータと定義します。
パッケージに対して、ユーザーが実際に使用する総流量の確率密度関数をとすると、特定のノードで使用される流量の確率密度関数はとなります。
ノードの実際の流量をとすると、可用性を満たすためには
すなわち、
例えば、1 つのパッケージのみがあると仮定し、そのパッケージの制限が 150G で、日本のノードの倍率が 1、ユーザーの好みが 0.5 で、使用する流量が正規分布に従う場合、は、オーバーブッキング比はとなります。
ユーザーが使用する流量は、以前のパラメータ推定から得られたユーザー需要流量と大体同じですが、一定の誤差があります。これは、ユーザーが自分の必要な流量を過大評価することが多いためです。ただし、ユーザーが実際に使用する流量がユーザーの流量需要と等しいと仮定することは可能であり、少しの流量の冗長性は問題ではありません。
また、は方程式を解くことで求めることができるため、はデータ分析によって得ることができます。
最大期待利益問題#
最大期待利益問題は、次のようにすることです。
を最大化する問題です。(ここで $f_n$ は選択率です)
とは基本的に不変の量であり、ユーザーの需要分布が推定された後、はパッケージの属性のみに依存し、も安定しているため、最大利益問題はパッケージ属性を決定する問題となります。
もしパッケージの品質属性が定数であると仮定すると、変数は各パッケージの価格と流量のみになります。
したがって、最大期待利益を計算する方法は次のとおりです:
- を統計的に得る
- 各パッケージの品質を決定する
- 各パッケージの価格または流量を決定し、もう一方を変数として設定する。
- 変数に対して勾配降下法を適用し、上記の和を最大化する
-
- はユーザーの数学モデルの後にモンテカルロ法で得られる
-
- は価格であり、入力変数です
-
- はユーザーのモデリングに関連しています