K-优化算法

K-优化算法

ps:个人理解,若有错误还请各位大佬们纠正(最近某高校的作业涉及到了这个,是不是网上搜不到啊,嘿嘿嘿)

定义

在这里插入图片描述
这就是定义= =
帮助理解,废话不多说直接上例题

例1

用1-优化法求解以下0/1背包问题,已知:n = 8, w = [16, 20, 4, 15, 25, 10, 5, 8],p = [100, 200, 50, 90, 175, 50, 20, 60], c = 70。

解:贪心策略:按价值密度非递减的顺序检查物品,若剩余容量能容下正在考察的物品,将其装入;否则考虑下个物品。
用贪心法求解的过程:
效益密度为[ 6.25, 10 , 12.5 , 6 , 7 , 5 , 4 , 7.5 ],对其排序后得到的物品顺序为[ 3 , 2 , 8 , 5 , 1 , 4 , 6 , 7 ],对应的重量为[ 4 , 20 , 8 , 25 , 16 , 15 , 10 , 5 ]。
k=0时的计算结果为:
装入物品3、2、8、5后,背包剩余容量为13,接下来物品1、4的重量都超过了13,考察物品6,6装入后,背包剩余容量为3,考察物品7,其重量大于剩余容量,所以答案 x =(0 , 1 , 1 , 0 , 1 , 1 , 0 , 1 ),得到的效益值为535。
当k=1时的计算结果为:
先放物品3、2、8、5,得到的效益值仍为535,贪心解同上;
先放物品1,得到效益值520,贪心解为(1,1,1,1,0,0,1,1);先放物品4,得到的效益值为520,贪心解为(1,1,1,1,0,0,1,1);
先放物品6,得到效益值为535,贪心解为(0,1,1,0,1,1,0,1);先放物品7,得到效益值为505,贪心解为(0,1,1,0,1,1,1)。所以k优化法得到的解为(0 , 1 , 1 , 0 , 1 , 1 , 0 , 1 ),效益值为535。

这应该算是参考答案,写得有点抽象= =
1-优化情况比较少,我们来看看2-优化(俺的想法)

例2

题目参考例1,使用2-优化算法
ps:很有精神,穷举吧。。。我比较懒。。。
下面展示一些 2-优化代码此例子使用哦。


// An highlighted block
#include <iostream>

using namespace std;
int w[8]={
    
    16,20,4,15,25,10,5,8};
int p[8]={
    
    100,200,50,90,175,50,20,60};
int r[8]={
    
    2,1,7,4,0,3,5,6};//rank 值
int sumw,sump;
int main()
{
    
    
    for(int i=0;i<=6;i++){
    
    
        for(int j=i+1;j<=7;j++){
    
    
                int vis[8] = {
    
    0};
                cout << "a" << r[i]+1 << " " << "a" << r[j]+1 << " ";
                sumw = w[r[i]]+w[r[j]];
                sump = p[r[i]]+p[r[j]];
                vis[r[i]]=vis[r[j]]=1;
                for(int k = 0;k <= 7; k++){
    
    
                    if(!vis[r[k]]){
    
    
                    if((sumw+w[r[k]])<=70){
    
    sumw+=w[r[k]];sump+=p[r[k]];vis[r[k]]=1;cout << "a" << r[k]+1 << " ";}
                    }
                }
                cout << "    " << sump << endl;
        }
    }

    return 0;
}

运行结果
在这里插入图片描述
= =水啊水,还是那句话,若理解有误,请给学渣指出来,跪谢查阅的大佬们~~~

猜你喜欢

转载自blog.csdn.net/weixin_45653643/article/details/109752625
今日推荐