价格-需求模型论文复现
背景描述
给定N个商品集合,确定包含K组商品价格的价格集合以及每个商品的库存约束后,希望通过观察T=1,2,…,t时的价格-需求关系推测出T=t+1时满足库存约束的利润最大价格K
需求
主要涉及到三个算法:BZ,GP-TS,GP-PTS
Daniel Ringbeck, Dynamic Pricing & Learning: An Application of Gaussian Process Regression
按照论文中给出的步骤实现相应算法并按照论文中的参数设置进行仿真实验
实现过程
- 定义价格集合price,库存约束I,初始化需求集合demand
- 调用sklearn中GaussianProcess训练高斯过程模型,预测price中每个价格k对应的需求demand
- 将模拟出的需求demand及其对应价格以及库存约束作为输入,输入到线性规划模型中,求出当前最优的价格
- 更新价格集合和需求集合
- 绘制结果图
其中比较关键的点在于:
- 调用GaussianProcess进行高斯过程模型的训练
- 线性规划求解
- 各个数组的形状对应
结果
图1:数值模拟的结果,与论文结果基本一致,收敛
图2:基于某酒店数据集的真实数据仿真,由于数据集的数据问题导致模型最终结果偏离正常值,但是趋势也是基本收敛,说明了算法的实现还是没问题的。
部分代码
for t in range(T):
if t <= interval:
# 建立高斯过程模型
GPList = GaussProcess(price_GP, demand_GP)
# 根据GP,对每个价格进行采样
demand_temp = np.zeros((K, N)) # 存放GPs采样后的需求矩阵
prob_price = [] # 存放M次价格抽样的结果
prob_demand = [] # 存放M次价格抽样后的需求结果
for m in range(M):
for k in range(K):
for idx, GPs in enumerate(GPList):
GPs_demand = GPs(price[k].reshape(1, -1))
demand_temp[k, idx] = max(GPs_demand, 0)
idx = np.argmax(LinPro(price, demand_temp, a_coeff, c))
prob_price.append(price[idx])
prob_demand.append(np.maximum(np.minimum(RealDemandFunc(price[idx], t, I), c), np.zeros((N,))))
if 0 not in prob_demand[-1]:
ratio_temp.append(demand_temp[idx] / prob_demand[-1])
if ratio_temp != []:
ratio.append(np.array(ratio_temp).mean(axis=0))
# 更新用于构建GPs的价格-需求数组
price_GP = np.concatenate((price_GP, np.array(prob_price)), axis=0)
demand_GP = np.concatenate((demand_GP, np.array(prob_demand)), axis=0)
GitHub地址:https://github.com/Staaaying/record-repo/tree/main/price-demand-model
如有daixie需要或者相关问题交流可加vx:NumNull404,email:2044174075@qq.com
欢迎交流讨论