|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
问题(来源《全日制普通高中地方选修教材 数学模型》):甲乙丙三人经商,若单干,每人获利1元;甲乙合作获利7元;甲丙合作获利5元;乙丙合作获利4元;三人合作获利10元,三人合作时应如何分配10元收入?
我把这道题用EXCEL建模解答,并对合作的人数作了自由扩充,以达到通用解题的目的。
首先,新建一个EXCEL工作簿,建三个表,分别取名“列全集”,“合作利益”,“利益分配”。
”列全集“表的主要功能是把合作者的所有组合列出来。
参与合作的人名在第二行列出来,A4单元格输入公式”=IF((ROW()-3-2^COUNTA($2:$2))<=0,ROW()-4,"已完成")“,目的是列所有子集的序号,B4单元格将序号转成二进制,C4单元格将二进制转换成合作人数的宽度,为后面的提取数值作准备。
D4单元格,键入公式”=IF(COLUMN()>(COUNTA($2:$2)+3),"已完成",IF(MID($C4,COLUMN()-3,1)="0","",A$2))“,用MID函数提取左侧单元格的各位值与第二行对应单元格作比较,数值”1”才取值。公式输入后,右拉复制至“已完成”
选中A4:G4,下拉复制至出现“已完成”
选中A4:F11,复制,打开“合作利益”表在A2单元格上右键,选择性粘贴-数值。
D2单元用PHONETIC函数把前面单元格内容合并起来,并下拉复制至D9,在E列填入相应的利益值
辅助列用公式把后面要计算的参与者(此处是“甲”)所在的行号标出来,没参与的用一个大负数标注。
在“利益分配”表中,用书中所提到的Shapley值方法计算。
在B1输入要计算的参与者的名(此处为“甲”)
B2公式键入“=INDEX(合作利益!$D:$D,MATCH(LARGE(合作利益!$F:$F,COLUMN()-1),合作利益!$F:$F,0),0)”,在通进右拉复制,把有“甲”参与全部组合列出来
B3单元格用SUMIF函数把有B2单元格,有甲参与的利益(就在“合作利益”表中取值过来)
B4单元格“=SUMIF(合作利益!$D:$D,SUBSTITUTE(B2,$B$1,""),合作利益!$E:$E)”,用SUBSTITUTE函数把B2单元格中的“甲”去掉,也同样使用SUMIF函数,这样结合把无“甲”参与的利益取值过来。
B5单元格等前二个单元格的差值,即“甲”对合作贡献。
人数比较简单,用LEN函数取得,
加权因子则按公式“=FACT(B6-1)*FACT(MAX($B6:$E6)-B6)/FACT(MAX($B6:$E6))”写入
最后选中B2:B8,向右拖动复制至无有效数值,此处SUM(B8:E8),即为本题的答案。
在解其他题目,请作相应的修改。
|
评分
-
1
查看全部评分
-
|