/*
问题:
把n个人分成p组,每组m人。每个人都有k个特性。现在我们只考虑把50个人分成5组,每组10人,每个人都有5个特性:性别,有无工程师背景,是否是国际学生, 有无marketing背景, GMAT成绩。分组的5个标准是:每组要求女性成员小于等于2人,大于等于1人; 国际学生大于等于1人,工程师等于2人。有marketing背景的大于等于2人。每组的GMAT平均成绩等于所有50个学生的平均值。要求分组后,各组都尽可能达到这些要求,如果有些组女性多于2人或小于1人,多的人数或少的人数都要乘以罚金10;如果有些组国际学生小于1人,少的人数乘以罚金5;如果有些组工程师不等于2人,超过或不足的人数都要乘以罚金8。如果有些组有marketing背景的人数小于2人,不足的人数乘以罚金12;每组的GMAT平均成绩多于或少于总平均值的分数都乘以罚金1。分组的目标就是使得这5个目标的总罚金为最小。
分组过程:
(1) 从50个人中随机选一人放入第一组, 然后计算加入剩下49人中的一人后的总罚金,也就是组里只有2个人的罚金,然后按罚金从小到大排序成一队,在队列的前40%中随机选一个人作为这组中第2个成员。然后再计算加入另外48人中的一人后的总罚金,也就是组里只有3个人的罚金,然后按罚金从小到大排序成一队,在队
列的前40%中随机选一个人作为这组中第3个成员。直到满足人数要求10。在从剩下40人中随机选一人放入第二组,用同样的方法直到把所有的人分成5组。这样就得到一个完整的分组解而且有一个现有的总罚金。
(2)然后每个组中的每一个人都要与其他组的成员交换位置,如果交换后的总罚金小于现有值,就把新的解取代原来的解保存下来。所有的交换结束后就得到第一次循环后的当前最优解。
(3)然后在重新开始以上的步骤,从50个人中随机选一人放入第一组... 再得到一个完整的分组解而且有一个现有的总罚金,交换位置后把产生的解作为目前最优解保存下来。如果这个当前最优解好于第一次循环产生的,就用后来好的解代替原来的目前最优解。这样不断循环,直到循环50次,结束寻找。
把50次循环产生的最优解作为最终的结果。
初始数据:存放在当前目录下的data.txt文件中
1 0 0 1 640
1 1 0 1 710
0 0 0 0 610
1 0 0 0 700
0 0 1 0 670
1 0 0 0 680
0 0 0 0 640
0 0 1 0 630
0 0 0 0 570
0 1 0 1 640
0 0 0 0 670
0 0 0 0 670
0 0 0 0 640
1 0 0 1 610
1 0 0 0 570
0 0 0 0 590
1 0 0 0 650
1 0 0 0 610
0 0 0 0 600
1 1 0 0 650
0 1 0 0 520
1 1 0 1 610
1 0 0 0 650
0 0 0 0 720
1 1 0 1 590
0 0 1 0 660
0 0 0 0 710
1 0 0 1 600
0 0 0 1 610
1 0 0 0 550
0 0 0 0 610
0 0 0 0 570
0 1 1 0 600
0 0 0 0 640
0 0 0 0 720
1 0 0 1 680
0 0 1 0 640
0 0 0 0 700
0 1 0 0 700
0 0 1 0 760
1 1 0 1 630
0 0 0 0 730
1 0 1 0 590
1 0 0 0 680
0 0 0 0 660
0 0 0 0 630
1 1 0 0 610
0 0 0 0 630
0 0 0 0 580
0 1 1 0 640
*/
你的寻优过程,就只是一个贪心而已啊,没有理论支持,你的寻优过程是最优的。
只不过用了50次找最优,造这样看。还不如用遗传算法,或模拟退火算法寻优还好些。
还有你Help什么啊?