HPCC2025/GA/use_ga.py

94 lines
3.1 KiB
Python
Raw Normal View History

2025-04-12 22:55:01 +08:00
import random
import math
import yaml
import numpy as np
from utils import if_valid_partition, GA_solver
from itertools import product, combinations
import json
from tqdm import tqdm
np.random.seed(42)
random.seed(42)
best_T = float('inf')
best_solution = None
best_row_boundaries = None
best_col_boundaries = None
# ---------------------------
# 需要修改的超参数
# ---------------------------
params_file = 'params_50_50_3'
with open(params_file + '.yml', 'r', encoding='utf-8') as file:
params = yaml.safe_load(file)
H = params['H']
W = params['W']
k = params['num_cars']
flight_time_factor = params['flight_time_factor']
comp_time_factor = params['comp_time_factor']
trans_time_factor = params['trans_time_factor']
car_time_factor = params['car_time_factor']
bs_time_factor = params['bs_time_factor']
flight_energy_factor = params['flight_energy_factor']
comp_energy_factor = params['comp_energy_factor']
trans_energy_factor = params['trans_energy_factor']
battery_energy_capacity = params['battery_energy_capacity']
# # 定义数字列表
# numbers = [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
row_cuts_set = [[0.3, 0.48, 0.77]]
col_cuts_set = [[0.5]]
for row_cuts in row_cuts_set:
for col_cuts in col_cuts_set:
row_boundaries = [0.0] + list(row_cuts) + [1.0]
col_boundaries = [0.0] + list(col_cuts) + [1.0]
# 这里面的距离不再是比例,而是真实距离!
rectrangles = if_valid_partition(
row_boundaries, col_boundaries, params)
if not rectrangles:
continue
else:
# 使用遗传算法求出每一种网格划分的可行解,然后选择其中的最优解
current_solution, current_time, to_process_idx = GA_solver(
rectrangles, params)
if current_time < best_T:
best_T = current_time
best_solution = current_solution
best_row_boundaries = row_boundaries
best_col_boundaries = col_boundaries
# 将best_solution分解成每个车队的路径
found_start_points_indices = []
for i in range(len(best_solution)):
if best_solution[i] in to_process_idx:
found_start_points_indices.append(i)
car_paths = []
for j in range(len(found_start_points_indices) - 1):
from_index = found_start_points_indices[j]
end_index = found_start_points_indices[j + 1]
car_path = []
for k in range(from_index, end_index + 1):
rectrangle_idx = best_solution[k]
if rectrangle_idx not in to_process_idx:
car_path.append(rectrangle_idx - 1)
if car_path:
car_paths.append(car_path)
# 输出最佳方案
print("Best solution:", best_solution)
print("Time:", best_T)
print("Row boundaries:", best_row_boundaries)
print("Col boundaries:", best_col_boundaries)
print("Car Paths:", car_paths)