2015-10-19 136 views
1

我有一個列表(N ALIST s),我需要將它分成k個相互排斥的集體窮舉列表(不一定必須是相同的長度)。也就是說,我需要一個函數,將做類似如下(爲N = 6,K = 2):隨機分配列表中的元素

(my-function (listA listB listC listD listE listF)) 
#=> ((listA listC listF listD) (listB listE)) 

我思考的方式沿着這些線路(分配數量最多K中去ALIST的每個成員,然後根據他們的任務對這些項目進行分組)。也許這很愚蠢,我不確定。

(defun make-solution (problem) 
    "Generates random initial solution to be later explored" 
    (let ((assignments (mapcar #'(lambda (request) (random *fleet-size*)) problem))) 
    ; maybe something to group back the elements of problem according to their value in assignments? 
    )) 

任何提示什麼填寫?也許更好的方法?對於上下文,我正在做的是隨機創建一個車輛路徑問題的初始羣體,我可以稍後使用本地搜索進行迭代。

回答

3

事情是這樣的,也許:

CL-USER 39 > (pprint 
       (let ((l (loop for i from 1 upto 100 collect i))) 
       (flet ((part (l k &aux (r (make-array k :initial-element nil))) 
         (loop while l 
           do (push (pop l) (aref r (random k)))) 
         (coerce r 'list))) 
        (part l 7)))) 

((98 94 89 87 85 84 78 71 68 53 42 38 35 33 27 26 5 3) 
(93 86 65 55 54 37 23 18 11 10 2) 
(92 91 82 69 67 62 61 59 56 52 44 36 34 22 21 12 7) 
(97 77 76 70 57 47 46 45 43 32 17 14 4) 
(96 95 90 88 83 81 80 73 58 49 48 39 30 25 19 8 6) 
(75 63 60 41 31 24 15 9 1) 
(100 99 79 74 72 66 64 51 50 40 29 28 20 16 13)) 

保留順序:

CL-USER 40 > (pprint 
       (let ((l (loop for i from 1 upto 100 collect i))) 
       (flet ((part (l k &aux (r (make-array k :initial-element nil))) 
         (loop while l 
           do (push (pop l) (aref r (random k)))) 
         (map 'list #'reverse r))) 
        (part l 7)))) 

((6 13 14 22 24 40 44 55 57 58 64 66 67 74 78 92 95 96) 
(7 11 23 26 27 28 81 91) 
(3 5 8 9 10 20 21 33 35 36 42 45 47 63 69 72 75 80 88 89 98) 
(2 16 32 43 53 68 71 76 79 84 87 90 93 94 97) 
(1 4 12 15 18 25 30 39 41 46 48 51 54 59 65 73 83 100) 
(17 19 29 31 34 37 38 49 56 85 86) 
(50 52 60 61 62 70 77 82 99)) 
+1

美麗的,謝謝!順便說一下,你是否在HN上lispm?你(當然還有PG)是我決定開始學習Lisp的原因。爲此非常感謝 ;-) – Guilherme

相關問題