志願匹配演算法開發記錄(三) 實現

2021-10-07 07:56:12 字數 1908 閱讀 8594

思路

首先將所有學生全都分配到第一志願中

找出超員專案中人數最多的專案,按照優先順序隨機抽取該專案中超過專案最大人數的學生分配到下一志願中(為了盡可能平均先從高志願開始下調)

如果本來就是第五志願且被抽中下調就將分配的志願設為-1

迴圈進行2,3兩步,直到所有專案人數達標

最後將分配專案為-1的學生按順序分配到未滿員的專案中

實現**

第一志願分配,並得到第乙個爆滿專案

int maxproject=0;

//最大專案號

int maxprjstunum=0;

//最大專案人數

for(

int i=

0;i)}

迴圈找出爆滿專案並按志願隨機減員
while

(maxprjstunum>projectdata[maxproject][0

])}if

(count==0)

}}int[

] stunum=

newint[6

];system.

arraycopy

(counts,

0,stunum,0,

6); random r=

newrandom()

;int random;

for(

int i=

0;i];i++

)else

if(i+counts[1]

)else

if(i+counts[1]

+counts[2]

)else

if(i+counts[1]

+counts[2]

+counts[3]

)else

if(i+counts[1]

+counts[2]

+counts[3]

+counts[4]

)else

projectdata[maxproject][1

]--;}

maxproject=0;

maxprjstunum=0;

for(

int i=

0;i}

分配無專案學生
for

(int i=

0;i}}

可以直接看出結果並不好,大部分學生都被分配在了第三第四志願,從高志願開始下調看來效果並不好。

修改志願下調次序
for

(int i =

0; i < maxprjstunum - projectdata[maxproject][0

]; i++

)else

if(i < counts[5]

+ counts[4]

)else

if(i < counts[5]

+ counts[4]

+ counts[3]

)else

if(i < counts[5]

+ counts[4]

+ counts[3]

+ counts[2]

)else

if(i < counts[5]

+ counts[4]

+ counts[3]

+ counts[2]

+ counts[1]

)else

projectdata[maxproject][1

]--;}

修改順序後大部分學生都被分配到了第一志願,但不在志願內的學生多了很多,這又是乙個新的缺點,後續再想辦法進行優化

志願匹配演算法開發記錄(四) 小優化

由於跟學校的匹配結果相比,我的演算法得到的分配結果還有比較大的差距,所以進行了一些小小的優化,但是效果並不是很明顯。public static int allocatetherest int studata,int projectdata if allocated false return stud...

Trie Tree匹配演算法實現

問題描述 給定乙個字串集合s 設計並實現乙個演算法,在給定文字中找出這些字串的不連續出現 不連續出現,例如 abdcdshfkajhg 這個文字中就包含了 abc 一些多模式匹配演算法如 ac演算法,wm演算法等,都是去尋找給定的文字中是否包含目標字串,例如在乙個網頁中尋找多個敏感詞。然而,尋找的敏...

實現括號匹配演算法

括號匹配問題 假設乙個算術表示式中包含圓括號 方括號和花括號三種型別的括號,編寫乙個函式,用來判別表示式中的括號是否正確配對,並設計乙個測試主函式。演算法思想 在算術表示式中,右括號和左括號匹配的次序正好符合後到的括號要最先被匹配的 後進先出 堆疊操作特點,因此可以借助乙個堆疊來進行判斷。括號匹配共...