利用数学模型以及matlab遗传算法解决校园巴士问题

假设校园内现有10辆公交车,运营时间为早上七点半到晚上10点,每5分钟发一班车, 班车客容量为50人,校园内每日共有3000客流需求,每名乘客盈利1元,司机每日工资200元,每班车每次运行油费1.5元。根据学生需求,利用数学模型,优化车辆数和发车时间,满足学生出行需求且所有巴士收入最高。(麻烦大家给出数学模型,以及可以运行的代码)

基于new bing部分指引作答:
运行结果如下:

img

为了解决校园巴士问题,可以使用数学模型和遗传算法来优化车辆数量和发车时间。下面是一个可能的数学模型和使用MATLAB编写的示例代码。

首先,定义一些参数:

num_buses:公交车数量
capacity:每辆公交车的客容量
total_demand:每天的总客流需求
revenue_per_passenger:每位乘客的盈利
driver_salary:司机的每日工资
fuel_cost:每班车每次运行的油费
start_time:公交车开始运行的时间(分钟)
end_time:公交车停止运行的时间(分钟)
time_interval:发车时间间隔(分钟)
然后,定义以下目标函数:

objective_function:计算每个个体的适应度,即总收入减去总成本。目标是使适应度最大化。
使用遗传算法进行优化:

1、初始化种群:创建一个大小为num_population的随机种群,每个个体表示一组车辆数和发车时间的解决方案。
2、评估适应度:对于每个个体,计算其适应度值。
3、选择:使用选择算子(例如,轮盘赌选择)选择较优的个体进入下一代。
4、交叉:对选择的个体进行交叉操作,生成新的个体。
5、变异:对新个体进行变异操作,引入新的解决方案。
6、更新种群:将新个体加入种群中。
7、重复步骤2-6,直到达到停止条件(例如,迭代次数达到上限)。
8、返回具有最佳适应度的个体作为最优解。
下面是使用MATLAB编写的示例代码:

% 调用优化函数
[best_solution, best_fitness] = optimize_bus_schedule();
disp('最佳解决方案:');
disp(best_solution);
disp('最佳适应度:');
disp(best_fitness);


function [best_solution, best_fitness] = optimize_bus_schedule()
    % 参数设置
    num_buses = 10;
    capacity = 50;
    total_demand = 3000;
    revenue_per_passenger = 1;
    driver_salary = 200;
    fuel_cost = 1.5;
    start_time = 7.5 * 60; % 转换为分钟
    end_time = 22 * 60; % 转换为分钟
    time_interval = 5;

    % 遗传算法参数设置
    num_population = 50;
    num_iterations = 100;
    crossover_rate = 0.8;
    mutation_rate = 0.1;

    % 初始化种群
    population = initialize_population(num_population, num_buses, start_time, end_time);

    % 优化循环
    for iteration = 1:num_iterations
        % 计算适应度
        fitness_values = evaluate_fitness(population, capacity, total_demand, revenue_per_passenger, driver_salary, fuel_cost, time_interval);

        % 选择
        selected_indices = selection(fitness_values);

        % 交叉
        offspring = crossover(population(selected_indices, :), crossover_rate);

        % 变异
        offspring = mutation(offspring, mutation_rate, num_buses, start_time, end_time);

        % 更新种群
        population = [population; offspring];

        % 裁剪种群至原始大小
        population = population(1:num_population, :);
    end

    % 计算最佳解
    fitness_values = evaluate_fitness(population, capacity, total_demand, revenue_per_passenger, driver_salary, fuel_cost, time_interval);
    [best_fitness, index] = max(fitness_values);
    best_solution = population(index, :);
end

function population = initialize_population(num_population, num_buses, start_time, end_time)
    % 随机初始化种群
    population = zeros(num_population, num_buses + 1); % +1 是为了包含发车时间
    for i = 1:num_population
        population(i, 1:num_buses) = randi([0, end_time - start_time], 1, num_buses); % 随机生成发车时间
        population(i, num_buses + 1) = sum(population(i, 1:num_buses)); % 计算最后一辆车的到达时间
    end
end

function fitness_values = evaluate_fitness(population, capacity, total_demand, revenue_per_passenger, driver_salary, fuel_cost, time_interval)
    num_population = size(population, 1);
    fitness_values = zeros(num_population, 1);
    for i = 1:num_population
        solution = population(i, :);
        num_customers = min(floor((solution(end) - solution(1)) / time_interval) * capacity, total_demand);
        revenue = num_customers * revenue_per_passenger;
        cost = sum(solution(1:end-1) > 0) * driver_salary + sum(solution(1:end-1) > 0) * fuel_cost;
        fitness_values(i) = revenue - cost;
    end
end

function selected_indices = selection(fitness_values)
    num_population = length(fitness_values);
    % 轮盘赌选择
    cumulative_fitness = cumsum(fitness_values);
    total_fitness = cumulative_fitness(end);
    probabilities = cumulative_fitness / total_fitness;
    selected_indices = zeros(num_population, 1);
    for i = 1:num_population
        r = rand();
        selected_indices(i) = find(probabilities >= r, 1);
    end
end

function offspring = crossover(parents, crossover_rate)
    num_parents = size(parents, 1);
    num_genes = size(parents, 2);
    offspring = zeros(num_parents, num_genes);
    for i = 1:num_parents
        if rand() < crossover_rate
            % 单点交叉
            crossover_point = randi([2, num_genes - 1]);
            offspring(i, :) = [parents(i, 1:crossover_point), parents(mod(i, num_parents) + 1, crossover_point+1:end)];
        else
            offspring(i, :) = parents(i, :);
        end
    end
end

function offspring = mutation(population, mutation_rate, num_buses, start_time, end_time)
    num_offspring = size(population, 1);
    num_genes = size(population, 2);
    offspring = population;
    for i = 1:num_offspring
        for j = 1:num_genes
            if rand() < mutation_rate
                % 随机变异
                if j <= num_buses
                    offspring(i, j) = randi([0, end_time - start_time]);
                else
                    offspring(i, j) = sum(offspring(i, 1:num_buses));
                end
            end
        end
    end
end

这个代码示例中使用了轮盘赌选择、单点交叉和随机变异作为遗传算法的基本操作。您可以根据需要调整参数和算法操作,以满足特定的优化要求。请注意,此代码示例仅提供了一种可能的实现方式,具体的优化效果可能因问题的复杂性和参数的选择而有所不同。

TechWhizKid参考GPT回答:

简单的计算就行

img

% 定义参数
c = 50;
d = 3000;
p = 1;
w = 200;
f = 1.5;
T = 15*60;

% 定义目标函数
fun = @(x) -(p*min(c*T/x(2), d)*x(1) - (w + f*T/x(2))*x(1));

% 定义约束条件
A = [-c*T, c*T; -1, 0];
b = [-d, -1];
Aeq = [];
beq = [];
lb = [1, 1];
ub = [10, T];

% 使用fmincon函数求解优化问题
options = optimoptions('fmincon','Display','iter','Algorithm','interior-point');
x = fmincon(fun, [10, 5], A, b, Aeq, beq, lb, ub, [], options);

% 输出结果
disp(['最优的公交车数量是:', num2str(round(x(1)))]);
disp(['每辆公交车的发车间隔是:', num2str(round(x(2))), '分钟']);
disp(['每天的总收入是:', num2str(-fun(x)), '元']);
disp(['发车总数是:', num2str(round(T / x(2)))]);

关于变量x的函数,用来计算每天的总收入。约束条件包括线性不等式约束和线性等式约束,用于限制公交车数量和发车间隔的取值范围。

优化问题使用了fmincon函数进行求解,该函数是MATLAB中用于求解有约束的优化问题的工具。通过给定目标函数、约束条件和变量的取值范围,fmincon函数会搜索最优解。

最终,代码输出最优的公交车数量、每辆公交车的发车间隔、每天的总收入和发车总数。

我可以为您提供一个基于遗传算法优化校园巴士运营方案的数学模型和相应的可运行代码。

首先,我们需要定义一些参数和变量: - 假设运行时间段为从早上7点30分到晚上10点,共计14.5小时,每隔5分钟发一班车,共计174个时间槽。 - 假设每辆公交车的客容量为50人。 - 假设每天有3000名乘客需求,每名乘客的盈利为1元。 - 司机的工资为200元。 - 每辆公交车每次运行的油费是1.5元。

接下来,我们可以定义目标函数和约束条件: - 目标函数:最大化总收入,即最大化每个班次乘客的盈利。 - 约束条件: - 每辆公交车每班次的乘客数量不能超过客容量。 - 每辆公交车每天的运行时间不能超过14.5小时。 - 每辆公交车每班次的盈利必须大于司机工资和油费的总和。

然后,我们可以使用遗传算法来优化决策变量,即公交车的数量和发车时间。遗传算法的基本步骤如下: 1. 初始化种群:随机生成一组初始解,代表公交车的数量和发车时间。 2. 评估适应度:根据目标函数计算每个解的适应度,即总收入。 3. 选择操作:根据适应度选择优秀的解作为下一代的父代。 4. 交叉操作:对父代进行交叉操作,生成子代。 5. 变异操作:对子代进行变异操作,引入新的解。 6. 替换操作:用子代替换原有的解。 7. 终止条件:如果达到了停止条件(例如达到最大迭代次数),则停止算法,否则返回第2步。

最后,我们可以使用MATLAB来实现以上步骤的代码。以下是一个简化的示例代码,供您参考:

% 定义参数和变量
bus_capacity = 50;
num_buses = 10;
num_passengers = 3000;
profit_per_passenger = 1;
driver_salary = 200;
fuel_cost = 1.5;

% 定义目标函数
fitness_function = @(x) -calculate_total_profit(x, num_buses, num_passengers, profit_per_passenger, driver_salary, fuel_cost);

% 定义约束函数
constraint_function = @(x) validate_constraints(x, num_buses, num_passengers, bus_capacity);

% 运行遗传算法
options = optimoptions('ga', 'PopulationSize', 50, 'MaxGenerations', 100);
[x, fval] = ga(fitness_function, 2*num_buses, [], [], [], [], zeros(1, 2*num_buses), ones(1, 2*num_buses), constraint_function, options);

% 解码结果
bus_numbers = round(x(1:num_buses));
departure_times = round(x(num_buses+1:end) * 174 * 5); % 将概率值转换为具体时间槽

% 打印最优方案
disp('最优方案:');
for i = 1:num_buses
    disp(['公交车', num2str(i), ':数量=', num2str(bus_numbers(i)), ' 发车时间=', num2str(departure_times(i)*5/60), '小时']);
end

% 计算总收入
total_profit = calculate_total_profit([bus_numbers, departure_times], num_buses, num_passengers, profit_per_passenger, driver_salary, fuel_cost);

% 计算总收入的函数
function total_profit = calculate_total_profit(x, num_buses, num_passengers, profit_per_passenger, driver_salary, fuel_cost)
    bus_numbers = round(x(1:num_buses));
    departure_times = round(x(num_buses+1:end) * 174 * 5);
    total_profit = sum(bus_numbers) * sum(departure_times) * profit_per_passenger - driver_salary * num_buses - fuel_cost * sum(departure_times);
end

% 验证约束条件的函数
function [c, ceq] = validate_constraints(x, num_buses, num_passengers, bus_capacity)
    bus_numbers = round(x(1:num_buses));
    departure_times = round(x(num_buses+1:end) * 174 * 5);
    c = [];
    ceq = [sum(bus_numbers) - num_buses * bus_capacity, sum(departure_times) - num_buses];
end

请注意,上述代码仅是一个示例,可能需要根据您的具体需求进行修改和扩展。此外,该代码中使用了MATLAB的遗传算法优化函数ga,需要确保您的MATLAB版本中包含了该函数。

希望以上代码和说明对您有所帮助!如果您还有任何问题,请随时提问。

该回答引用ChatGPT GPT-4

运行结果

img

代码如下:

