使用修补算子求解MKP问题的文献总结

使用修补算子求解MKP问题的文献总结

按顺序进行丢弃--增加操作

决策变量根据规则排序(一般是根据效用排序),直接进行丢弃--增加操作。5,6,7是同一作者,5和6使用的效用和Chu是一样的,7则改进了效用的计算方式。8和9是清华大学王凌实验室的文章,与其他文章思路不一样,是按照约束进行丢项操作。
1)求解多维背包问题的改进二进制粒子群算法
2)改进二进制人工蜂群算法求解多维背包问题
3)无参数变异的二进制差分进化算法
4)利用改进的二进制狼群算法求解多维背包问题
5)A new ant colony optimization algorithm for the multidimensional Knapsack problem
6)Apply the Particle Swarm Optimization to the Multidimensional Knapsack Problem
7)Solving large-scale multidimensional knapsack problems with a new binary harmony search algorithm
8)A novel binary fruit fly optimization algorithm for solving the multidimensional knapsack problem
9)An effective hybrid EDA-based algorithm for solving multidimensional knapsack problem
文章8:丢弃操作是确定性的,增项操作中,只针对一个松弛性最高的约束检索可以增加的变量。

其他

1)随机丢弃-确定增加:改进二进制布谷鸟搜索算法求解多维背包问题
2)随机丢弃:一种求解多背包问题的改进的人工鱼群算法
3)确定丢弃:求解0-1背包问题的二进制狼群算法
4)效用动态改变:同一个作者的两篇文章a) Self-adaptive check and repair
operator-based particle swarm optimization for the multidimensional knapsack problem(当解陷入局部最优一定时间后,将进入修正效用的阶段,重新进入搜索);b) Three pseudo-utility ratio-inspired particle swarm optimization with local search for multidimensional knapsack problem
5)多目标0/1背包问题MOEA求解中的修复策略(不同背包赋予不同的权重,讨论了很多策略,非常详细)

实现鼻祖文章chu的代码

A Genetic Algorithm for the Multidimensional
Knapsack Problem

function [bx, result, con] = GA_MKP(prob,alg)
% 参考文献:
% Chu P C , Beasley J E . A Genetic Algorithm for the Multidimensional
% Knapsack Problem[J]. Journal of Heuristics, 1998, 4(1):63-86.

% 功能:二进制遗传算法解MKP问题
% 输入
    % prob 问题的属性
        % prob.Nvar 变量数
        % prob.weight 每个物品的权重
        % prob.A 约束系数
        % prob.R 约束右端项
        % prob.bestP 目前为止该问题的最优解
    % alg  搜索参数 包括
        % alg.PS 人口规模
        % alg.NG 最大迭代次数
        % alg.pc 交叉概率
        % alg.pu 变异概率
        % alg.pr 替换概率
% 输出
    % bx 最优解
    % con 记录得到的最优解
    % result 结构体
    % result.bP 最优解的函数值
    % result.ni 最优解对应选择照片的个数
    % result.NGen    运行停止时迭代的次数
    % result.T  运算时间
    % result.bx 每次迭代停止时输出的最优解
    % result.isfeasible  解是否可行的标志

% 子函数 修复算子
%  [x,fit] = repair_MKP(x,prob)
%  输入
    %  x: 输入的基因的值
%  输出
    %  x: 修复后的x值
    %  fit: 可行解的适应度值

% 参数设置
tic                             % 计时器
bestP = prob.bestP;             % 精确解
weight = prob.weight;
R = prob.R;
A = prob.A;
Nvar = prob.Nvar;               % 基因长度
PS = alg.PS;                    % 种群大小
NG = alg.NG;                    % 最大迭代次数
n_competition = alg.n_competition;    % 锦标赛选择个体数
nc = size(A,1);

% 生成初始解
Parent = zeros(PS,Nvar);
for i = 1:PS
    x = zeros(1,Nvar);
    T = 1:Nvar;
    nT = Nvar;
    j = T(ceil(rand * nT));
    T(j ) = [];
    S = zeros(nc,1);
    while all(S + A(:,j) <= R)
        x(j) = 1;
        S = S + A(:,j);
        nT = nT-1;
        id= ceil(rand*nT);        % 找到装入背包的变量
        j = T(id);
        T(id) = [];
    end
    Parent(i,:) = x;
