作者teemocogs (teemo)
看板Soft_Job
標題[討論] 配對問題(演算法設計)
時間Sat Jan 17 01:30:04 2015
※這不是UVA(ACM)題目
※這篇文章適合喜歡分析與研究解決方案或是市場設計的你
※如果你喜歡用程式解決問題,很高興我們能一起討論
※如果板主覺得本討論偏離板旨,請見諒,我可以自行刪除
緣起:
之前有辦過一些網友與鄉民的活動,像是交換名片與交換節慶卡片,我有遇到
一些問題,逐步的用程式或免費方案解決,但仍然無法做到完全自動或全面交
由程式代勞,所以想說做一次需求分析,然後把現有的解決方案跟大家分享,
而整個需求中,目前無法達到程式代勞完成的部分提出來看看有沒有好點子。
--
■活動設計的規則與限制:
▲[報名]
A1.自由報名,人數未定,無上限
A2.每個人自由1~5張
A3.需要能填寫基本表單
A4.報名開始與截止(開關)
A5.生成獨有唯一的驗證碼序號
A6.檢查PTT ID 是否存在
▲[配對]
B1.收件人與寄件人不能是互寄,也不能是自己互寄
B2.總數量要平均分配,餘數隨機,
但任意兩人之間不得比另一人多收兩張,即(|A收-B收|<2)
B3.生成可查閱的總表
B4.生成站內信寄送指令
--
▲[回報]
C1.寄件人登錄寄信時間
C2.收件人登錄收信時間
C3.查詢收件人是否收到
C4.查詢寄件人是否寄出
C5.總表
▲[進階]
D1.配對結束後,有人提出數量調整(增加或減少),找最小衝擊人數解法
D2.配對結束後,有人取消自己的報名
D3.國外地址特別安排配對
--
■現況:
[報名]
A1.~A4.表單,這部分完全不需要寫程式,google表單就可以做到,免費。(PASS)
A5.這google 試算表可以生成,免費。(PASS)
A6.目前有不是很聰明的比對程式(Client端)可以確認帳號是否存在,之所以會需
要確認帳號是否存在,是因為google表單可以亂填,雖然!雖然可以用google
帳號擋重複報名,但出發點是以PTT板友為主,所以不進行google帳號驗證。
所以沒有google帳號也可以報名,只以有PTT ID作為查核條件。
//------------------------------------
[配對]噩夢的開始
基本上目前寫的程式算是暴力法配對,先亂數隨機,
然後檢查是否符合規則B1.收件人與寄件人不能是互寄,也不能是自己互寄
這問題困難的地方是,每個人自由1~5張,在不能牴觸B1,又不能牴觸B2的
情況下,複雜度度很高,我不知道演算法如何設計為佳...
…
B3.目前的解決方案是用google試算表作為免費資料庫,障蔽部分ID欄位後
,配合先前用 PTT_ID站內信寄給所有參加者的驗證碼序號當作條件,讓知
道查詢網址的人能查詢活動目前進度。
網頁放在Google Drive然後用Javascript撈google試算表,所以免費。
…
B4.基本上 BBS都是下指令,所以只是將寄站內信行為化作腳本指令集,然
後排程將指令送出,這已有獨立程式完成。
//------------------------------------
[回報]
C1~C5. 這都可以使用google表單就可以做到,免費。(PASS)
//------------------------------------
[進階]
D1~D2.配對結束後,基本上不論是完全退出配對或是增/減數量,都希望仍
然能寄可能的保持B1.B2的條件,當然如果勢必會有衝擊,找最小衝擊人數
解法是最好的,不過目前都是我人工處理善後,所以這暫時也無程式解。
不過我也算運氣好,之前一個跟我說要出差出國退出配對,馬上有人自願
補上配對空缺,這樣我要通知的人就單純許多了。
D3.目前沒有方法特別綁定mapping的對象,有些人願意出寄國外郵資,有
些人願意從國外寄回來,雖然說這算是以服務導向為出發,但實際上在沒
有程式解的情況下,目前都是人工處理。
--
我想現在我主要的問題都是卡在配對機制的設計
如果我能整套串起來,希望可以搞一個open source的project
--
編程生活,生活編程
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.228.249.244
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1421429406.A.7A2.html
→ x000032001: 有個矛盾點是 假設只有三個人玩 A3張 BC都1張 01/17 01:44
→ x000032001: 那就無解了吧 所以還不能太少人玩.. 01/17 01:45
推 ProGuy: google一下max flow演算法,條件設定好之後跑一下就有了 01/17 14:34