最近接到乙個小專案,是個專做移動電信欠費催收款的律師事務所,求要幫他們做個系統,把每批次的欠費資料平均分配給催收員
(要求每個催收員分到的記錄數和欠費金額都比較公平
),然後等移動電信把提成報表傳過來後再做提成計算就可以了。想想功能不多於是
2k就接下來了。
這個小系統主要的難點是在給催收員的資料分配上,事實上實現起來也不難。我想在分班或者其它有類似需求的系統上也可以用得上。
分平均分配的演算法有很多,如蛇形演算法,貪婪演算法等等。
1、蛇形演算法類似於下面的排序
abcd
1009998
9793949596
92919089
如果拿1-100
的數字來分配當然蛇形演算法最好不過的了,不過移動的欠費資料可不是這樣,金額大的幾萬,小的
0.01
都有,所以這種演算法沒法用。
2、倒序貪婪
(我稱之為倒序貪婪,也不懂該叫什麼
)過程大概是這樣(把
m份資料分配到
n個人的頭上
)1.1
把待分配的資料
m從大到小排序
;1.2
從資料m取出n
份做為初始值分配給
n個人;
1.3 把這n
個人的資料從小到大排序;
1.4
從資料m
再取出n
份資料累加到
n個人的頭上
1.5
重複1.3-1.4
直至資料分配結束
但得出來的結果也不合格,因為得出的金額資料相差太大
3、隨機貪婪
(我稱之為隨機貪婪,也不懂該叫什麼
)過程大概是這樣(把
m份資料分配到
n個人的頭上
)1.1
從資料m
中隨機取出
n份做為初始值分配給
n個人;
1.2 把n
個人的資料從小到大排序;
1.3
從資料m
中隨機再取出
n份資料累加到
n個人的頭上
1.4
重複1.2-1.3
直至資料分配結束
咋一看結果是不錯,但如果在最後幾次分配資料時,出現金額落差比較大時問題就出來了。
不過倒好解決,我們何不先進行幾輪倒序貪婪,把大額度的資料排除,餘下的資料再進行隨機貪婪。這個結果客戶也比較滿意。
**實現:
(原本是打算用
c#做的,但我這個人太懶了,為了圖速度就
asp寫了,要轉為
c#的話,也是很簡單,主要把下面這個函式轉為
c#的語法也就差不多了
)code
『陣列排序
function
sort(ary)
dimkeepchecking,i,firstvalue,secondvalue,firstteam,secondteam
keepchecking
=true
dountil keepchecking
=false
keepchecking
=false
fori =0
toubound
(ary)
ifi
=ubound
(ary)
then
exit
forif
ary(i,0)
>
ary(i+1
,0) then
firstvalue
=ary(i,0)
firstteam
=ary(i,1)
secondvalue
=ary(i+1
,0) secondteam
=ary(i+1
,1) ary(i,0)
=secondvalue
ary(i,1)
=secondteam
ary(i+1
,0) =
firstvalue
ary(i+1
,1) =
firstteam
keepchecking
=true
endif
next
loop
sort
=ary
end function
分配結果:
另:下週打算分離仿
winform
的產品入錄介面**
(支援編號、拼音、產品名稱、條形碼自動完成錄入
)出來給大家
,對開發
web下進銷存或者
crm感興趣的朋友到時候可以一起交流一下。
圖:flash
演示:
平均分配演算法
平均分配有2種情況 1 都沒有記錄的時候,平均分配。若11個元素,4個cpu,則分配數量為 2,3,3,3 每次分配的起點終點表示區間為 list seqno taskcounters,list seqno 1 taskcounters 11個數,平均分給4個cpu header content t...
預約如何實現平均分配
工作當中遇到乙個問題,自己沒有想清楚。寫點文字記錄下來。場景 帶來的問題點 嘗試解決的方法 需要滿足的點 在未來40天之內,每個人分配的任務量是相對平均的。在每一天之內,每個人分配的任務量是相對平均的。其實只要做到第 2 點,自然做到第 1 點嗎?不一定 舉個例子,你每天的工資比我多200塊錢。乙個...
java JTable 列自適應大小(平均分配)
在網上看了一篇jtable自適應列寬的文章,發現設定之後最後一列會留出很長的位置,下面我對這個方法做了適當地修改,能夠平均分配每一列 public void fittablecolumns jtable mytable 將所有列的最大寬度存入陣列i中 i j width int allwidth 0...