项目总结论文复现与改进:一般选择模型的产品组合优化算法(Research@收益管理)

Posted 囚生CY

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了项目总结论文复现与改进:一般选择模型的产品组合优化算法(Research@收益管理)相关的知识,希望对你有一定的参考价值。

  • 论文标题:Assortment Optimization Under General Choice
  • 中文标题:一般选择下的产品组合优化
  • 论文下载链接:SSRN

前情提要

本文是基于笔者之前对上述论文做的笔注的深入分析与算法改进探究,上述论文的笔注发布于前一篇博客https://caoyang.blog.csdn.net/article/details/121246506。问题背景是你有很多产品可以卖,这时候来了一些客户想买产品,你可能会直接向这些客户展示所有的产品,然而也许你只展示一部分产品反而可能获得更高的收益,因为客户选择每件产品的概率与你展示的产品集合(我们称之为报价集)密切相关,如何找到最优的报价集是选择模型(Choice Model)需要解决的问题。

如果你熟悉收益管理的研究方法,这将有助于你更好的理解上述论文,事实上Jagabathula在上面这篇论文中提出的算法是非常浅然的,即从一个空的产品子集开始搜索,每次向里面增加、或删除、或交换一个产品以使得期望收益提升最多,然而如此浅然的算法在最简单的一系列选择模型上的收敛性(即是否能够得到全局最优解)也涉及极其复杂的证明。

笔者在这篇博客中不会涉及任何理论推导,仅根据上述的论文及其相关的三个版本(上述链接中下载到的是2016年的版本,事实上与Jagabathula在2014年上传的版本是有很大区别的,此外2011年Jagabathula还写了一篇同名的论文,算法也稍有区别,这在本博客的的2.1节中会详细阐述,三版论文可以从下面的链接中下载得到)进行进一步的改进。笔者提出了两种具有启发性的改进措施,并在仿真实验中对其有效性进行了检验。

链接: https://pan.baidu.com/s/1F0eC4ZgQlMzjxUWjpeBQPw 
提取码: xap2

其实上一篇笔注博客https://caoyang.blog.csdn.net/article/details/121246506是用来做课程汇报的,本文则是用于期末提交的报告,虽然笔者也不是主要研究收益管理这块,甚至都很少做OM和OP的事情了,不过笔者觉得自己的想法还是挺有趣的,所以就拿出来遛遛😀。本博客的仿真代码在笔者的GitHub repository可以下载得到,笔者在本博客附录3中也放了一份备用,代码逻辑非常清晰,注释详实,有兴趣的朋友结合本博客搞明白应该并不困难。

PS:上周六队内测试时5000米跑出19分59秒73,成功打开20分钟的大关,这对于我一个本科体测从来没跑进4分10秒的体育废柴来说真的是奇迹般的突破。实话说没有什么事情是不可能的,人还是要相信自己的能力,不要被世俗的眼光所束缚住。今年虽然马拉松赛事大面积取消和延期,但是对我来说也不是一件坏事,今天下午随意跑了一次万米就能到42分30秒的水平,感觉已经能够把有氧配速提到4分15秒左右,明年半马能往90分钟大关冲一冲,今年要是真去舟山跑的话可能95分钟都够呛。养兵千日,不急于一时。



1 引言

在本次课程中,笔者对Srikanth Jagabathula在2014年提出的一种产品组合优化的ADXOpt算法进行汇报,该算法不依赖选择模型的参数结构,适用于任何给定报价集即可高效计算对应期望收益的一般选择模型。Jagabathula在MNL模型、鲁棒MNL模型、嵌套Logit模型(相异度参数小于1的二级嵌套,且只包含两个嵌套,第一个嵌套只包含不购买选项,第二个嵌套包含所有产品)和混合Logit模型(不同客户类的差异仅为不购买估值相异,而对产品的估值都相同)中分别证明算法的收敛性质与时间复杂度(表1),并在仿真模拟中得出算法能够在绝大多数情况下收敛到全局最优解的结论。

