parent
17c21382c5
commit
2dc66696f9
@ -0,0 +1,90 @@
|
||||
# MIPLearn, an extensible framework for Learning-Enhanced Mixed-Integer Optimization
|
||||
# Copyright (C) 2019-2020 Argonne National Laboratory. All rights reserved.
|
||||
# Written by Alinson S. Xavier <axavier@anl.gov>
|
||||
|
||||
import numpy as np
|
||||
import pyomo.environ as pe
|
||||
from miplearn import Instance
|
||||
import random
|
||||
|
||||
|
||||
class TravelingSalesmanChallengeA:
|
||||
"""Fixed set of cities, small perturbation to travel speed."""
|
||||
def __init__():
|
||||
self.generator = TravelingSalesmanGenerator(speed=uniform(loc=0.9, scale=0.2),
|
||||
x=uniform(loc=0.0, loc=1000.0),
|
||||
y=uniform(loc=0.0, loc=1000.0),
|
||||
pn=0.0,
|
||||
n=randint(low=100, high=100),
|
||||
fix_cities=True)
|
||||
|
||||
def get_training_instances():
|
||||
return self.generator.generate(500)
|
||||
|
||||
def get_test_instances():
|
||||
return self.generator.generate(100)
|
||||
|
||||
|
||||
class TravelingSalesmanGenerator:
|
||||
"""Random generator for the Traveling Salesman Problem.
|
||||
|
||||
The generator starts by randomly selecing n points with coordinates (x_i, y_i), where n, x_i
|
||||
and y_i are random variables. The time required to travel from a pair of cities is calculated
|
||||
by: (i) computing the euclidean distance between the cities, (ii) sampling a random variable
|
||||
speed_i, (iii) dividing the two numbers.
|
||||
|
||||
If fix_cities is True, the cities and travel times will be calculated only once, during the
|
||||
constructor. Each time an instance is generated, however, each city will have probability pv
|
||||
of being removed from the list. If fix_cities if False, then the cities and travel times will
|
||||
be resampled each time an instance is generated. The probability pn is not used in this case.
|
||||
|
||||
All random variables are independent.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
speed=uniform(loc=0.75, scale=0.5),
|
||||
x=uniform(loc=0.0, loc=1000.0),
|
||||
y=uniform(loc=0.0, loc=1000.0),
|
||||
pn=0.0,
|
||||
n=randint(low=100, high=100),
|
||||
fix_cities=True):
|
||||
"""Initializes the problem generator.
|
||||
|
||||
Arguments
|
||||
---------
|
||||
speed: rv_continuous
|
||||
Probability distribution for travel speed.
|
||||
x: rv_continuous
|
||||
Probability distribution for the x-coordinate of each city.
|
||||
y: rv_continuous
|
||||
Probability distribution for the y-coordinate of each city.
|
||||
pn: float
|
||||
Probability of a city being removed from the list. Only used if fix_cities=True.
|
||||
n: rv_discrete
|
||||
Probability distribution for the number of cities.
|
||||
fix_cities: bool
|
||||
If true, cities will be resampled for every generated instance. Otherwise, list of
|
||||
cities will be computed once, during the constructor.
|
||||
"""
|
||||
pass
|
||||
|
||||
def generate(self, n_samples):
|
||||
pass
|
||||
|
||||
|
||||
class TravelingSalesmanInstance(Instance):
|
||||
"""An instance ot the Traveling Salesman Problem.
|
||||
|
||||
Given a list of cities and the distance between each pair of cities, the problem asks for the
|
||||
shortest route starting at the first city, visiting each other city exactly once, then
|
||||
returning to the first city. This problem is a generalization of the Hamiltonian path problem,
|
||||
one of Karp's 21 NP-complete problems.
|
||||
"""
|
||||
|
||||
def __init__(self, n_cities, distances):
|
||||
assert isinstance(distances, np.array)
|
||||
assert distances.shape == (n_cities, n_cities)
|
||||
self.n_cities = n_cities
|
||||
self.distances = distances
|
||||
pass
|
||||
|
Loading…
Reference in new issue