我在练习竞争性编程时遇到了以下问题。我手工解决了这个问题,设计了一种方法,但我的答案是错误的,我无法想象如何扩展我的方法。
问题:
N咖啡连锁店正通过一场激烈的广告大战争夺市场份额。每天都会有一定比例的顾客被说服从一条链转到另一条。
给出了当前市场份额和客户切换的日概率。如果广告永远运行,市场份额的最终分布将是什么?
假设:总市场份额为1.0,客户切换独立于其他客户和天的可能性。
示例:2个咖啡连锁店:A和B的市场份额A: 0.4,市场份额B: 0.6。
每天,客户从A切换到B的概率为0.2,客户从B切换到A的概率为0.1。
input: market_share=[0.4,0.6],
switch_prob = [[.8,.2][.1,.9]]
output: [0.3333 0.6667]
在这里之前的一切都是问题的一部分,我没有形成这个例子或假设,而是给出了这个问题。
My_attempt:据我理解,开关概率表示从A到B转换的概率。
因此,
market_share_of_A = current_market_share - lost_customers + gained_customers and
marker_share_of_B = (1 - marker_share_of_A)
iter_1:
lost_customers = 0.4 * 0.8 * 0.2 = 0.064
gained_customers = 0.6 * 0.2 * 0.1 = 0.012
market_share_of_A = 0.4 - 0.064 + 0.012 = 0.348
marker_share_of_B = 1 - 0.348 = 0.652
iter_2:
lost_customers = 0.348 * 0.1 * 0.2 = 0.00696
gained_customers = 0.652 * 0.9 * 0.1 = 0.05868
market_share_of_A = 0.348 - 0.00696 + 0.05868 = 0.39972
marker_share_of_B = 1 - 0.32928 = 0.60028
my answer: [0.39972, 0.60028]如前所述,预期答案是[0.3333 0.6667]。
A, B, C.我认为输入必须以[[0.1, 0.3, 0.6]..]的形式提供切换概率,因为A可能会将它的客户输给B和C,而且会有很多这样的例子。现在,我至少要计算两家公司的市场份额,第三家是(1-sum_of_all)。在计算B的市场份额时,我必须计算它失去的客户以及获得的结果,公式是(current - lost + gained)。得到的是gain_from_A and gain_from_C之和。这是正确的吗?发布于 2018-04-06 05:03:51
根据我的评论,这个问题可以用矩阵方程来表示。
“过渡”矩阵T(i, j) (维度N x N)的元素定义如下:
i = j (对角线):客户在连锁i中停留的概率i != j (非对角线):链j向链i转移的概率这个矩阵的物理意义是什么?让市场份额状态由大小为P(i)的向量N表示,其i-th值是连锁i的市场份额。向量P' = T * P是每天之后的下一个共享状态。
考虑到这一点,T * P = P给出了平衡方程,即最终状态在跃迁T下是不变的。
| T(1, 1) T(1, 2) T(1, 3) ... T(1, N) | | P(1) | | P(1) |
| T(2, 1) T(2, 2) ... | | P(2) | | P(2) |
| T(3, 1) ... | | P(3) | | P(3) |
| . . | * | . | = | . |
| . . | | . | | . |
| . . | | . | | . |
| T(N, 1) T(N, N) | | P(N) | | P(N) |然而,这本身是无法解决的-- P只能在其元素之间确定多个比率(这种情况的技术名称使我无法理解--正如MBo指出的那样,这是由于退化造成的)。还有一个额外的限制,即股票加起来等于1:
P(1) + P(2) + ... P(N) = 1我们可以选择一个任意的共享值(例如,N第四值)并用这个表达式替换它。相乘后,方程的第一行是:
T(1, 1) P(1) + T(1, 2) P(2) + ... T(1, N) (1 - [P(1) + P(2) + ... P(N - 1)]) = P(1)
--> [T(1, 1) - T(1, N) - 1] P(1) + [T(1, 2) - T(1, N)] P(2) + ... "P(N - 1)" = -T(1, N)第二行的等效方程是:
[T(2, 1) - T(2, N)] P(1) + [T(2, 2) - T(2, N) - 1] P(2) + ... = -T(2, N)总结一下总的模式,我们定义:
S(i, j) (维数[N - 1] x [N - 1]):Q(i)的向量N - 1,包含P(i)的第一个N - 1元素R(i)的向量N - 1,例如R(i) = -T(i, N)然后方程变成S * Q = R
| S(1, 1) S(1, 2) S(1, 3) ... S(1, N-1) | | Q(1) | | R(1) |
| S(2, 1) S(2, 2) ... | | Q(2) | | R(2) |
| S(3, 1) ... | | Q(3) | | R(3) |
| . . | * | . | = | . |
| . . | | . | | . |
| . . | | . | | . |
| S(N-1, 1) S(N-1, N-1) | | Q(N-1) | | R(N-1) |解决上述方程给出了Q,它给出了第一个N - 1共享值(当然,最后一个也来自约束)。方法包括高斯消去和LU分解,这两种方法都比直接计算Q = inv(S) * R的朴素路径更有效。
请注意,您可以翻转S和R中的符号,以便进行稍微方便的评估。
上面给出的玩具示例非常琐碎:
| 0.8 0.1 | | P1 | | P1 |
| | * | | = | |
| 0.2 0.9 | | P2 | | P2 |
--> S = | -0.3 |, R = | -0.1 |
--> Q1 = P1 = -1.0 / -0.3 = 0.3333
P2 = 1 - P1 = 0.6667N = 3的一个例子
| 0.1 0.2 0.3 | | -1.2 -0.1 | | -0.3 |
T = | 0.4 0.7 0.3 | --> S = | | , R = | |
| 0.5 0.1 0.4 | | 0.1 -0.6 | | -0.3 |
| 0.205479 |
--> Q = | | , P3 = 0.260274
| 0.534247 |请原谅鲁滨逊漂流记风格的格式--为了便于阅读,我稍后将尝试用LaTeX编写这些格式。
https://stackoverflow.com/questions/49684606
复制相似问题