⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 preference_regions.m

📁 斯坦福大学Grant和Boyd教授等开发的凸优化matlab工具箱
💻 M
字号:
% Example 6.9: Bounding consumer preference% Section 6.5.5, Figures 6.25-6.26% Boyd & Vandenberghe "Convex Optimization"% Original by Lieven Vandenberghe% Adapted for CVX Argyris Zymnis - 11/30/2005%% We are given a set of consumer preference data for bundles% of two goods x_1 and x_2. These points are generated by% taking 40 random points and comparing them using the% utility function: u(x_1,x_2) = (1.1*sqrt(x_1)+0.8*sqrt(x_2))/1.9% Then, if we have u(i) >= u(j) we say that (i,j) is in Pweak.%% Given this, we wish to compare the point (0.5,0.5) to each% of the bundles in the given dataset. I.e. for each point k in the% dataset, we wish to decide wether u(k) >= u(0) or u(k) <= u(0),% or both, in which case we cannot make any conclusions about% consumer preferences.%% To do this, we have to solve two LPs for each point:%       minimize     u(k) - u(0)%       subject to   g_i  >= 0%                    u(j) <= u(i) + g_i^T(a_j - a_i), for all i,j%                    u(i) >= u(j), for all (i,j) in Pweak%% and:%       maximize     u(k) - u(0)%       subject to   g_i  >= 0%                    u(j) <= u(i) + g_i^T(a_j - a_i), for all i,j%                    u(i) >= u(j), for all (i,j) in Pweak%% If the second LP has a strictly negative solution, we can deduce that% u(k) < u(0). If on the other hand the second LP has a nonnegative% solution and the first LP has a strictly positive solution, we can% deduce that u(k) > u(0). Finally if none of the two previous cases% holds, we cannot make a decision between the two bundles.%% NOTE: This file requires the auxilliary function utilfun.m to run.clearcvxq = cvx_quiet(true);data= [...   4.5e-01   9.6e-01   2.1e-01   3.4e-01   9.6e-01   3.0e-02   8.0e-02   9.2e-01   2.0e-02   2.2e-01   0.0e+00   3.9e-01   2.6e-01   6.4e-01   3.5e-01   9.7e-01   9.1e-01   7.8e-01   1.2e-01   1.4e-01   5.8e-01   8.4e-01   4.9e-01   2.7e-01   7.0e-02   8.0e-01   9.3e-01   8.7e-01   4.4e-01   8.6e-01   3.3e-01   4.2e-01   8.9e-01   9.0e-01   4.9e-01   7.0e-02   9.5e-01   3.3e-01   6.6e-01   2.6e-01   9.5e-01   7.3e-01   4.2e-01   9.1e-01   6.8e-01   2.0e-01   5.2e-01   6.2e-01   7.7e-01   6.3e-01   2.0e-02   2.9e-01   9.8e-01   2.0e-02   5.0e-02   7.9e-01   7.9e-01   1.9e-01   6.2e-01   6.0e-02   2.8e-01   8.7e-01   6.9e-01   1.0e-01   6.9e-01   3.7e-01   0.0e+00   7.2e-01   8.7e-01   1.7e-01   6.3e-01   4.0e-02   3.2e-01   7.3e-01   4.0e-02   4.6e-01   3.6e-01   9.5e-01   8.2e-01   6.7e-01 ];% objective pointobj=[0.5,0.5];figure(1);% display the utility function's level sets on some data points.plot(data(:,1),data(:,2),'o');hold on;[X,Y] = meshgrid(0:.01:1,0:.01:1);Z=(1.1*X.^(1/2)+0.8*Y.^(1/2))/1.9;[C,h] = contour(X,Y,Z,[.1,.2,.3,.4,.5,.6,.7,.8,.9],'--');clear X Y Z Chold off;xlabel('x_1');ylabel('x_2');hold offm = size(data,1);  % number of baskets, including 0,1% add preference dataPweak = zeros(m+1,m+1);for i=1:m,   for j=1:m      if (i~=j) & (1.1*data(i,1).^(1/2)+0.8*data(i,2).^(1/2))/1.9 >= ...             (1.1*data(j,1).^(1/2)+0.8*data(j,2).^(1/2))/1.9,         Pweak(i,j) = 1;      end;   end;end;% Find consumer preferencesdata = [data; 0.5 0.5];bounds = zeros(m,2);for k = 1:m    fprintf(1,'Deciding on bundle %d of %d: ',k,m);    % Check for u(k) >= u(0.5,0.5)    cvx_begin        variables u(m+1) g_x(m+1) g_y(m+1)        minimize(u(k)-u(m+1))        subject to            g_x >= 0;            g_y >= 0;            ones(m+1,1)*u' <= u*ones(1,m+1)+(g_x*ones(1,m+1)).*...              (ones(m+1,1)*data(:,1)'-data(:,1)*ones(1,m+1))+...              (g_y*ones(1,m+1)).*(ones(m+1,1)*data(:,2)'-data(:,2)*ones(1,m+1));            (u*ones(1,m+1)).*Pweak >= (ones(m+1,1)*u').*Pweak;    cvx_end    bounds(k,1) = cvx_optval;    fprintf( 1,'%g', round(cvx_optval) );    % Check for u(0.5,0.5) >= u(k)    cvx_begin        variables u(m+1) g_x(m+1) g_y(m+1)        maximize(u(k)-u(m+1))        subject to            g_x >= 0;            g_y >= 0;            ones(m+1,1)*u' <= u*ones(1,m+1) + (g_x*ones(1,m+1)).*...              (ones(m+1,1)*data(:,1)'-data(:,1)*ones(1,m+1))+...              (g_y*ones(1,m+1)).*(ones(m+1,1)*data(:,2)'-data(:,2)*ones(1,m+1));            (u*ones(1,m+1)).*Pweak >= (ones(m+1,1)*u').*Pweak;    cvx_end    bounds(k,2) = cvx_optval;    fprintf( 1,' %g\n', round(cvx_optval) );    endfigure(2);hold off% plot data pt and contour line through itval = 1.1*sqrt(0.5)+ 0.8*sqrt(.5);   % value at centert = linspace(((val-.8)/1.1)^2, 1, 1000);y = ( (val - 1.1*(t.^(1/2)))/.8 ).^2;plot(t,y,'--', [.5 .5], [0 1], ':', [0 1], [.5 .5], ':');axis([0 1 0 1]);hold onfor k=1:m   if bounds(k,2) < 1e-5,  % preferred over (.5,.5)      dot = plot(data(k,1),data(k,2),'o');      %'MarkerSize',8);   elseif bounds(k,1) > -1e-5,  % rejected in favor of (.5,.5)      dot = plot(data(k,1),data(k,2),'o','MarkerFaceColor',[0 0 0]);   else % no conclusion      dot = plot(data(k,1),data(k,2),'square', 'LineWidth',1.0,...           'MarkerSize',10);   end;end;xlabel('x_1');  ylabel('x_2');cvx_quiet(cvxq);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -