[算表] 组合加总最佳化

楼主: l3112255 (米米)   2020-03-17 09:33:55
软件:Excel
版本:2016
大大好,有一问题如下
https://imgur.com/nIb49t9
有10位同学(A栏) 他们可以做的伏地挺身数量(B栏)
现在想分三组竞赛,要让他们的竞赛数值平均一点
第一组要3人 第二组3人 第三组4人
有办法让他自动计算如何分组后的加总是最平均的(k2,K4,K6越接近越好)
(从折线图看希望他是平坦一点)
(要知道每一组分别是那些人)(g:j)
再者 折线图有办法利用像是交叉分析筛选器 点选几号同学就自动依组别
加总并画在折线图上吗? 查过资料好像无法
再麻烦大大帮忙 谢谢。
作者: soyoso (我是耀宗)   2020-03-17 12:29:00
想法,宏巢状循环排出组合排列数字(3人),接来3人一样巢状循环(排除前项已排列数字),前面二组3、3都确定了,那剩余的就是4人的部分,接着就是判断加总两两相减abs取正值的最小值组合,这样逻辑来看内文连结的话,第一组1,7,8、第二组4,5,9、第三组2,3,6,10三组加总都是50
楼主: l3112255 (米米)   2020-03-17 15:41:00
好 我再试试看 好难QQ
作者: soyoso (我是耀宗)   2020-03-18 10:26:00
还是要看原po需求,以宏循环的话,也可抓出多取符合最小值的组合,抓出上 https://i.imgur.com/jvRrQtB.jpg 可不只一组,就看看那种方式合适
楼主: l3112255 (米米)   2020-03-18 11:50:00
能请教大概的写法吗? 宏还在学习中
作者: soyoso (我是耀宗)   2020-03-18 14:27:00
以内文10笔来看的想法上巢状循环for 变量a =1 to 8for 变量b = 变量a+1 to 9for 变量c = 变量b+1 to 10nextnextnext以上就是不重复三人一组的部分,执行上就是120次那接着来就是要剔除,举例好了变量a=1,变量b=2,变量c=3也就是1,2,3被归在一组了,那还没有被归在一组有4~10这里的4~10写入阵列,或是字串取代1,、2,、3,后再split到阵列内一样巢状循环,但此时同学剩7位还没有被分配for 变量d =1 to 5for 变量e = 变量a+1 to 6for 变量f = 变量b+1 to 7nexnextnext又会有三个人被归在一组了。这里变量d,e,f都是来对应阵列内的值没有被被归在一组的就是最后4人有了这些归类后,接着就是设个二个变量(变量g[数值]、变量h[文字]),变量g用于判断if回文所述的加总两两相减abs取正值的最小值)来做比较,当最小值小于变量g,then 变量h就写入同学(a栏)的资料;else if 当最小值等于变量g时 then 累加变量h = 变量 & ...资料。变量g不设初始值的话,可能为0,所以初始值方面要设个大点的数值变量h的资料会是(3人、3人、4人)一组,因此分隔符号要设一下,可用于split到储存格大概逻辑是这样,原po如果要二笔以上符合表列的话,可以试试看,有窒碍难行的地方,就提供档案,再来讨论
楼主: l3112255 (米米)   2020-03-18 15:34:00
好的 我在尝试看看 谢谢大大
作者: soyoso (我是耀宗)   2020-03-25 21:00:00
循环大概就是原po这样的写法,变量D、E、F方面也可以用另一个程序sub或是函数function来,将变量A、b、c的数值以外的,如循环执行到A=1,b=2,c=3,那4~10就是传值到另一个程序sub或是function内,目的就是4~10这些数值还有什么可能是三位一组的回文的逻辑是第一个巢状循环来回传不重复三位一组的可能,第二个巢状循环来回传排除第一个巢状的三位(剩七位内)的不重复三位一组的可能,有了这些可能就可以去抓取所对的数量,来判断最佳解。另外宣告变量F方面,所写的位置和宣告的类型要调整一下,位置需在循环变量的上方,类型也非字串
楼主: l3112255 (米米)   2020-03-26 14:48:00
后者抓取所对应数量来判断最佳解要如何撰写呢仅用IF ELSE 要怎么秀出对应的值 好难宣告变量F 我打错了 应该是宣告H 看到头晕
作者: soyoso (我是耀宗)   2020-03-26 17:10:00
最佳解的判断,我是以回文3/17 12:29的方式,两两相减abs取正值的最小值组合;当然循环执行下会有比前数还要更小的值出现,就可以设个变量,当小于前数时写入变量且记录是哪三组资料,那当等于最小值时,再以连接符号&来累加是哪三组,这样循环结束后可以取得多组资料另外每当判断有比之前最小值的出现时,所记录是哪三组资料的变量就要清空,清空方式可写入空字串""
楼主: l3112255 (米米)   2020-04-13 11:43:00
尝试了蛮久还是没试出来orz
作者: soyoso (我是耀宗)   2020-04-13 18:17:00
这要看原po写到目前方面宏是如何写的了
楼主: l3112255 (米米)   2020-04-15 10:12:00
https://imgur.com/4TSbfD0研究很久还是不知道要怎么写QQ可以给个范例吗 还是指导一下 麻烦了QQ
作者: soyoso (我是耀宗)   2020-04-16 13:00:00
连结来看无法提供什么指导,因为判断当小于G,H=cells(2,F),变量G是什么,之后又要有什么作用,上面循环都执行完了,在最后才判断目的是?像这方面的判断都会是在循环内而非在循环结束后才执行
楼主: l3112255 (米米)   2020-04-16 15:41:00
好吧 谢谢大大回复
作者: soyoso (我是耀宗)   2020-04-16 18:33:00
这样说好了,原po知道为什么要设二组巢状循环吗?(第一组)for A=1 to 8...next(第二组)for D=1 to 5...next以下我就以一组、二组来称呼一组A=1,B=2,C=3时这个资讯就要跟二组说目前1,2,3的同学已经被占了那只能抓非1,2,3的名额二组虽然是D=1,E=2(这里原po的宏也是写错的,不是变量A+1,是变量D+1),F=3(错误亦同)这里1,2,3不是指同学1,2,3而是指非1,2,3后的同学4,5,6,7,8,9,10,这不是数值的想法,而是位址的想法所以原po第一步是要先让一组和二组循环内是可以正确回传上述资料第二步才能用该资料所对应的数量来判断,不是直接拿变量A~F,因为A~F不就只是1~10的数值,以这个来判断并不正确另外虽然我03/25 21:00回文变量D、E、F方面用另一个程序sub或是函数function来处理,而原po要以一个程序内来做也可以,就gosub return,设个变量,文字、数字或布林值都行执行二组循环时先判断是否是一组循环gosub来的;不设也行,就一组循环执行完就exit sub就行

Links booklink

Contact Us: admin [ a t ] ucptt.com