ADXOpt算法本质是对贪心算法的一种改进,逻辑简单易于实现,因此笔者根据原论文中仿真模拟的参数进行代码复现,验证原文数值分析结果的正确性。笔者在代码编写过程中受Jagabathula在2011年与2016年的两份相关研究的启发,采用统一的逻辑框架将算法进一步推广到更加一般的形式。此外,考虑到Jagabathula仅对二级嵌套Logit模型中最简单的一种模型设定进行理论证明与仿真模拟,笔者还将推广的算法框架应用到更一般的二级嵌套Logit模型中,并与原论文中ADXOpt算法进行对比实验分析。基于本文的实验结果,笔者提出对一般选择模型中产品组合优化算法的新见解。最后,本文使用的一些数学标记的默认含义详见表2,本文的代码详见附件内容或从笔者的GitHub repository中获取。


2 研究回顾与思考

经过笔者查证,原论文的算法框架经历三个版本的演进,2011年Jagabathula等人提出GreedyOpt算法,2014年Jagabathula提出ADXOpt算法,2016年Jagabathula对ADXOpt算法进行改进,为了区分2014年与2016年的ADXOpt算法,下文分别标记为ADXOpt2014算法与ADXOpt2016算法,本次课程汇报的论文对应2014年的版本,即ADXOpt2014算法。在本节内容中,笔者将简要回顾三版算法逻辑的异同处,并阐述这些算法的缺陷以及笔者进行的具体改进。

2.1 Jagabathula三版算法研究概述与问题分析

三版算法的伪代码详见附录2,其本质都是对平凡贪心算法(下称NaiveGreedy算法)的贪心策略进行改进。NaiveGreedy算法搜索最优报价集的思路非常简单,即初始化候选解为空集,每轮迭代向候选解中增加一个能够使得收益提升最多的产品,直到增加任意一个产品都不能提升收益或候选解已经达到报价集容量上限时算法终止。

NaiveGreedy算法必然在 O ( n ) O(n) O(n)轮迭代后终止,然而即便在最简单的MNL模型中,它也不能确保收敛到全局最优解,下面是一个反例:

  • 三个产品:
    N = 1 , 2 , 3 \\mathcalN=\\1,2,3\\ N=1,2,3

  • 其中前两个产品在价格与估值上完全相同:
    p 1 = p 2 = p , p 3 = p ′ and v 1 = v 2 = , v 3 = v ′ p_1=p_2=p,p_3=p' \\quad\\textand\\quad v_1=v_2=,v_3=v' p1=p2=p,p3=pandv1=v2=,v3=v

  • 假定不购买的估值 v 0 = 1 v_0=1 v0=1,若满足:
    p v 1 + v ≤ p ′ v ′ 1 + v ′ ≤ 2 p v 1 + 2 v and p v + p ′ v ′ 1 + v + v ′ ≤ 2 p v 1 + 2 v \\fracpv1+v\\le \\fracp'v'1+v'\\le \\frac2pv1+2v\\quad \\textand\\quad \\fracpv+p'v'1+v+v'\\le\\frac2pv1+2v 1+vpv1+vpv1+2v2pvand1+v+vpv+pv1+2v2pv
    C = 1 C=1 C=1时, S ∗ = 3 S^*=\\3\\ S=3 C = 2 C=2 C=2时, S ∗ = 1 , 2 S^*=\\1,2\\ S=1,2

  • 构造 p = 2 , p ′ = 1.9 , v = e 0.5 , v ′ = e 0.7 p=2,p'=1.9,v=e^0.5,v'=e^0.7 p=2,p=1.9,v=e0.5,v=e0.7,可以满足上述条件:
    1.245 ≤ 1.270 ≤ 1.535 and 1.528 ≤ 1.535 1.245\\le 1.270\\le 1.535\\quad \\textand\\quad 1.528\\le 1.535 1.2451.2701.535and1.5281.535
    此时NaiveGreedy算法显然无法收敛到 C = 2 C=2 C=2时的最优解

