Skip to main content

multi_dimensional_knapsack

Function multi_dimensional_knapsack 

Source
pub fn multi_dimensional_knapsack(
    values: &[f64],
    weights: &[Vec<f64>],
    capacities: &[f64],
) -> OptimizeResult<f64>
Expand description

Solve the multi-dimensional 0-1 knapsack problem.

Maximizes sum(values[i] * x[i]) subject to:

  • For each dimension d: sum(weights[d][i] * x[i]) <= capacities[d]
  • x[i] in {0, 1}

Uses a branch-and-bound algorithm with a greedy LP upper bound.

§Arguments

  • values – item values (non-negative), length n
  • weightsd × n weight matrix; weights[d][i] is the weight of item i in dimension d
  • capacities – length-d capacity vector

§Returns

The maximum total value achievable.

§Errors

Returns OptimizeError::InvalidInput on invalid dimensions or negative inputs.

§Example

use scirs2_optimize::integer::knapsack::multi_dimensional_knapsack;

// 3 items, 2 dimensions
let values  = vec![10.0, 6.0, 5.0];
let weights = vec![
    vec![2.0, 3.0, 1.0],  // dimension 0 weights
    vec![4.0, 1.0, 2.0],  // dimension 1 weights
];
let capacities = vec![5.0, 6.0];
let val = multi_dimensional_knapsack(&values, &weights, &capacities).expect("valid input");
assert!(val >= 15.0 - 1e-6);