%% 初始化参数
start_time = 7.5; % 开始时间, 7:30
end_time = 22; % 结束时间, 22:00
bus_capacity = 50; % 公交车容量
daily_demand = 3000; % 每日客流需求
fare = 1; % 乘客盈利
driver_salary = 200; % 司机每日工资
fuel_cost = 1.5; % 每次运行油费

% 变量范围
min_buses = 5; % 最小公交车数量
max_buses = 15; % 最大公交车数量
min_interval = 3; % 最小发车间隔(分钟)
max_interval = 15; % 最大发车间隔(分钟)

% 为了简化问题,我们假设运行时间内的客流需求是均匀的
demand_per_minute = daily_demand / ((end_time - start_time) * 60);

%% 开始蒙特卡罗搜索
max_profit = -inf;
best_num_buses = 0;
best_interval = 0;

for num_buses = min_buses:max_buses
    for interval = min_interval:max_interval
        % 计算每天的总运行次数
        num_runs_per_day = num_buses * ((end_time - start_time) * 60) / interval;
        % 计算每次运行的客流量
        passengers_per_run = min(bus_capacity, demand_per_minute * interval);
        % 计算收入和成本
        income = num_runs_per_day * passengers_per_run * fare;
        cost = num_runs_per_day * fuel_cost + num_buses * driver_salary;
        % 计算利润
        profit = income - cost;
        % 如果这个利润比我们已经找到的更好,那么就记住它
        if profit > max_profit
            max_profit = profit;
            best_num_buses = num_buses;
            best_interval = interval;
        end
    end
end

%% 输出最优解
fprintf('最优解:\n公交车数量:%d\n发车间隔:%d 分钟\n最大利润:%.2f 元\n', best_num_buses, best_interval, max_profit);


解决校园巴士问题可以使用数学模型和遗传算法来优化车辆数和发车时间,以满足学生出行需求并最大化所有巴士的收入。以下是一个可能的数学模型和示例代码,使用Matlab编程语言实现。

数学模型:

  1. 定义变量:

    • x_i: 第i辆巴士的发车次数
    • t_i: 第i辆巴士的发车时间
  2. 目标函数:
    最大化总收入 Profit = ∑(x_i * 50) - (10 * 200) - (10 * x_i * 1.5)

  3. 约束条件:

    • 所有巴士的发车次数之和等于总需求次数:∑(x_i) = 3000 / 50
    • 所有巴士的发车时间必须在运营时间范围内:7:30 <= t_i <= 22:00
    • 发车时间间隔为5分钟:t_i+1 - t_i >= 5

示例代码(Matlab):

function [x, t, profit] = optimizeBusSchedule()
    % 参数设置
    numBuses = 10;
    startTime = 7.5; % 7:30
    endTime = 22.0; % 22:00
    interval = 5;

    % 遗传算法参数设置
    populationSize = 50;
    numGenerations = 100;
    mutationRate = 0.01;

    % 遗传算法初始化
    population = initializePopulation(numBuses, startTime, endTime, populationSize);
    bestFitness = -Inf;
    bestIndividual = [];

    % 遗传算法迭代
    for generation = 1:numGenerations
        % 评估适应度
        fitness = evaluateFitness(population, numBuses, interval);

        % 选择下一代
        newPopulation = selectNextGeneration(population, fitness, populationSize);

        % 变异
        newPopulation = mutatePopulation(newPopulation, mutationRate, numBuses, startTime, endTime);

        % 更新最优解
        [bestFitness, bestIndex] = max(fitness);
        bestIndividual = population(bestIndex, :);

        % 显示当前最优解
        fprintf('Generation %d: Best Fitness = %.2f\n', generation, bestFitness);

        % 更新种群
        population = newPopulation;
    end

    % 提取最优解
    x = bestIndividual(:, 1:numBuses);
    t = bestIndividual(:, numBuses+1:end);
    profit = bestFitness;
end