为了改善贪心算法的收敛性,Jagabathula提出可以改进NaiveGreedy算法每轮迭代中所执行的贪心调整策略,具体而言,算法仍然初始化候选解为空集,但是每轮迭代中对当前候选解执行一次能够使得收益提升最多的局部调整,如在候选解中增加一个新产品、或在候选解中删除一个产品、或在候选解删除一个产品并增加一个新产品(即交换操作),为了确保算法能够终止,需要设定每个产品能够被移出候选集(包括删除操作与交换操作中的移出行为)的最大次数 b b b。三版算法与NaiveGreedy算法的贪心策略比较如表3所示,GreedyOpt算法没有考虑删除操作,且优先执行增加操作(指在某轮迭代中,若存在能够使得收益提升的合法增加操作,则在本轮迭代不再考虑其他操作),ADXOpt2014算法与ADXOpt2016算法同时考虑增加、删除、交换三种操作,它们的区别在于是否优先执行增加操作。根据本次课程汇报原论文中的理论证明,在具有特殊参数结构的嵌套Logit模型与混合Logit模型中,ADXOpt2014算法即便不考虑交换操作(但需要优先执行增加操作)也可以收敛到局部最优解。

虽然Jagabathula证明ADXOpt2014算法具有良好的收敛性质,且在仿真模拟中验证了ADXOpt2014算法在理论证明无法收敛到全局最优解的嵌套Logit模型与混合Logit模型中,分别有98.5%与98.7%的情形能够收敛到全局最优解,并且那些未能收敛到全局最优解的情形中,得到的局部最优解相比于全局最优解在实际收益数值上的差距非常小,并以此立论ADXOpt2014算法的可用性。但是笔者认为Jagabathula对ADXOpt2014算法的研究存在如下问题:

  1. 仅对设定非常简单的嵌套Logit模型与混合Logit模型进行理论证明,事实上对原论文中的这两种模型的参数设定推广到稍一般的情况,ADXOpt2014算法可能甚至无法收敛到局部最优解。
  2. 仿真模拟中对产品总数的设定只考虑了 n = 10 n=10 n=10 n = 15 n=15 n=15两种总数较少的情况,注意到算法搜索到的解空间大小为 O ( n 2 C b ) O(n^2Cb) O(n2Cb),而穷举空间大小为 O ( 2 n ) O(2^n) O(2n),在 n n n较小的情况下,两者的差距并不大。此外,仿真模拟中对选择模型参数的随机生成范围也很保守,如产品估值取值范围为 [ 0 , 10 ] [0,10] [0,10]、产品价格取值范围为 [ 100 , 150 ] [100,150] [100,150],这会导致局部最优解相较于全局最优解在实际收益上的差距很难拉开。因此仿真模拟中得出的几乎都能够收敛到全局最优解能够得到高质量的局部最优解的结论是不足够令人信服的。
  3. 2011年的GreedyOpt算法中提及算法初始候选集可以从大小为 S S S的产品子集族中遍历选取,然而Jagabathula事实上在原论文与之后的研究中都只考虑了 S = 0 S=0 S=0的情况,即初始候选集为空集的情况。这本质是一种牺牲时间以获得精度的做法,可能Jagabathula觉得研究 S S S取值意义不大,笔者在下文中将说明如何基于这一点对算法进行一个反向形式的改进。
  4. 2014年的原论文中提及嵌套Logit模型最优解的块级性质,因此可以考虑对算法进行块级调整的推广,这本质也是一种牺牲时间以获得精度的做法,然而Jagabathula在原论文与之后的研究中也没有对这种块级调整策略进行深入分析,笔者在本文的仿真模拟中将说明块级调整策略的引入对算法在一般形式的二级嵌套Logit模型中收敛性具有显著的提升。

2.2 本文的改进与贡献

综上所述,笔者认为Jagabathula提出的算法仍有改进空间,具体而言,本文中笔者提出算法的反向变体块级调整两种改进手段,本节将阐述算法改进的启发与意义。

关于本文2.1节中第3点问题中的初始候选解大小 S S S的取法,若 S = 0 S=0 S=0,即从空集开始搜索,这与Jagabathul提出的三版算法逻辑相同;若 S S S取一个适中的数,那么初始候选解的数量为 C n S C_n^S CnS,这可能会是一个很大的数字,算法时间复杂度会很高,本文也不考虑这种情况;若 S = C S=C S=C,即取到可能的最大值(即报价集容量上限)呢?这就很有趣了,即从全集开始搜索,若将增加操作与删除操作调换,则就可以得到三版算法的反向形式,具体的算法配置如表4所示。

为了说明这种反向形式的意义,笔者举一个简单的例子: