今天下午抽空寫了下並行排程演算法的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個這種場景,你會明顯感覺到效果了。