#通过数值MATLAB数值分析不同策略下供应商和零售商(主从博弈)的最优利润。
#问题相关代码
dedicate strategy
function [max_supplier_profit, max_retailer_profit, optimal_w, optimal_q, optimal_p_e] = dedicatestrategy(val_w, val_q, gamma_e, sigma_e, c, Mstep)
% 定义利润函数
profit_supplier = @(w, q) (val_w - c) * q;
profit_retailer = @(p_e, q, q_e, D_e) p_e * min(D_e, q_e) - val_w * q;
% 参数设置
num_iterations = Mstep; % 迭代次数
w_range = linspace(val_w(1), val_w(2), num_iterations); % 批发价格范围
q_range = linspace(val_q(1), val_q(2), num_iterations); % 订购量范围
% 初始化最大利润和对应的最优参数
max_supplier_profit = -Inf;
max_retailer_profit = -Inf;
optimal_w = 0;
optimal_q = 0;
optimal_p_e = 0;
% 循环迭代
for i = 1:num_iterations
w = w_range(i);
for j = 1:num_iterations
q = q_range(j);
% 计算excellent product的比例
xi_e = normrnd(gamma_e, sigma_e);
% 计算excellent product数量
q_e = xi_e * q;
% 计算零售价格
if q_e > 0.5
p_e = 0.5;
else
p_e = 1 - q_e;
end
%end
%计算excellent product的需求
D_e = 1 - p_e;
retailer_profit = profit_retailer(p_e, q, q_e,D_e);
% 更新最大零售商利润和对应的最优订购量
if retailer_profit > max_retailer_profit
max_retailer_profit = retailer_profit;
optimal_q = q;
optimal_p_e = p_e;
end
end
% 使用使零售商利润最大化的最优数量计算供应商利润
supplier_profit = profit_supplier(w, optimal_q);
% 更新最大供应商利润和对应的最优批发价格
if supplier_profit > max_supplier_profit
max_supplier_profit = supplier_profit;
optimal_w = w;
end
end
% 返回零售商的最大利润
max_retailer_profit = profit_retailer(optimal_p_e, optimal_q, xi_e*optimal_q, 1 - optimal_p_e);
disp(['最大供应商利润:', num2str(max_supplier_profit)]);
disp(['最大零售商利润:', num2str(max_retailer_profit)]);
%disp(['最优批发价格 w:', num2str(optimal_w)]);
%disp(['最优订购量 q:', num2str(optimal_q)]);
%disp(['最优零售价格 p_e:', num2str(optimal_p_e)]);
end
diverse strategy
function [max_supplier_profit, max_retailer_profit, optimal_w, optimal_q, optimal_p_e, optimal_p_g] = diversestrategy(val_w, val_q, gamma_e, sigma_e, gamma_g, sigma_g, c, rho, Mstep)
% 定义利润函数
profit_supplier = @(w, q) (val_w - c) * q;
profit_retailer = @(p_e, p_g, q, q_e, q_g, D_e, D_g) p_e * min(D_e, q_e) + p_g * min(D_g, q_g) - val_w * q;
% 参数设置
num_iterations = Mstep; % 迭代次数
w_range = linspace(val_w(1), val_w(2), num_iterations); % 批发价格范围
q_range = linspace(val_q(1), val_q(2), num_iterations); % 订购量范围
% 初始化最大利润和对应的最优参数
max_supplier_profit = -Inf;
max_retailer_profit = -Inf;
optimal_w = 0;
optimal_q = 0;
optimal_p_e = 0;
optimal_p_g = 0;
% 循环迭代
for i = 1:num_iterations
w = w_range(i);
for j = 1:num_iterations
q = q_range(j);
% 计算excellent product和good product的比例
xi_e = normrnd(gamma_e, sigma_e);
xi_g = normrnd(gamma_g, sigma_g);
% 计算零excellent product、good product数量
q_e = xi_e * q;
q_g = xi_g * q;
% 计算零售价格
if q_e + q_g > 0.5
if q_e <= 0.5
p_e = 1 - (1 - rho) * q_e - rho / 2;
p_g = rho / 2;
else
p_e = 0.5;
p_g = rho / 2;
end
else
if q_e > 0.5
p_e = 0.5;
p_g = rho / 2;
else
p_e = 1 - q_e - rho * q_g;
p_g = rho * (1 - q_e - q_g);
end
end
% 计算零售商的需求和excellent product、good product数量
D_e = 1 - (p_e-p_g) / (1 - rho);
D_g = (p_e - p_g) / (1 - rho) - p_g / rho;
% 计算零售商利润
retailer_profit = profit_retailer(p_e, p_g, q, q_e, q_g, D_e, D_g);
% 更新最大零售商利润和对应的最优参数
if retailer_profit > max_retailer_profit
max_retailer_profit = retailer_profit;
optimal_q = q;
optimal_p_e = p_e;
optimal_p_g = p_g;
end
end
% 使用使零售商利润最大化的最优数量计算供应商利润
supplier_profit = profit_supplier(w, optimal_q);
% 更新最大供应商利润和对应的最优参数
if supplier_profit > max_supplier_profit
max_supplier_profit = supplier_profit;
optimal_w = w;
end
end
% 返回零售商的最大利润
max_retailer_profit = profit_retailer(optimal_p_e, optimal_p_g, optimal_q);
disp(['最大供应商利润:', num2str(max_supplier_profit)]);
disp(['最大零售商利润:', num2str(max_retailer_profit)]);
%disp(['最优批发价格 w:', num2str(optimal_w)]);
%disp(['最优订购量 q:', num2str(optimal_q)]);
%disp(['最优零售价格 p_e:', num2str(optimal_p_e)]);
%disp(['最优零售价格 p_g:', num2str(optimal_p_g)]);
end
运行脚本:
% 定义参数
val_w = [1, 10]; % 批发价格范围
val_q = [1, 10]; % 订购量范围
gamma_e = 0.5; % excellent product的比例的均值
sigma_e = 0.1; % excellent product的比例的标准差
gamma_g = 0.5; % good product的比例的均值
sigma_g = 0.1; % good product的比例的标准差
rho = 0.5; % p_e和p_g之间的关系参数
Mstep = 100; % 迭代次数
% 定义c的范围
c_range = linspace(0.01, 0.5, 100);
% 初始化结果存储向量
supplier_profit_dedicated = zeros(size(c_range));
retailer_profit_dedicated = zeros(size(c_range));
supplier_profit_diverse = zeros(size(c_range));
retailer_profit_diverse = zeros(size(c_range));
% 计算不同c下的最优利润
for i = 1:length(c_range)
c = c_range(i);
[~, max_retailer_profit_dedicated, max_supplier_profit_dedicated, ~, ~, ~] = dedicatestrategy(val_w, val_q, gamma_e, sigma_e, c, Mstep);
[~, max_retailer_profit_diverse, max_supplier_profit_diverse, ~, ~, ~] = diversestrategy(val_w, val_q, gamma_e, sigma_e, gamma_g, sigma_g, c, rho, Mstep);
supplier_profit_dedicated(i) = max_supplier_profit_dedicated;
retailer_profit_dedicated(i) = max_retailer_profit_dedicated;
supplier_profit_diverse(i) = max_supplier_profit_diverse;
retailer_profit_diverse(i) = max_retailer_profit_diverse;
end
% 绘制结果图
figure;
plot(c_range, supplier_profit_dedicated, 'b', 'LineWidth', 2);
hold on;
plot(c_range, retailer_profit_dedicated, 'r', 'LineWidth', 2);
plot(c_range, supplier_profit_diverse, 'g--', 'LineWidth', 2);
plot(c_range, retailer_profit_diverse, 'm--', 'LineWidth', 2);
xlabel('c');
ylabel('Profit');
title('Supplier and Retailer Profit vs. c');
legend('Dedicated Supplier Profit', 'Dedicated Retailer Profit', 'Diverse Supplier Profit', 'Diverse Retailer Profit');
grid on;
报错内容:
错误使用 dedicatestrategy
输出参数太多。
出错 comparison_profit (line 23)
[max_supplier_profit_dedicated, max_retailer_profit_dedicated, ~, ~, ~,~] = dedicatestrategy(val_w, val_q, gamma_e, sigma_e, c, Mstep);