GitXplorerGitXplorer
f

numberpartitioning-cs

public
2 stars
0 forks
0 issues

Commits

List of commits on branch master.
Verified
e94bf397a9c07effcf031be82a0aea8360f6378c

Fix a typo in documentation

ffuglede committed 6 months ago
Unverified
bbaa701e546df83e901a4fa76bac5fba5c7e1f54

Bump version number

ffuglede committed 3 years ago
Unverified
d4de5468512ed52c0953d68beefe6f59a8041f49

Add a .gitattributes to align line breaks

ffuglede committed 3 years ago
Unverified
29840aded3199bfe1e3397f5964288c8e095ae04

Handle invalid part counts and empty inputs

ffuglede committed 3 years ago
Unverified
0cb7aeffb82a0dcbe05f04b43b2a2f9ec9b9d0d8

Enable nullable reference types throughout solution

ffuglede committed 3 years ago
Unverified
50e498602787fb7710dbc3f6b2631eaa40fdfd63

Bump version number

ffuglede committed 3 years ago

README

The README file for this repository.

Partition problem solvers in .NET

This repository includes some pure C# solvers for the multiway number partitioning optimization problem; in particular, the standard greedy algorithm, and the Karmarkar--Karp algorithm.

The problem

Concretely, the problem we solve is the following: Suppose S is some collection of integers, and k is some positive integer, find a partition of S into k parts so that the sums of the integers in each part are as close as possible.

The objective function describing "closeness" is usually taken to be the difference between the largest and smallest sum among all parts. The optimization version is NP-hard, and the bundled algorithms only aim to provide a good solution in short time. This also means that they can be useful for other objective functions such as, say, the variance of all sums.

Installation

The package is available from the public NuGet Gallery.

Example

Suppose we want to split the collect [4, 6, 7, 5, 8] into three parts. We can achieve that as follows:

var numbers = new[] { 4, 6, 7, 5, 8 };
var (partition, sizes) = KarmarkarKarp.Heuristic(numbers, 3);

Here, partition becomes [[4], [0, 3], [1, 2]], the indices corresponding to the elements [[8], [4, 7], [5, 6]], and sizes are the sums of the elements in each part, [8, 11, 11]. This happens to be optimal.

As noted on Wikipedia, an example where this approach does not give the optimal result is the following:

var numbers = new[] { 5, 5, 5, 4, 4, 3, 3, 1 };
var (partition, sizes) = KarmarkarKarp.Heuristic(numbers, 3);

Here, sizes is [9, 10, 11] but it is possible to achieve a solution in which the sums of each part is 10.