我在练习竞争性编程时遇到了以下问题。我手动解决了,有点设计方法,但我的答案是错误的,我无法想象如何扩展我的方法。
问题:
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
的总和。它是否正确?
答案 0 :(得分:5)
根据我的评论,这个问题可以表示为矩阵方程。
“过渡”矩阵的元素T(i, j)
(维度N x N
)定义如下:
i = j
(对角线):客户与<{1}} i
(非对角线):链i != j
的客户转移到链j
这个矩阵的物理意义是什么?让市场份额状态由大小为i
的向量P(i)
表示,其N
- 值是链i
的市场份额。向量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
表明它是由于简)。还有一个附加约束,股票加起来为1:
MBo
我们可以选择任意共享值(例如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]
大小为- S(i, i) = T(i, i) - T(i, N) - 1
- S(i, j) = T(i, j) - T(i, N) (i != j)
的向量Q(i)
包含N - 1
的第一个N - 1
元素
大小为P(i)
的向量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
份额值(当然也是约束中的最后一个)。这样做的方法包括高斯消除和 LU分解,这两者都比直接计算N - 1
的天真路线更有效。
请注意,您可以在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.6667
的示例:
N = 3
请原谅Robinson Crusoe风格的格式 - 稍后我会尝试在LaTeX中编写这些格式以便于阅读。