clear; clc; close all;
filename = 'D:\快递优化\LogisticsInstance.mat';
if ~exist(filename, 'file')
instance = generate_instance();
save(filename, '-struct', 'instance');
else
instance = load(filename);
end
ga_config = struct(...
'pop_size', 10, ...
'max_gen', 100, ...
'px', 0.9, ...
'pm', 0.1 ...
);
strategies = {
'Strategy1', 'Strategy2', 'Strategy3', 'Strategy4'};
results = cell(4,1);
for s = 1:4
fprintf('正在运行 %s...\n', strategies{
s});
results{
s} = ga_optimizer(instance, ga_config, s);
end
visualize_results(results, strategies);
function instance = generate_instance()
rng(2023);
n_orders = 1000;
address_repeat_rate = 0.02;
vehicle_capacity = 800;
unit_cost = 0.3;
unique_addrs = ceil(n_orders*(1-address_repeat_rate));
addresses = [1:unique_addrs, randi(unique_addrs, 1, n_orders-unique_addrs)];
addresses = addresses(randperm(n_orders));
weights = [randi([1 15], 1, floor(n_orders/2)), randi([16 20], 1, ceil(n_orders/2))];
weights = weights(randperm(n_orders));
time_matrix = rand(n_orders) * 10;
time_matrix = triu(time_matrix) + triu(time_matrix)';
time_matrix(1:n_orders+1:end) = 0;
[~, ~, addr_groups] = unique(addresses);
for k = 1:max(addr_groups)
idx = find(addr_groups == k);
if numel(idx) > 1
time_matrix(idx, idx) = 0;
end
end
tariffs = [0.7, 0.8, 1.0, 0.5, 0.3];
route_costs = [1.0, 0.1, 0.3, 0.5, 0.7];
unit_prices = 0.5 + 0.3*rand(1, n_orders);
instance = struct(...
'n_orders', n_orders, ...
'addresses', addresses, ...
'weights', weights, ...
'time_matrix', time_matrix, ...
'tariffs', tariffs, ...
'route_costs', route_costs, ...
'unit_prices', unit_prices, ...
'vehicle_capacity', vehicle_capacity, ...
'unit_cost', unit_cost ...
);
end
function result = ga_optimizer(instance, config, strategy_id)
pop = randi([1 6], config.pop_size, instance.n_orders);
best_f1 = inf;
best_chrom = [];
history = zeros(config.max_gen, 2);
for gen = 1:config.max_gen
fitness = zeros(config.pop_size