matlab遗传算法,运行不出来

下列是一个大体上用gpt写出的遗传算法但是出现了问题

位置 1 处的索引超出数组边界。

出错 wenti22>fun (第 67 行)
m(1,i)=zhongyao(1,i)*x(1,i);

出错 wenti22 (第 21 行)
individuals.fitness(i) = fun(k);

我仔细看过zhongyao和x都是1*402的矩阵


    % 假设有402家原料生产厂商
    num_suppliers = 402;

    % 设置遗传算法参数
    max_gen = 100;       % 迭代次数
    pop_size = 50;       % 种群规模
    pcross = 0.8;        % 交叉概率
    pmutation = 0.1;     % 变异概率
    zhongyao=zeros(1,402);

    % 设置非线性规划参数
    options = optimoptions('fmincon', 'Display', 'off');

    % 初始化种群
    individuals = struct('fitness', zeros(1, pop_size), 'chrom',[]);
    for i = 1:pop_size
        individuals.chrom(i, :) = rand(1,num_suppliers);% 假设每家厂商的订购量在0到1之间
        k=individuals.chrom(i,:);
        disp(k);
        individuals.fitness(i) = fun(k);
    end

    % 进化过程
    for i = 1:max_gen
        % 选择操作
        individuals = select(individuals, pop_size);
        
        % 交叉操作
        individuals.chrom = Cross(pcross, num_suppliers, individuals.chrom, pop_size);
        
        % 变异操作
        individuals.chrom = Mutation(pmutation, num_suppliers, individuals.chrom, pop_size);
        
        % 计算适应度
        for j = 1:pop_size
            individuals.fitness(j) = fun(individuals.chrom(j, :));
        end
    end

    % 非线性规划优化
    best_fitness = min(individuals.fitness);
    best_chrom = individuals.chrom(individuals.fitness == best_fitness, :);
    best_chrom = best_chrom(1, :);  % 如果有多个最优解,选择第一个作为初始点

    % 定义非线性规划目标函数和约束函数
    obj_func = @(x) -fun(x);  % 非线性规划是求最小值,所以取相反数
    nonlcon = @(x) constraint_func(x);  % 约束函数

    % 非线性规划求解
    [opt_chrom, opt_fitness] = fmincon(obj_func, best_chrom, [], [], [], [], zeros(1, num_suppliers), ones(1, num_suppliers), nonlcon, options);

    % 输出结果
    disp('最优订购量:');
    disp(opt_chrom);
    disp('最优目标函数值:');
    disp(-opt_fitness);  % 非线性规划是求最小值,所以取相反数


% 目标函数
function y = fun(x)
    % 这里根据实际问题定义目标函数,如原材料成本、供应商评估等
    % 假设目标函数为原材料总成本,cishu是需求矩阵,cost是成本矩阵
    k=sum(x,2);
   global zhongyao;
   for i=1:402
    m(1,i)=zhongyao(1,i)*x(1,i);
    disp('1');
   end
    h=sum(m,2);
    y = k/h;
end

% 选择操作
function ret = select(individuals, pop_size)
    individuals.fitness = 1 ./ individuals.fitness;
    sumfitness = sum(individuals.fitness);
    sumf = individuals.fitness ./ sumfitness;
    index = [];

    for i = 1:pop_size
        pick = rand;
        while pick == 0
            pick = rand;
        end

        for j = 1:pop_size
            pick = pick - sumf(j);
            if pick < 0
                index = [index j];
                break;
            end
        end
    end

    individuals.chrom = individuals.chrom(index, :);
    individuals.fitness = individuals.fitness(index);
    ret = individuals;
end

% 交叉操作
function ret = Cross(pcross, num_suppliers, chrom, pop_size)
    for i = 1:pop_size
        pick = rand(1, 2);
        while prod(pick) == 0
            pick = rand(1, 2);
        end
        index = ceil(pick .* pop_size);
        pick = rand;
        while pick == 0
            pick = rand;
        end

        if pick > pcross
            continue;
        end

        pos = ceil(pick .* num_suppliers);
        temp = chrom(index(1), pos:end);
        chrom(index(1), pos:end) = chrom(index(2), pos:end);
        chrom(index(2), pos:end) = temp;
    end

    ret = chrom;
end

% 变异操作
function ret = Mutation(pmutation, num_suppliers, chrom, pop_size)
    for i = 1:pop_size
        pick = rand;
        while pick == 0
            pick = rand;
        end
        index = ceil(pick .* pop_size);

        pick = rand;
        if pick > pmutation
            continue;
        end

        pos = ceil(pick .* num_suppliers);
        chrom(i, pos) = 1 - chrom(i, pos); % 变异:二进制位取反
    end

    ret = chrom;
end

% 约束函数
function [c, ceq] = constraint_func(x)
    % 假设有约束条件,如总需求量不能超过供应量
    % 这里根据实际问题定义约束函数
    global cishu;
    c = sum(cishu, 2) - x';
    ceq = [];
end


用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%

https://blog.csdn.net/weixin_44209907/article/details/130804084
可以参考一下这个博客

代码发过来给你修改一下