mirror of
https://github.com/ANL-CEEESA/MIPLearn.git
synced 2025-12-06 01:18:52 -06:00
Make MultiKnapsackGenerator return data class
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
# MIPLearn: Extensible Framework for Learning-Enhanced Mixed-Integer Optimization
|
# MIPLearn: Extensible Framework for Learning-Enhanced Mixed-Integer Optimization
|
||||||
# Copyright (C) 2020-2021, UChicago Argonne, LLC. All rights reserved.
|
# Copyright (C) 2020-2021, UChicago Argonne, LLC. All rights reserved.
|
||||||
# Released under the modified BSD license. See COPYING.md for more details.
|
# Released under the modified BSD license. See COPYING.md for more details.
|
||||||
|
from dataclasses import dataclass
|
||||||
from typing import List, Dict, Optional
|
from typing import List, Dict, Optional
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
@@ -13,36 +13,11 @@ from scipy.stats.distributions import rv_frozen
|
|||||||
from miplearn.instance.base import Instance
|
from miplearn.instance.base import Instance
|
||||||
|
|
||||||
|
|
||||||
class ChallengeA:
|
@dataclass
|
||||||
"""
|
class MultiKnapsackData:
|
||||||
- 250 variables, 10 constraints, fixed weights
|
prices: np.ndarray
|
||||||
- w ~ U(0, 1000), jitter ~ U(0.95, 1.05)
|
capacities: np.ndarray
|
||||||
- K = 500, u ~ U(0., 1.)
|
weights: np.ndarray
|
||||||
- alpha = 0.25
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(
|
|
||||||
self,
|
|
||||||
seed: int = 42,
|
|
||||||
n_training_instances: int = 500,
|
|
||||||
n_test_instances: int = 50,
|
|
||||||
) -> None:
|
|
||||||
np.random.seed(seed)
|
|
||||||
self.gen = MultiKnapsackGenerator(
|
|
||||||
n=randint(low=250, high=251),
|
|
||||||
m=randint(low=10, high=11),
|
|
||||||
w=uniform(loc=0.0, scale=1000.0),
|
|
||||||
K=uniform(loc=500.0, scale=0.0),
|
|
||||||
u=uniform(loc=0.0, scale=1.0),
|
|
||||||
alpha=uniform(loc=0.25, scale=0.0),
|
|
||||||
fix_w=True,
|
|
||||||
w_jitter=uniform(loc=0.95, scale=0.1),
|
|
||||||
)
|
|
||||||
np.random.seed(seed + 1)
|
|
||||||
self.training_instances = self.gen.generate(n_training_instances)
|
|
||||||
|
|
||||||
np.random.seed(seed + 2)
|
|
||||||
self.test_instances = self.gen.generate(n_test_instances)
|
|
||||||
|
|
||||||
|
|
||||||
class MultiKnapsackInstance(Instance):
|
class MultiKnapsackInstance(Instance):
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import numpy as np
|
|||||||
from scipy.stats import uniform, randint
|
from scipy.stats import uniform, randint
|
||||||
|
|
||||||
from miplearn import LearningSolver
|
from miplearn import LearningSolver
|
||||||
from miplearn.problems.knapsack import MultiKnapsackGenerator
|
from miplearn.problems.knapsack import MultiKnapsackGenerator, MultiKnapsackInstance
|
||||||
|
|
||||||
|
|
||||||
def test_knapsack_generator() -> None:
|
def test_knapsack_generator() -> None:
|
||||||
@@ -18,17 +18,22 @@ def test_knapsack_generator() -> None:
|
|||||||
u=uniform(loc=1.0, scale=1.0),
|
u=uniform(loc=1.0, scale=1.0),
|
||||||
alpha=uniform(loc=0.50, scale=0.0),
|
alpha=uniform(loc=0.50, scale=0.0),
|
||||||
)
|
)
|
||||||
instances = gen.generate(100)
|
data = gen.generate(100)
|
||||||
w_sum = sum(instance.weights for instance in instances) / len(instances)
|
w_sum = sum(d.weights for d in data) / len(data)
|
||||||
b_sum = sum(instance.capacities for instance in instances) / len(instances)
|
b_sum = sum(d.capacities for d in data) / len(data)
|
||||||
assert round(float(np.mean(w_sum)), -1) == 500.0
|
assert round(float(np.mean(w_sum)), -1) == 500.0
|
||||||
assert round(float(np.mean(b_sum)), -3) == 25000.0
|
assert round(float(np.mean(b_sum)), -3) == 25000.0
|
||||||
|
|
||||||
|
|
||||||
def test_knapsack() -> None:
|
def test_knapsack() -> None:
|
||||||
instance = MultiKnapsackGenerator(
|
data = MultiKnapsackGenerator(
|
||||||
n=randint(low=5, high=6),
|
n=randint(low=5, high=6),
|
||||||
m=randint(low=5, high=6),
|
m=randint(low=5, high=6),
|
||||||
).generate(1)[0]
|
).generate(1)
|
||||||
|
instance = MultiKnapsackInstance(
|
||||||
|
prices=data[0].prices,
|
||||||
|
capacities=data[0].capacities,
|
||||||
|
weights=data[0].weights,
|
||||||
|
)
|
||||||
solver = LearningSolver()
|
solver = LearningSolver()
|
||||||
solver.solve(instance)
|
solver.solve(instance)
|
||||||
|
|||||||
Reference in New Issue
Block a user