end
Fit = sum(bsxfun(@times, weight, Parent),2);
[bP,id] = max(Fit);             % 记录最优值
bx = Parent(id,:);
con = zeros(NG,1);              % 每一代的最优解
NGen = PS;                      % 迭代次数
evaluate_time = PS;             % 评价次数
con(1:PS) = sort(Fit);
%% 开始迭代
while bP < bestP && NGen < NG         % 终止条件 达到了最优解或者最大评价次数
    child = Parent(1,:);
    id =1;
    while any(all( bsxfun(@eq,child,Parent(id,:)), 2))  % 生成一个和父代不同的个体

        % turnament selection   T = 2
            % 选择第一个个体
            id1 = ceil(rand(n_competition,1)*PS);
            [~,k1] = max(Fit(id1));
            P_1 = Parent(id1(k1),:);
            % 选择第二个个体
            id2 = ceil(rand(n_competition,1)*PS);
            [~,k2] = max(Fit(id2));
            P_2 = Parent(id1(k2),:);

        % Crossover and mutation
            % uniform crossover   两个父代个体产生一个子代个体
            child = zeros(1,Nvar);
            id = rand(1,Nvar) < 0.5;
            child(id) = P_1(id);
            child(~id) = P_2(~id);

            % mutation  只变异两个位置  要使用吗?  k = ceil(rand*2);
            k = ceil(rand(1,2) * Nvar);
            while(k(1)==k(2))
                k(2) = ceil(rand * Nvar);
            end
            child(k) = 1-child(k);

        % 修复和评价
        [child,childFit] = repair_MKP(child, prob);
        evaluate_time = evaluate_time + 1;

        % 判断子代是否和父代中的个体重复
        id = sum(child,2)==sum(Parent,2);
    end

    % 将父代中的最差解替换为子代
    [~,min_P] = min(Fit);
    Parent(min_P,:) = child;
    Fit(min_P) = childFit;

    % 更新全局最优解
    [~,g] = max(Fit);
    if Fit(g)>bP
        bx = Parent(g,:);
        bP = Fit(g);
    end
    con(NGen)=bP;    % 记录最优解

    if rem(NGen,10000)==0    % 图示化
        disp(bP)
        plot(con(1:NGen))
        pause(eps)
    end

    NGen = NGen+1;
end % end for while

% 输出
result.bP=sum(prob.weight.*bx);
result.ni = sum(bx>0);
result.NGen = NGen-1;
result.evaluate_time = evaluate_time;
result.bx = bx;
result.T=toc;

% 判断解是否可行
nc = sum(sum(prob.A.*bx,2)>prob.R);
result.isfeasible = nc;
function [x,fit] = repair_MKP(x,prob)
% 修复不可行解
% 输入
    % x: 输入的解
% 输出
    % x: 修复后的x的值
    % fit: 可行解x的适应度值

% 输入基本信息
weight=prob.weight;    % 目标函数中变量的系数
A = prob.A;            % 约束中变量的系数
R = prob.R;            % 约束右端项
Nvar = prob.Nvar;   % 变量的个数
iden = 1:Nvar;
x = x'; 

%% drop
S = A*x;  % 计算每一个约束的左端项之和
j = Nvar;
% % 法一 文献中的处理方式
while any(S > R)
    if x(j)>0
        x(j) = 0;
        S = S-A(:,j);
    end
    j = j-1;
end

% 法二 根据自己的理解稍作修改
% id = any(S > R);
% while any(id)
%     if (x(j)>0)&&any(A(id,j))
%         x(j) = 0;
%         S = S-A(:,j);
%     end
%     id = S > R;
%     j = j-1;
% end

%% add
To_0  = iden(x==0);
for j = To_0
    if all(S + A(:,j)<= R)
        x(j) = 1;
        S = S + A(:,j);
    end
end
%% 输出
x = x';
fit = sum(weight.*x);

数据和代码链接

原文地址:https://www.cnblogs.com/liuxiang2020/p/11371558.html

时间: 2024-11-10 14:56:46

使用修补算子求解MKP问题的文献总结的相关文章

Mathematica

Mathematica是一款科学计算软件,很好地结合了数值和符号计算引擎.图形系统.编程语言.文本系统.和与其他应用程序的高级连接.很多功能在相应领域内处于世界领先地位,它也是使用最广泛的数学软件之一.Mathematica的发布标志着现代科技计算的开始.Mathematica是世界上通用计算系统中最强大的系统.自从1988发布以来,它已经对如何在科技和其它领域运用计算机产生了深刻的影响. Mathematica和MATLAB.Maple并称为三大数学软件. 软件名称 Mathematica 开

推荐算法——非负矩阵分解(NMF)

一.矩阵分解回想 在博文推荐算法--基于矩阵分解的推荐算法中,提到了将用户-商品矩阵进行分解.从而实现对未打分项进行打分. 矩阵分解是指将一个矩阵分解成两个或者多个矩阵的乘积.对于上述的用户-商品矩阵(评分矩阵),记为Vm×n.能够将其分解成两个或者多个矩阵的乘积,如果分解成两个矩阵Wm×k和Hk×n.我们要使得矩阵Wm×k和Hk×n的乘积能够还原原始的矩阵Vm×n: Vm×n≈Wm×k×Hk×n=V^m×n 当中,矩阵Wm×k表示的是m个用户与k个主题之间的关系,而矩阵Hk×n表示的是k个主题

