今天下午抽空写了下并行调度算法的Java版本,是想把这个思路先实现了,后面改写Python版作为参考,调试这个版本之后,再来写Python版,发现差别还不小。
Java版本的目前支持动态赋值,目前的元素个数是10个,可以根据情况修改,并行度是4,可以根据情况修改。
import java.util.Random;
import java.util.Arrays;
public class Test {
public static void main(String args[]) {
new Test().test();
// int[] array ={96,59,55,34,22,11,7,5,3,2};
// new Test().getMaxIndex(array);
}
public void test(){
System.out.println("test");
int ARRAY_SIZE = 10;
int test_array[] = new int[ARRAY_SIZE];
for (int i = 0; i < ARRAY_SIZE; i++) {
test_array[i] = new Random().nextInt(100);
}
Arrays.sort(test_array);
for (int i = 0; i < ARRAY_SIZE; i++) {
System.out.println(test_array[i]);
}
int GRP_NO = 4;
int array_group[][] = new int[GRP_NO][ARRAY_SIZE];
int array_sum_group [] = new int[GRP_NO];
for (int i = 0; i < GRP_NO; i++) {
array_group[i][0] = test_array[ARRAY_SIZE - i - 1];
array_sum_group[i] = test_array[ARRAY_SIZE - i - 1];
System.out.println("init value :"+array_sum_group[i]);
}
int min_grp_no = 0;
int max_index = 0;
for (int i = ARRAY_SIZE-GRP_NO-1 ; i >= 0; i--) {
//get min array group index
System.out.println("new value:"+test_array[i]);
min_grp_no = getMinGrpNo(array_sum_group);
max_index = getMaxIndex(array_group[min_grp_no]);
array_group[min_grp_no][max_index+1] = test_array[i];
array_sum_group[min_grp_no] += test_array[i];
System.out.println(array_group[min_grp_no][max_index+1]+","+array_group[min_grp_no][max_index]+","+array_sum_group[min_grp_no]);
}
System.out.println(array_group);
}
public int getMinGrpNo(int[] array) {
int temp_value = 0;
int min_index = 0;
if(array.length>1) {
temp_value = array[0];
for (int i = 1; i < array.length; i++) {
if (temp_value > array[i]) {
temp_value = array[i];
min_index = i;
}
}
}
System.out.println("getMinGrpNo:"+min_index+" value:"+temp_value);
return min_index;
}
public int getMaxIndex(int[] array) {
int temp_value = 0;
int max_index = 0;
if(array.length>1) {
temp_value = array[0];
for (int i = 1; i < array.length; i++) {
if(array[i] != 0) {
if (temp_value > array[i]) {
temp_value = array[i];
max_index = i;
}
}
}
}
System.out.println("getMaxIndex:"+max_index+" value:"+temp_value);
return max_index;
}
}
程序的执行结果如下,整体的思路是生成随机数的数组,然后对数组排序,然后对数组做数据处理,每次添加新元素都需要对每组累计值做一个排序,累计值最小的可以添加新的元素,直至元素被添加完。
所以自己在逻辑的部分写了两个函数来单独处理:
一个是得到累计值最小的数组,得到数组的下标
另外一个是查找数组中元素的最大下标,比如数组有3个元素,那么最大下标就是2(数组从0开始)
test
18
28
31
33
41
57
59
59
79
86
init value :86
init value :79
init value :59
init value :59
new value:57
getMinGrpNo:2 value:59
getMaxIndex:0 value:59
57,59,116
new value:41
getMinGrpNo:3 value:59
getMaxIndex:0 value:59
41,59,100
new value:33
getMinGrpNo:1 value:79
getMaxIndex:0 value:79
33,79,112
new value:31
getMinGrpNo:0 value:86
getMaxIndex:0 value:86
31,86,117
new value:28
getMinGrpNo:3 value:100
getMaxIndex:1 value:41
28,41,128
new value:18
getMinGrpNo:1 value:112
getMaxIndex:1 value:33
18,33,130
当然上面的实现,如果拿10个元素来看,好像意义不大,但是如果是100个,200个这种场景,你会明显感觉到效果了。