Это NP-полная задача, поэтому существует более одного решения. Один из подходов, о котором я подумал, - это сначала поместить более крупные предметы, а затем поместить более мелкие, где у вас будет больше места.
let items = [
{'id': '1', 'size': 10},
{'id': '2', 'size': 4},
{'id': '3', 'size': 6},
{'id': '4', 'size': 21},
{'id': '5', 'size': 2},
{'id': '6', 'size': 1},
{'id': '7', 'size': 6},
{'id': '8', 'size': 7},
{'id': '9', 'size': 8},
{'id': '1', 'size': 13}
];
//sort the array by size in reverse order
items.sort((a, b)=> b.size - a.size);
//array of sums
let sums = [0,0,0];
//final array of 3 arrays
let arrays = [[],[],[]];
for (let item of items) {
//get index of the smallest sum
let index = sums.indexOf(Math.min.apply(null,sums));
//add current item size to corresponding sum
sums[index] += item.size;
//add item to corresponding array
arrays[index].push(item);
}
console.log(arrays);
console.log(sums);
Две вещи.
Во-первых, заставьте Имя класса запуститься с Прописной буквы. Это является более стандартным и легче читать.
Что еще более важно, в stackless_accept
функция Вы накапливаете a list
из Sock
объекты, названные sockets
. Этот список, кажется, растет бесконечно. Да, у Вас есть a remove
, но это не всегда вызывается. Если сокет получает ошибку, то кажется, что это оставят в наборе навсегда.