2013年认证杯SPSSPRO杯数学建模
利润最大目标规划
D题 杨阿姨的困惑
原题再现:
杨阿姨每天上午在家中做好包子,下午在所住小区的大门外贩卖,晚上到另一个小区陪孙子。杨阿姨每天为一件事纠结:不知道该做多少包子。包子的成本是 2 角钱,一般卖 5 角钱一个,如果包子做多了,到了距离晚上还有半个小时的时候包子还没有卖完,杨阿姨就必须降价处理,按 3 个包子 1 元钱销售;到了晚上包子仍有剩余就只能免费送人处理。但是如果包子做少了,不够卖,又会造成一定的利润损失。现在杨阿姨向你请教,每天应该做多少包子?
第二阶段问题:
问题 3 最近一个月,包子的成本上涨了 10%,为了能够帮助杨阿姨更加准确的把握市场,需要进行较为详细的市场调查,目的是确定包子的售价和处理价是否需要进行调整。请你设计一个合理易行的市场调查方案,以获得足够的数据来分析市场的规律。并指出当成本变动时应当如何改变定价以进行应对。
整体求解过程概述(摘要)
本文研究做包子的售价最优问题。
建立模型分为两步,第一步为设计市场调查方案,收集所需数据条件。第二步为运用这些条件进行模型的建立,对杨阿姨如何确定两个时段的售价,以获得最大收益作出讨论,并根据这些条件给出一个确定售价的最佳方案。我们形成了两种不同的思路:
思路 1:杨阿姨不能不断改变售价以获得实际数据,所以只能询问调查对象心理价位。研究对象为调查问卷所得结果,调查结果的主体为不同调查对象的心理价位,假设这些心理价位是受到各种因素影响后的数据,具有广泛的代表性,从中可以研究出售价 与需求量的关系。经过验证,我们使用了反比例函数拟合了一个购买概率与心理价位与实际售价的差值的函数,称其为 f(x) ,代表的意义为当(心理价位 - 实际售价)= x0 时,此调查对象购买包子的概率为 f(x0),并通过此函数模拟求解出售价与需求量关系,最终完成模型的求解。
思路 2: 杨阿姨可以不断改变售价以获得实际数据。 杨阿姨的包子成本发生了变化,那么我们觉得有必要改变价格,所以制定了这样的大体思路:根据经济学中的价格模型进行证明,价格变化会不断接近市场的均衡价格。然后利用一个月的市场实验,获得人们需求和供应量在不同的单价时的具体平均数。获得供需函数的交点,确定均衡价格,然后再根据超需求函数来检验价格范围内的市场稳定性,从而将交点上的单价确定为市场内获得的均衡价格。两种思路最终得到的结果十分相似,说明互为印证,两种模型具有较高的实用性和可行性。
问题分析:
第二阶段的问题与第一阶段的问题的区别在于成本价的上升和售价成为了变量,可以在建模过程中调整售价以求更大的收益。而且,取得条件和数据的方法,变成了设计调查方案,这决定了我们所提出的问题要能在实际调查过程中得出,加大了我们建立模型的难度。
思路一:显然,本题中能调整的变量是价格,所以关键是要找到价格和销售量的关系。但这很难在实际调查中得出,因为我们不能要求杨阿姨不断调整售价,来采集实际数据,因为杨阿姨卖包子售价本身已经十分低廉,即使是小的调整,就比例而言也较大,所以如果要求杨阿姨调整售价,会对经营产生不好的影响。所以经过讨论与资料收集,我们提出一个心理价位的概念,心理价位表示调查对象所认为的包子的价值,简单的说是调查者觉得一个包子值多少钱。根据生活经验,当包子的价格低于心理价位的时候,调查对象购买包子的概率较大,当包子的价格高于心理价位时,调查对象购买包子的几率就较小。这个概率可以构造成一个关于 心理价位-售价 的函数,我们将其定义为f(x),这就是我们模型的核心函数。
思路二:本题中能调整的变量是价格,所以关键是要找到价格和销售量的关系成本的上涨反映了市场的波动,物价会对消费者的购买量产生一定影响,所以我们通过改变售价以获得实际数据, 对数据进行分析, 找出市场均衡价格周围稳定性较高的定价区域,从而确定方案。两种思路产生于对于前提不同的假设,即杨阿姨是否能够通过不断改变售价来获得实际市场信息。我们希望通过两种思路的分别实践,以达到互相印证、互相补充的效果。
模型假设:
1 生产者只生产一致的商品,就是包子。
2 存在大量的独立的消费者和生产者。
3 不存在大量购买,如一次上千只的情况。
4 销售和购买的双方充分了解成本与购买价格。
5 杨阿姨的制作能力有限,当利润加大时,杨阿姨会加大生产量,但是到达杨阿姨的 能力极限时,又会慢慢地降低她的供应数量。
论文缩略图:
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可
部分程序代码:(代码和文档not free)
var jj,i,j,tt,ans:longint;
a,b,c:array[1..100] of longint;
k,pp1,pp2,ppp1,ppp2,t,x1,x2,p1,amount,p2:real;
function f(x:real):real;
begin
if x>0 then
f:=(1/(5*x+2)+1)*k
else f:=(1/(20*x2))*k;
end;
begin
assign(output,'data.txt');
rewrite(output);
k:=0.35;
a[1]:=44; b[1]:=24; c[1]:=20;
a[2]:=89; b[2]:=47; c[2]:=42;
a[3]:=157; b[3]:=130; c[3]:=27;
a[4]:=143; b[4]:=129; c[4]:=14;
a[5]:=70; b[5]:=64; c[5]:=6;
a[6]:=42; b[6]:=36; c[6]:=6;
a[7]:=11; b[7]:=9; c[7]:=2;
a[8]:=4; b[8]:=4; c[8]:=0;
for i:=560 to 30000 do
begin
for j:=1 to 8 do
begin
x1:=(j*0.1+0.20.5);
x2:=(j*0.1+0.20.3);
p1:=f(x1);
p2:=f(x2);
amount:=amount+b[j]/560*i*p1+c[j]/560*i*p2;
end;
if abs(amount500)<1 then begin writeln(i);ans:=i;break;end;
if ans>0 then break;
amount:=0;
end;
writeln(' a ',' b ',' total a ','total b');
for i:=3 to 10 do
for jj:=3 to i do
begin
amount:=0;
ppp1:=0;
ppp2:=0;
for j:=1 to 8 do
begin
p1:=f((j*0.1+0.2i*0.1));
p2:=f((j*0.1+0.2jj*0.1));
pp1:=b[j]/560*ans;
pp2:=c[j]/560*ans;
ppp1:=ppp1+pp1*p1;
ppp2:=ppp2+pp2*p2;
amount:=amount+(i*0.10.22)*pp1*p1+(jj*0.10.22)*pp2*p1;
end;
writeln(i*0.1:0:2,' ',jj*0.1:0:2,' ',ppp1:0:2,' ',ppp2:0:2);
end;
close(output);
end.
var k1,n,av,min,k,max,av1,av2,j,i,s,num:longint;
ans,p,fst,sec:extended;
a,early,late,free :array[1..1000]of longint;
h,h2:array[1..1000000]of longint;
begin
assign(output,'rando.out');rewrite(output);
randomize;
k:=1;
for i:=1 to 60 do
begin
for j:=k to k(i30)*(i30)+2000 do
h[j]:=i;
k:=j;
end;
k1:=1;
for i:=1 to 30 do
begin
for j:=k1 to k1(i15)*(i15)+900 do
h2[j]:=i;
k1:=j;
end;
read(n,av1,av2);
read(fst,sec);
max:=0;
min:=800;
av:=av1+av2;
for i:=1 to n do
begin
a[i]:=av+h[random(k)]30;
late[i]:=av2+h[random(k1)]15;
free[i]:=random(30);
early[i]:=a[i]late[i]free[i];
if a[i]>max then max:=a[i];
if a[i]<min then min:=a[i];
end;
p:=0;
for i:=min to max do
begin
for j:=1 to n do
begin
p:=pi*0.22;
if i>a[j] then p:=p+early[j]*fst+late[j]*sec
else if i>=early[j] then
begin
p:=p+early[j]*fst;
if i>=early[j]+late[j] then p:=p+late[j]*sec
else p:=p+(iearly[j])*sec;
end
else p:=p+i*fst;
end;
if p>ans then begin ans:=p;num:=i;end;
p:=0;
end;
for i:=1 to n do
s:=s+a[i];
writeln('average: ',s/n:0:4);
write('total: ');
for i:=1 to n do
write(a[i]:5);
writeln;
write('early: ');
for i:=1 to n do
write(early[i]:5);
writeln;
write('late : ');
for i:=1 to n do
write(late[i]:5);
writeln;
write('free : ');
for i:=1 to n do
write(free[i]:5);
writeln;
writeln('maxprofit: ',ans:0:4);
writeln('everyday: ',num);
end