function population = initializePopulation(numBuses, startTime, endTime, populationSize)
    % 初始化种群
    population = zeros(populationSize, numBuses*2);

    for i = 1:populationSize
        % 随机生成发车次数
        x = randi([1, (endTime-startTime)*60/5], 1, numBuses);
        % 随机生成发车时间
        t = startTime + (endTime-startTime) * rand(1, numBuses);
        % 将发车次数和发车时间合并为一个个体
        population(i, :) = [x, t];
    end
end

function fitness = evaluateFitness(population, numBuses, interval)
    % 计算适应度(总收入)
    numIndividuals = size(population, 1);
    fitness = zeros(numIndividuals, 1);

    for i = 1:numIndividuals
        x = population(i, 1:numBuses);
        t = population(i, numBuses+1:end);

        % 统计总收入
        totalIncome = sum(x) * 50;

        % 统计总成本(司机工资和油费)
        totalCost = numBuses * 200 + sum(x) * numBuses * 1.5;

        % 计算适应度
        fitness(i) = totalIncome - totalCost;
    end
end

function newPopulation = selectNextGeneration(population, fitness, populationSize)
    % 使用轮盘赌选择下一代
    selectionProb = fitness / sum(fitness);
    cumulativeProb = cumsum(selectionProb);
    newPopulation = zeros(populationSize, size(population, 2));

    for i = 1:populationSize
        r = rand();
        selectedIdx = find(cumulativeProb >= r, 1);
        newPopulation(i, :) = population(selectedIdx, :);
    end
end

function newPopulation = mutatePopulation(population, mutationRate, numBuses, startTime, endTime)
    % 变异操作(随机改变发车次数或发车时间)
    numIndividuals = size(population, 1);
    newPopulation = population;

    for i = 1:numIndividuals
        if rand() < mutationRate
            % 随机选择一个巴士进行变异
            busIdx = randi([1, numBuses]);

            % 随机改变发车次数或发车时间
            if rand() < 0.5
                newPopulation(i, busIdx) = randi([1, (endTime-startTime)*60/interval]);
            else
                newPopulation(i, numBuses+busIdx) = startTime + (endTime-startTime) * rand();
            end
        end
    end
end

% 运行遗传算法优化巴士发车次数和发车时间
[x, t, profit] = optimizeBusSchedule();

这是一个简单的示例代码,通过遗传算法来优化校园巴士的发车次数和发车时间。您可以根据实际需求和约束进行调整和扩展。请注意,这只是一个示例,具体的问题可能需要更复杂的模型和算法来解决。

上图

img


代码

function [x,fval] = ga_example()
% 定义目标函数
function f = objfun(x)
    n = x(1); % 巴士数量
    t = x(2); % 发车间隔(分钟)
    T = x(3); % 运行时间(分钟)
    f = -(n * (30000 / t - 200 - 180 * T / t)); % 负号表示最小化
end 

% 定义约束条件
function [c, ceq] = confun(x)
    n = x(1); % 巴士数量
    t = x(2); % 发车间隔(分钟)
    T = x(3); % 运行时间(分钟)
    c = [n * 50 * (600 / t) - 3000]; % 不等式约束 c <= 0
    ceq = []; % 等式约束 ceq = 0
end 

% 设置变量范围和类型
lb = [1, 5, 1]; % 下界
ub = [10, 600, 599]; % 上界
intcon = [1, 2, 3]; % 整数变量索引

% 设置遗传算法参数
options = optimoptions('ga', ... % 使用ga函数
    'PopulationSize', 100, ... % 种群大小
    'MaxGenerations', 100, ... % 最大迭代次数
    'Display', 'iter'); % 显示迭代信息

% 调用遗传算法求解
[x, fval] = ga(@objfun, 3, [], [], [], [], lb, ub, @confun, intcon, options);

% 输出最优解和最优值
disp('最优巴士数量:')
disp(x(1))
disp('最优发车间隔(分钟):')
disp(x(2))
disp('最优运行时间(分钟):')
disp(x(3))
disp('最大总利润:')
disp(-fval)
end


【优化调度】基于改进遗传算法的公交车调度排班优化的研究与实现(Matlab代码实现)
可以参考下
https://blog.csdn.net/weixin_46039719/article/details/126942909