lingo子模型——数学模型4.7 例1 广告投入

数学模型4.7 例1 广告投入

书里不断递增广告费上限,并求解各广告费上限约束下的吸引总人数。从两者的关系出发,对多目标规划(广告费希望最少,吸引人数希望最多)进行探讨。

广告费需要取不同数值,一次次手工输入十分麻烦,但如果运用lingo子模型,可以轻松地一次运算出来。

我们可以定义两个子模型,分别代表目标函数和约束条件。

其实子模型有点类似matlab里的函数。

!子模型目标函数:吸引目标人群最多;
submodel people_max:
max=y_sum;
endsubmodel
!子模型约束条件;
submodel sub_constraints:
@sum(media(i):x(i))<=x_sum;!广告费上限约束;
@for(people(j):y(j)=@smin(@sum(media(i):A(i,j)*x(i)),U(j)));
!@for(people(j):y(j)=U(j));!吸引所有潜在人群;
@for(people(j):y(j)>=L(j));!最小数量约束;
y_sum=@sum(people(j):y(j));!总吸引人数;

用for循环对不同的广告费上限进行求解,一共是16次。中间用@solve函数调用前面的两个子模型。(这一段要放在calc里写)

!分别求解不同广告费上限的优化问题;
@for(point(n):x_sum=x_start+(n-1)*x_add;
              @solve(people_max,sub_constraints);!求解子模型;
!记录计算结果;
              x_lim(n)=x_sum;
              y_lim(n)=y_sum;);

完整的代码如下:

model:
sets:
media/1..5/:x;
people/1..7/:y,L,U;
link(media,people):A;
point/1..16/:x_lim,y_lim; !x_lim广告费上限,y_lim对应吸引到的最大人数;
endsets

data:
!广告的效果系数矩阵;
A=
0 10 4 50 5 0 2
0 10 30 5 12 0 0
20 0 0 0 0 5 3
8 0 0 0 0 6 10
0 6 5 10 11 4 0;
!希望吸引的目标人群最小数量;
L=25 40 60 120 40 11 15;
!可能吸引的目标人群最大数量;
U=60 70 120 140 80 25 55;
!广告费上限初值和每次求解的增量;
x_start=6.5; x_add=0.5;
enddata

!子模型目标函数:吸引目标人群最多;
submodel people_max:
max=y_sum;
endsubmodel
!子模型约束条件;
submodel sub_constraints:
@sum(media(i):x(i))<=x_sum;!广告费上限约束;
@for(people(j):y(j)=@smin(@sum(media(i):A(i,j)*x(i)),U(j)));
!@for(people(j):y(j)=U(j));!吸引所有潜在人群;
@for(people(j):y(j)>=L(j));!最小数量约束;
y_sum=@sum(people(j):y(j));!总吸引人数;
endsubmodel

calc:
!系统参数设置;
@set('terseo',1);!只输出简单的求解信息;
@set('stawin',0);!关闭求解状态窗口;
!分别求解不同广告费上限的优化问题;
@for(point(n):x_sum=x_start+(n-1)*x_add;
              @solve(people_max,sub_constraints);!求解子模型;
!记录计算结果;
              x_lim(n)=x_sum;
              y_lim(n)=y_sum;);
!显示所记录的结果;
@write('广告费(万元) 总人数(万人)',@newline(1));!@write函数用于输出结果,@newline即输出新行;
@for(point(n):@write(@format(x_lim(n),'#12.1f'),@format(y_lim(n),'#12.1f'),@newline(1)));
endcalc 

end

在lingo末尾输出这次程序的结果,这里用@format函数保留数据1位小数(这样看起来和书上一模一样= _=)。

最后用matlab画个图看看:

看起来没毛病|ू・ω・` )

  • 2
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值