按金額平均批量分配訂單演算法思考與實現

2021-08-10 04:01:48 字數 2527 閱讀 8388

最近遇到需要從經理批量分配訂單到主管,主管批量分配訂單到人員,我們只需要設計一種演算法經理到主管(主管到人類似),盡量保證經理分配到主管的訂單的平均金額與資料庫裡面的平均金額相等。我為此設計了兩種演算法如下,僅供參考。

此演算法是先傳入所有組(一組對應乙個主管)需要分配的訂單數,按分配的訂單數從大到小排序,比如a,b,c三組,訂單數為5,3,1。再從資料庫裡獲取一批資料按照訂單金額從高到低排序到乙個list。

比如資料庫裡訂單金額及訂單號為(a99,99)...(a1,1)。第一輪分配先取最大的訂單金額的分配給a,即a擁有a99,b分配到a98,c分配到a97。第二輪分配最小值,a分配a1,b分配a2,第三輪分配最大值,即a分配a96,b分配a95,以此類推。

int unallocated = collectionservice.findallunabsorbedcollectioncount(collectionvo);

int assigncount = 0;

for(groupinforecord groupinforecord : req.getgroupinforecord())

if(unallocated < assigncount )

collectionvo.setcollectionnum(assigncount);

//部門分配到組

// 查出分配的訂單id

listcollectionidlist = collectionservice.findgroupassigncollectionid(collectionvo);

linkedlistlinkedlist = new linkedlist(collectionidlist); //把list轉為linkedlist,方便對頭尾進行操作

int listsize = linkedlist.size();

//先把組進行排序,按照訂單量從高到低排序

mapmap = new treemap<>(); //key:人員id value: 分配訂單數

for(groupinforecord groupinforecord : req.getgroupinforecord())

//將我們得到的map按照金額降序排列

// 將map.entryset()轉換成list,該list已經按照訂單數從大到小排序

list> list = new arraylist<>(map.entryset());

//降序排序

collections.sort(list, (o1, o2) -> o2.getvalue().compareto(o1.getvalue()));//這裡可轉為lambda表示式

// requestnum 代表頁面提交的數目 requestget表示陣列當前已經變化的數值 groupids存放的是requestnum數目對應的人員id

int requestnum = new int[map.size()];

int requestget = new int[map.size()];

string groupids = new string[map.size()];

int j = 0;

//給人員id以及對應的數目賦值

j++;

}boolean requestgetflag = new boolean[map.size()]; //初始化代表每個組的值都為true,如果該組數目滿足要求,則置為false,下一輪不再分配

int index = 0; //代表在某一輪分配中分配給第index+1組

for (int i = 0; i < map.size(); i++)

boolean flag;

int odd = 0;

while (linkedlist.size() > 0 && assigncount > 0 )

if(requestgetflag[index] && flag) else

po = collectionservice.getbyid(linkedlist.get(collectionno).getcollectionid());

system.out.println("\n\n*************\n此次分配的訂單id為:" + linkedlist.get(collectionno).getcollectionid() + "\n分配給:" + groupids[index] + "\n***********\n\n");

if(odd == 1) else

flag = false;

if (requestget[index] == requestnum[index])

requestgetflag[index] = false;

index ++;

if(index > map.size() - 1)

break;

}index ++;

if(index > map.size() - 1)

}}

此演算法算是比較簡單的一類,乙個蘿蔔乙個坑往裡填,但是實現起來還是很複雜。對於資料庫中存有的資料離散性有一定要求,最好是訂單金額的中位數等於或接近平均數。

平均分配演算法

平均分配有2種情況 1 都沒有記錄的時候,平均分配。若11個元素,4個cpu,則分配數量為 2,3,3,3 每次分配的起點終點表示區間為 list seqno taskcounters,list seqno 1 taskcounters 11個數,平均分給4個cpu header content t...

多訂單多支付方式分配金額問題

算是個面試題吧,問題描述是這樣 多個業務訂單,對應乙個支付單進行支付,支付時使用了組合支付。那麼沒個訂單分配到的支付方式及金額如何計算。一共三個支付方式組合a,b,c金額分辨佔100,100,80.一共兩個訂單1訂單金額80,2訂單金額200.分配後,產生4份訂單和支付方式不同的資料。畫個圖明了一點...

城際網約車訂單分配問題及其求解演算法

城際網約車訂單分配問題是訂單分配問題的一種,它主要是為了解決特定城市之間的個性化出行難題。在城際網約車服務中,訂單分配問題是指在滿足一定的約束條件和特定城市之間的客戶出行需求的情況下,對從某個城市出發到達目標城市的一系列客戶訂單安排合理的接送路線,從而減少車輛的空載率,縮短客戶的等待時間,減少司機的...