如何根据梯度重建原始图像以及图像重建常用算法?

 在数字图像处理过程中,经常会遇到求梯度后,重新构建图像的问题.一般情况下,都是通过解泊松方程(还有其他方式重构图像,具体算法如下图所示,),利用拉普拉斯算子求解:但有一点请注意泊松方程求出的只是近似值,无法求出精确的原始值. 常用图像重建算法

求解PDE的多重网格法(MG)

多重网格法相对于普通的Jacobi迭代或者G-S迭代等能够得到和未知数的个数成线性的高效运行时间的主要原因在于:迭代初值的一步步接近真值和G_S方法的前面几步的快速收敛性. 先看一张图[1]: 这张图说明了以下几点:一.G-S迭代法在开始几步迭代时收敛速度很快,但是随着步数的增加收敛速度逐渐减慢:二.第一条性质和求解的方程未知数的个数无关,尤其是在最开始的收敛速度很快的几步:三.未知数个数越少,最终收敛速度越快,如图中的绿线(这个可以从另一个角度来理解,一般情况下,求解未知数个数少的方程显然比求

多目标跟踪2017-6-19文献总结

文献[1],交互多模型粒子滤波器 提出了一个新的方法:基于马尔科夫交换系统的多模型粒子滤波器.该滤波器利用交互式模型过滤器(IMM)和正则化粒子滤波器(正则化粒子滤波器概率密度是高斯概率密度的混合)的相互作用来处理非线性和非高斯噪声.在每个模式中使用固定数量的粒子,可避免现有的马尔科夫交换系统的多模型粒子滤波器的缺点,即没有在每个模式中控制粒子的数量. 基于标准IMM滤波器和正则化粒子滤波器相结合的多模型滤波方法:算法包含三个阶段,交互阶段,滤波阶段,融合阶段.(将马尔科切换过程用于模式转换中)

两种改进的模拟退火算法求解大值域约束满足问题1.0

0引言 约束满足问题(Constraint Satisfaction Problem,CSP)是人工智能研究领域中一个非常重要的分支,现已成为理论计算机科学.数学和统计物理学等交叉学科研究中的热点问题.人工智能.计算机科学和自动控制等领域中的许多问题都可以归结为约束满足问题.同时,约束满足问题在实际问题如模式识别.决策支持.物流调度及资源分配等领域也有着非常广泛的应用. CSP由一个变量集合和一个约束集合组成.每个变量都有一个非空的可能值域,每个约束描述了一个变量子集与子集内各变量的相容赋值,所

车道线检测文献解读系列(一) 基于机器视觉的高速车道标志线检测算法的研究_李晗

作者背景 基于机器视觉的高速车道标志线检测算法的研究_李晗 东北大学车辆工程硕士学位论文 2006年 [GB/T 7714]李晗. 基于机器视觉的高速车道标志线检测算法的研究[D]. 东北大学, 2006. DOI:10.7666/d.y852642.` 论文结构一览 预处理 灰度化 [亮点]模式判别 选择日间模式还是夜间模式: 在每个检测周期开始时,首先判断采用日间模式还是夜间模式工作.摄像机视野中的上半部分为天空背景,天空亮度可以显著区分日间和夜间环境.由于天空的颜色为蓝离,日间天空的蓝色分

孔洞修补研究总结

本人最近需要研究三维模型的孔洞修补算法,故上网看了一些大神写的资料,现汇总如下: 重建骨骼比较典型的方法有:用径向基函数从不完整的扫描数据生成连续网格:基于CT等值面数据生成曲面:用傅里叶级数拟合CT图像提取边缘轮廓曲线:基于形状的利用数学形态学算子进行骨架提取的插值算法. 常用的孔洞修补算法可以分为体素方法和几何方法,其中体素方法采用有想距离函数差分或体素滤波,以及在此基础上使用多种偏微分方程进行优化的方法,消除重建三维结构中因采样问题产生的孔洞.基于体素方法存在两方面的问题,首先,它针对的是

利用最小二乘法求解仿射变换参数

图像配准中的仿射变换细节 可以从百度文库下载原文:https://wenku.baidu.com/view/1faa10867cd184254a353540.html 仿射变换的定义 仿射变换(Affine Transformation或 Affine Map),是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间. 仿射变换可以由以下基本变换复合而成:平移(Translation).缩放(Scale).翻转(Flip).旋转(Rotation)和错切(Shear),这