|
|
import numpy as np |
|
|
import argparse |
|
|
import pickle |
|
|
import random |
|
|
import time |
|
|
import os |
|
|
|
|
|
|
|
|
def get_best_solution(n, m, k, site, value, constraint, constraint_type, coefficient, time_limit, obj_type): |
|
|
''' |
|
|
Function Description: |
|
|
Solve the problem using an optimization solver based on the provided problem instance. |
|
|
|
|
|
Parameters: |
|
|
- n: Number of decision variables in the problem instance. |
|
|
- m: Number of constraints in the problem instance. |
|
|
- k: k[i] represents the number of decision variables in the i-th constraint. |
|
|
- site: site[i][j] represents which decision variable the j-th decision variable of the i-th constraint corresponds to. |
|
|
- value: value[i][j] represents the coefficient of the j-th decision variable in the i-th constraint. |
|
|
- constraint: constraint[i] represents the right-hand side value of the i-th constraint. |
|
|
- constraint_type: constraint_type[i] represents the type of the i-th constraint, where 1 represents <=, 2 represents >=, and 3 represents =.. |
|
|
- coefficient: coefficient[i] represents the coefficient of the i-th decision variable in the objective function. |
|
|
- time_limit: Maximum solving time. |
|
|
- obj_type: Whether the problem is a maximization problem or a minimization problem. |
|
|
|
|
|
Return: |
|
|
The optimal solution of the problem, represented as a list of values for each decision variable in the optimal solution. |
|
|
''' |
|
|
|
|
|
raise NotImplementedError('get_best_solution method should be implemented') |
|
|
|
|
|
|
|
|
def optimize( |
|
|
time : int, |
|
|
number : int, |
|
|
): |
|
|
''' |
|
|
Function Description: |
|
|
Based on the specified parameter design, invoke the designated algorithm and solver to optimize the optimization problem in data.pickle in the current directory. |
|
|
|
|
|
Parameters: |
|
|
- number: Integer value indicating the number of instances to generate. |
|
|
- suboptimal: Integer value indicating the number of suboptimal solutions to generate. |
|
|
|
|
|
Return: |
|
|
The optimal solution is generated and packaged as data.pickle. The function does not have a return value. |
|
|
''' |
|
|
|
|
|
|
|
|
for num in range(number): |
|
|
|
|
|
if(os.path.exists('./example/data' + str(num) + '.pickle') == False): |
|
|
print("No input file!") |
|
|
return |
|
|
with open('./example/data' + str(num) + '.pickle', "rb") as f: |
|
|
data = pickle.load(f) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
n = data[1] |
|
|
m = data[2] |
|
|
k = data[3] |
|
|
site = data[4] |
|
|
value = data[5] |
|
|
constraint = data[6] |
|
|
constraint_type = data[7] |
|
|
coefficient = data[8] |
|
|
|
|
|
|
|
|
obj_type = data[0] |
|
|
optimal_solution = get_best_solution(n, m, k, site, value, constraint, constraint_type, coefficient, time, obj_type) |
|
|
|
|
|
|
|
|
variable_features = [] |
|
|
constraint_features = [] |
|
|
edge_indices = [[], []] |
|
|
edge_features = [] |
|
|
|
|
|
for i in range(n): |
|
|
now_variable_features = [] |
|
|
now_variable_features.append(coefficient[i]) |
|
|
now_variable_features.append(0) |
|
|
now_variable_features.append(1) |
|
|
now_variable_features.append(1) |
|
|
now_variable_features.append(random.random()) |
|
|
variable_features.append(now_variable_features) |
|
|
|
|
|
for i in range(m): |
|
|
now_constraint_features = [] |
|
|
now_constraint_features.append(constraint[i]) |
|
|
now_constraint_features.append(constraint_type[i]) |
|
|
now_constraint_features.append(random.random()) |
|
|
constraint_features.append(now_constraint_features) |
|
|
|
|
|
for i in range(m): |
|
|
for j in range(k[i]): |
|
|
edge_indices[0].append(i) |
|
|
edge_indices[1].append(site[i][j]) |
|
|
edge_features.append([value[i][j]]) |
|
|
|
|
|
with open('./example/sample' + str(num) + '.pickle', 'wb') as f: |
|
|
pickle.dump([variable_features, constraint_features, edge_indices, edge_features, optimal_solution], f) |
|
|
|
|
|
def parse_args(): |
|
|
parser = argparse.ArgumentParser() |
|
|
parser.add_argument('--time', type = int, default = 10, help = 'Running wall-clock time.') |
|
|
parser.add_argument("--number", type = int, default = 10, help = 'The number of instances.') |
|
|
return parser.parse_args() |
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
args = parse_args() |
|
|
|
|
|
optimize(**vars(args)) |