Make MultiKnapsackGenerator return data class

master
Alinson S. Xavier 4 years ago
parent b0d63a0a2d
commit 03e5acb11a
No known key found for this signature in database
GPG Key ID: DCA0DAD4D2F58624

@ -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)

Loading…
Cancel
Save