2022-06-14至2022-08-11 关于复现MKP算法的总结与反思

news2024/11/29 12:48:14

Prerequisite

自2022年6月14日至2022年8月11日的时间内,我致力于完成A Hybrid Approach for the 0–1 Multidimensional Knapsack problem 论文的复现工作,此次是我第一次进行组合优化方向的学习工作,下面介绍该工作内容发展过程以及该工作结束后的总结反思

Introduction of — A Hybrid Approach for the 0–1 Multidimensional Knapsack problem

01 knapsack

众所周知的01背包问题,formulation如下所示
请添加图片描述

MKP 01

将knapsack 01问题可归约为MKP 01
即现在不仅仅是一个单独的属性容量限制,有多个属性容量限制,在满足所有容量限制的情况下要使得背包中的物品价值最大。
请添加图片描述

method introduction

A Hybrid Approach for the 0–1 Multidimensional Knapsack problem是结合 linear programming & Tabu Search ,实现一个优化的启发式算法来解决MKP01

请添加图片描述
该方法分为两个步骤,具体如下:

Phase 1: simplex phase

计算解决松弛的MKP来得到一个带小数的最优解
此阶段需要用到整数规划,此处用的是IBM的商业求解器CPLEX
请添加图片描述
请添加图片描述

Phase 2: TS phase

在Phase1得到的最优解附近利用禁忌算法搜索

  1. Search Space Reduction to gain the Neighborhood
    请添加图片描述

2)Tabu management: Tabu list 通过RCS和running list来实现更新

running list:记录当前所有的迭代
RCS:每一次更新running list后,RCS就会通过回溯running list得到当前需要禁忌的对象,以更新tabu list。

3)Evaluation Function
评价函数:MKP中每一个解的评价函数的值是该解超出约束的值请添加图片描述

Complish the Code

之前只是看着题目刷题,第一次做照着方法写代码的工作,下面是在coding时遇到的技术学习:
1)增强了C和部分C++语言的掌握能力,如多维数组排序、复杂函数调用、vector容器使用等,能够自主实现所需求的功能。
2)掌握对CPLEX的使用
3)目前debug仅仅只会通过cout和exit一起来间接查看错误点。

Problems

下图表示某一个instance的效果,其中p1的z*表示论文要求效果,p2的z_min表示目前所达到效果。
请添加图片描述
以下几点为当时推测问题点:

随机数

在这里插入图片描述
1、delta[k] = 2 * (u + q - k)
2、delta_max ≈ delta[k]
论文中未给出delta_max具体为多少,因此猜测:
delta_max = delta[k] + rand
经过不断尝试随机值后,效果有一定的改善,但该随机值并未固定。这是每换一个例子且得到效果差时,我第一个进行不断调整的数。

k值的计算

利用在introduction中提及的k值计算方法,paper中得到的值为130(instance 1),与我们得到的值有[1,10]的差距,因此继续检查k的计算方法,其中涉及到z(如下图所示),在paper中仍未给出具体的计算方法,因此一直在自行调整。
在这里插入图片描述

Conclusion

虽然最终算法性能未完全复现,但是在此过程中仍然获得了启发式学习的知识、代码能力增强、自我学习能力增强等等。
1)精确算法和启发式算法的学习。例如在coding中就分别使用了CPLEX和Tabu Search。
2)文献的阅读。一开始,一些术语例如“relaxed”, "benchmark"等都不明白是什么,阅读进度很慢,我也很难理解内容。现采用方法:“先读abstarct(了解论文的大致方法)再分别去对应章节细读“。
3) Coding。第一次按照论文给出算法写的代码中,每一个函数里几乎都存在bug。其中总是在数组的长度上出现越界的情况上出错,最开始还找不到哪里出错,也不太会debug,甚至一行一行肉眼看代码来找问题点,后来学会用输出和assert来debug(当然现在是会用断点了)。
4) 碰到一些例子效果不好的情况,总是在一些小地方一直调,想掩盖代码的问题。但这样几乎是无济于事。

Code

下面放出当时的复现代码

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <string.h>
#include <time.h>
#include <vector>
#include <math.h>
#include <algorithm>
#include<ilcplex/ilocplex.h>
using namespace std;

ILOSTLBEGIN

string File_Name;
int **R;
int *P;
int *B;
int N;
int M;
int k ;
int randZ;
vector<float> x_bar;
int seed = 15;

void Initializing() {
     int i;
     int j;
     ifstream FIC;
     ofstream FIC2;
     FIC.open(File_Name);
     if (FIC.fail()) {
         cout << "### Error open, File_Name " << File_Name << endl;
         exit(0);
     }
     FIC >> N >> M;
     P = new int [N];
     B = new int [N];
     R = new int *[M];
    for(i = 0; i < M; i++) {
        R[i] = new int [N];
    }
     while (! FIC.eof())
     {
         for(i = 0; i < N; i++) {
             FIC >> P[i];
         }
         for(i = 0; i < M; i++) {
             for(j = 0; j < N; j++) {
                 FIC >> R[i][j];//[属性][物品]
             }
         }
         for(j = 0;j < M;j++) {
             FIC >> B[j];
         }
     }
     FIC.close();
}

void Initializing2()
{
    int i,j;
    ifstream FIC;
    ofstream FIC2;
    FIC.open(File_Name);
    if (FIC.fail())
    {
        cout << "### Erreur open, File_Name " << File_Name << endl;
        exit(0);
    }
    FIC >> N >> M;
    P = new int [N];
    B = new int [N];
    R = new int *[M];
    for(i = 0; i < M; i++) {
        R[i] = new int [N];
    }
    while (! FIC.eof())
    {
        for(i = 0; i < N; i++) {
            FIC >> P[i];
        }
        for(j = 0; j < M; j++) {
            FIC >> B[j];
        }
        for(i = 0; i < M; i++) {
            for(j = 0; j < N; j++) {
                FIC >> R[i][j];
            }
        }
    }
    FIC.close();
}

bool cmp1(float a[], float b[])
{
    return a[0] > b[0];
}

bool cmp2(float a[], float b[])
{
    return a[0] < b[0];
}

typedef IloArray<IloIntVarArray>    IntVarMatrix;
typedef IloArray<IloNumVarArray>    NumVarMatrix;
typedef IloArray<IloIntArray>        IntMatrix;
typedef IloArray<IloNumArray>        NumMatrix;


int computeValue (vector<int> &x) {
    int value = 0;
    for(int i = 0; i < N; i++)
        value += x[i] * P[i];
    return value;
}

int computeV_b(vector<int> &x) {
        vector<int> A(M, 0);
        int v_b = 0;
        for(int i = 0; i < M; i++) {
            for(int j = 0; j < N; j++) {
                A[i] += R[i][j] * x[j];
            }
            if(A[i] > B[i]) {
                v_b += A[i] - B[i];
            }
        }
        return v_b;
}

void computeZ()
{
    float **M2 = new float*[N];
    int i;
    int num = rand() % (N / 10 + 1) + N / 10;//[N/10,N/5] instances:1-4,6-8
//    int num = rand() % (N / 20 + 1) + N / 10;//[N/10,3*N/20] instance:5
//    int num = rand() % (N / 144 + 1) + N / 8;// [8/N,19N/144] instances:9-10
//    int num =rand() % (N / 224 + 1) + 15 * N / 112;//[15N/112,N/7] instance:11
    for(i = 0; i < N; i++) {
            M2[i] = new float[2];
            M2[i][0] = P[i];
            M2[i][1] = i;

    }
    sort(M2, M2 + N, cmp2);
    vector<int> x_1(N, 0);
    vector<int> x_2(N, 0);
    int v_b;
    int item = 0;
    do {
        x_1[M2[item][1]] = 1;
        v_b = computeV_b(x_1);
         if(v_b > 0) {
             x_1 = x_2;
             break;
         }
         else {
             x_2 = x_1;
         }
         item++;
    }
    while (item < num);
    randZ = computeValue(x_2);
}

int computeK_max() {
    IloEnv env;
    IloModel model( env );
    IloInt i;
    IloInt j;
    IloNumVarArray X(env, N, 0, 1,ILOFLOAT);
    IloExpr k_max(env);
    IloNumArray x( env, N );
    for( i = 0; i < M; i++ ) {
            IloExpr v1( env );
            for( j = 0; j < N; j++ )
                v1 += (R[i][j] * X[j]);
            model.add( v1 <= B[i]);
        }
    IloExpr v2( env );
    for( i = 0; i < N; i++) {
        v2 += X[i] * P[i];
        k_max += X[i];
    }
    model.add( v2 >= randZ + 1);
    model.add(IloMaximize(env, k_max));
    IloCplex cplex(model);
    cplex.setOut(env.getNullStream());
    cplex.setParam(IloCplex::Param::RandomSeed,seed);
    cplex.setParam(IloCplex::Param::Threads, 1);
    cplex.solve();
    cplex.getValues(x, X);
    double obj = cplex.getObjValue();
    env.end();
    return ceil(obj);
}

int computeK_min() {
    IloEnv env;
    IloModel model(env);
    IloInt i;
    IloInt j;
    IloNumVarArray X(env, N, 0, 1,ILOFLOAT);
    IloExpr k_min(env);
    IloNumArray x(env, N);
    for(i = 0; i < M; i++) {
            IloExpr v1(env);
        for( j = 0; j < N; j++ ) {
            v1 += (R[i][j] * X[j]);
        }
            model.add( v1 <= B[i]);
    }
    IloExpr v2( env );
    for(i = 0; i < N; i++) {
        v2 += X[i] * P[i];
        k_min += X[i];
    }
    model.add(v2 >= randZ + 1);
    model.add(IloMinimize(env, k_min));
    IloCplex cplex(model);
    cplex.setOut(env.getNullStream());
    cplex.setParam(IloCplex::Param::RandomSeed,seed);
    cplex.setParam(IloCplex::Param::Threads, 1);
    cplex.solve();
    cplex.getValues(x, X);
    double obj = cplex.getObjValue();
    env.end();
    return floor(obj);

}

float *computeX_bar() {
    IloEnv env;
    IloModel model(env);
    IloInt i;
    IloInt j;
    IloNumArray x(env, N);
    IloExpr value(env);
    IloNumVarArray X(env, N, 0.0, 1.0,ILOFLOAT);
    IloExpr sum(env);
    for (i = 0; i < M; i++) {
        IloExpr v(env);
        for( j = 0; j < N; j++ ) {
            v += (R[i][j] * X[j]);
        }
        model.add( v <= B[i] );
    }
    for(i = 0; i < N; i++)
        value += (P[i] * X[i]);
    for(i = 0; i < N; i++)
        sum += X[i];
    model.add(sum == k);
    model.add(IloMaximize(env, value));
    IloCplex cplex(model);
    cplex.setOut(env.getNullStream());
    cplex.setParam(IloCplex::Param::RandomSeed,seed);
    cplex.setParam(IloCplex::Param::Threads, 1);
    cplex.solve();
    cplex.getValues(x, X);
    env.end();
    float *x_bar  = new float[N];
    for(i = 0; i < N; i++) {
        x_bar[i] = x[i];
    }
    return x_bar;
}

void swap(float* &a) {
    for(int i = 0; i < N; i++)
        x_bar.push_back(a[i]);
}

int computeSum(vector<int> &x) {
    int sum = 0;
    for(int i = 0; i < N; i++) {
        sum += x[i];
    }
    return sum;
}

vector<int> computeXinit () {
    float **M = new float*[N];
    for(int i = 0; i < N; i++) {
        M[i] = new float[2];
        M[i][0] = x_bar[i];
        M[i][1] = i ;
    }
    sort(M, M + N, cmp1);
    int index[N];
    for(int i = 0; i < N; i++) {
        index[i] = M[i][1];
    }
    vector<int> x_init(N,0);
    for(int i = 0; i < k; i++) {
        x_init[index[i]] = 1;
    }
    return x_init;
}

float computeBias(vector<int> &x) {
    float bias = 0;
    for(int l = 0; l < N; l++) {
        bias += abs(x[l] *1.0 - x_bar[l]);
    }
    return bias;
}

int main(int argc, char **argv)
{
    string outfilename;
    string data_out;
    File_Name = "/Users/jiangtongjun/Library/Containers/com.tencent.xinWeChat/Data/Library/Application\ Support/com.tencent.xinWeChat/2.0b4.0.9/396ec1d845a72fdc3aaa185bb6f9c7eb/Message/MessageTemp/aef63e547d5e98cce87554f37a88a811/File/benchmark2/MK_GK7.DAT";
    srand(seed);
//    Initializing();
    Initializing2();
    int erl = 0;
    int i;
    int j;
    int v_b;
    int z_min = 0;
    int z_max;
    int z;
    int iter = 0;
    int v_min;
    float bias;
    int bias_max;
    float bias_old;
    int i2 = 0;
    int j2 = 0;
    int flag;
    int h = 0;
    int *RL = new int[500000];
    int **tabu = new int*[N];
    int *x_best = new int[N];
    vector<int> RCS;
    vector<int> x_temp2;
    int *IW = new int[M];
    int *IW_new= new int[M];
    float *x = new float[N];
    float *xBar = new float[N];
    int z_old;
    int e = 1000;
    time_t now_time=time(NULL);
    tm*  t_tm = localtime(&now_time);
    time_t mk_time_1 = mktime(t_tm);
    int l;
    for(i = 0; i < N; ++i) {
        tabu[i] = new int[N];
    }
    for(i = 0; i < N; ++i) {
        for(j = 0; j < N; ++j) {
            tabu[i][j] = -1;
        }
    }
    computeZ();
    k = computeK_max() - computeK_min() + 1;
    cout<<"k:"<<k<<endl;
    float *x_temp = computeX_bar();
    swap(x_temp);
    int u = 0;
    int q = 0;
    for(i = 0; i < N; ++i) {
        if((x_bar[i] > 0.0) && (x_bar[i] < 1.0)) {
            q++;
        }
        else if( x_bar[i] == 1.0 ) {
            u++;
        }
    }
    bias_max = 2 * (q + u - k) - 10;
    cout<<"bias_max:"<<bias_max<<endl;
    x_temp2 =computeXinit();
    for(i = 0; i < N; ++i) {
        x[i] = x_temp2[i];
    }
    for(i = 0; i < N; ++i) {
        xBar[i] = x_bar[i];
    }
    for(i = 0; i < M; ++i) {
        IW[i] = 0;
        for(j = 0; j < N; j++) {
            IW[i] += R[i][j] * x[j];
        }
    }
    z = computeValue(x_temp2);
    v_b = computeV_b(x_temp2);
    bias = computeBias(x_temp2);
    if (v_b == 0) {
        z_min = z;
        for (i = 0; i < N; ++i)
            x_best[i] = x[i];
    }
    else {
        z_min = 0;
        for( l = 0; l < N; ++l)
            x_best[l] = 0;
    }
    while ((v_min < INT_MAX) && (erl < 500000)) {
        v_min = INT_MAX;
        z_max = INT_MIN;
        for(i = 0; i < N; ++i) {
            for(j = i + 1; j < N; ++j) {
                if (x[i]+x[j] != 1) {
                    continue;
                }
                if(tabu[i][j] != iter) {
                    bias_old = bias;
                    x[i] = 1 - x[i];
                    x[j] = 1 - x[j];
                    if(bias > bias_max - 2.0)
                        bias = bias - abs(1 - x[i] * 1.0 - xBar[i]) - abs(1 - x[j] * 1.0 - xBar[j]) + abs(x[i] * 1.0 - xBar[i]) + abs(x[j] * 1.0 - xBar[j]);
                    if(bias > bias_max) {
                        x[i] = 1 - x[i];
                        x[j] = 1 - x[j];
                        bias = bias_old;
                        continue;
                    }
                    z_old = z;
                    if(x[i] == 1) {
                        z = z + P[i];
                    }
                    else {
                        z = z - P[i];
                    }
                    if(x[j] == 1) {
                        z = z + P[j];
                    }
                    else {
                        z = z - P[j];
                    }
                    if (z <= z_min) {
                        x[i] = 1 - x[i];
                        x[j] = 1 - x[j];
                        z = z_old;
                        bias = bias_old;
                        continue;
                    }
                    v_b = 0;
                    for(h = 0; h < M; ++h) {
                        IW_new[h] = IW[h];
                        if(x[i] == 1)
                            IW_new[h] +=  R[h][i];
                        else
                            IW_new[h] -=  R[h][i];
                        
                        if(x[j] == 1)
                            IW_new[h] +=  R[h][j];
                        else
                            IW_new[h] -=  R[h][j];

                        if(IW_new[h] > B[h])
                            v_b += IW_new[h] - B[h];
                    }
                    if((v_b < v_min) || ((v_b == v_min)&&(z > z_max))) {
                        i2 = i;
                        j2 = j;
                        v_min = v_b;
                        z_max = z;
                    }
                    x[i] = 1 - x[i];
                    x[j] = 1 - x[j];
                    z = z_old;
                    bias = bias_old;
                }
            }
        }
        if (v_min != INT_MAX) {
            x[i2] = 1 - x[i2];
            x[j2] = 1 - x[j2];
            bias = bias - abs(1 - x[i2] * 1.0 - xBar[i2]) - abs(1 - x[j2] * 1.0 - xBar[j2]) + abs(x[i2] * 1.0 - xBar[i2]) + abs(x[j2] * 1.0 - xBar[j2]);
            z = z_max;
            for(h = 0; h < M; ++h) {
                if(x[i2] == 1) {
                    IW[h] +=  R[h][i2];
                }
                else {
                    IW[h] -=  R[h][i2];
                }
                if(x[j2] == 1) {
                    IW[h] +=  R[h][j2];
                }
                else {
                    IW[h] -=  R[h][j2];
                }
            }
            if (v_min == 0) {
                erl = 0;
                z_min = z;
                cout << "z_min :"<< z_min <<endl;
                for(i = 0; i < N; ++i) {
                    x_best[i] = x[i];
                }
            }
            else {
                iter++;
                RL[erl++] = i2;
                RL[erl++] = j2;
                i = erl;
                while(i != 0) {
                    --i;
                    j = RL[i];
                    flag = 0;
                    if(find(RCS.begin(), RCS.end(), j) != RCS.end()) {
                        RCS.erase(std::remove(RCS.begin(), RCS.end(), j), RCS.end());
                        flag = 1;
                    }
                    if(flag == 0) {
                         RCS.push_back(j);
                    }
                    if(RCS.size() == 2) {
                         tabu[RCS[0]][RCS[1]] = iter;
                         tabu[RCS[1]][RCS[0]] = iter;
                     }
                }
                RCS.resize(0);
            }
        }
        time_t now_time=time(NULL);
        tm*  t_tm = localtime(&now_time);
        time_t mk_time_2 = mktime(t_tm);
        if(mk_time_2 - mk_time_1 > 36000)
            break;
        if(iter > e) {
            cout << iter << " "<<erl <<endl;
            e += 1000;
        }
    }
    cout <<"Z_min:" << z_min << endl;
}


最后,感谢Dr.He

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/401910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript Array 数组对象实例集合

文章目录JavaScript Array 数组对象实例集合创建数组合并两个数组 - concat()合并三个数组 - concat()用数组的元素组成字符串 - join()删除数组的最后一个元素 - pop()数组的末尾添加新的元素 - push()反转一个数组中的元素的顺序 - reverse()删除数组的第一个元素 - shift()从…

数字化时代,企业的商业模式建设

随着新一代信息化、数字化技术的应用&#xff0c;众多领域通过科技革命和产业革命实现了深度化的数字改造&#xff0c;进入到以数据为核心驱动力的&#xff0c;全新的数据处理时代&#xff0c;并通过业务系统、商业智能BI等数字化技术和应用实现了数据价值&#xff0c;从数字经…

Vue项目打包部署总结配合nginx部署

你可能还想了解&#xff1a;https://blog.csdn.net/weixin_52901235/article/details/129437990?spm1001.2014.3001.5502使用Vue做前后端分离项目时&#xff0c;通常前端是单独部署&#xff0c;用户访问的也是前端项目地址&#xff0c;因此前端开发人员很有必要熟悉一下项目部…

C#要点技术(二) - Dictionary 底层源码剖析

Dictionary 底层代码我们知道 Dictionary 字典型数据结构&#xff0c;是以关键字Key 和 值Value 进行一一映射的。Key的类型并没有做任何的限制&#xff0c;可以是整数&#xff0c;也可以是的字符串&#xff0c;甚至可以是实例对象。关键字Key是如何映射到内存的呢&#xff1f;…

【python】如何用python写一个下拉选择框和页签?

文章目录前言ttk模块下拉选择框combobox下拉选择框2页签Notebook前言 python学习之路任重而道远&#xff0c;要想学完说容易也容易&#xff0c;说难也难。 很多人说python最好学了&#xff0c;但扪心自问&#xff0c;你会用python做什么了&#xff1f; 刚开始在大学学习c语言&…

【玩转c++】stack和queue的介绍和模拟实现

本期主题&#xff1a;list的讲解和模拟实现博客主页&#xff1a; 小峰同学分享小编的在Linux中学习到的知识和遇到的问题小编的能力有限&#xff0c;出现错误希望大家不吝赐stack的介绍和使用1.1.stack的介绍1. stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上…

论文阅读-MGTAB: A Multi-Relational Graph-Based Twitter Account DetectionBenchmark

目录 摘要 1. 引言 2. 相关工作 2.1. 立场检测 2.2.机器人检测 3.数据集预处理 3.1.数据收集和清理 3.2.专家注释 3.3. 质量评估 3.4.特征分析 4. 数据集构建 4.1.特征表示构造 4.2.关系图构建 5. 实验 5.1.实验设置 5.2.基准性能 5.3训练集大小的研究 5.4 社…

Matlab进阶绘图第6期—雷达图/蜘蛛图/星图

雷达图&#xff08;Radar Chart&#xff09;&#xff0c;又称星图、蜘蛛图、蜘蛛网图、网络图、Kiviat图等&#xff0c;是一种以从同一点开始的轴上表示的三个以上变量的二维图表的形式&#xff0c;来显示多变量数据的图形方法。 雷达图可以直观地对多维数据集目标对象的性能、…

三步搞定OOM内存溢出,记一次使用Arthas处理OOM内存溢出问题java.lang.OutOfMemoryError: Java heap space

记一次OOM内存溢出问题修复java.lang.OutOfMemoryError: Java heap spaceOutOfMemoryError1.使用article找到问题线程2.分析线程运行链路&#xff0c;找出问题代码位置3.使用堆文件确认问题Arthas 是Alibaba开源的Java诊断工具&#xff0c;功能强大&#xff0c;操作简单 Arthas…

我们为什么使用docker 优点 作用

1. 我们为什么使用Docker? 当我们在工作中&#xff0c;一款产品从开发设计到上线运行&#xff0c;其中需要开发人员和运维工程师&#xff0c;开发人员负责代码编写&#xff0c;开发产品&#xff0c;运维工程师需要测试环境&#xff0c;产品部署。这之间就会有分歧。 就好比我…

信创国产化,试试 Solon v2.2.2

Solon 是一个高效的 Java 应用开发框架&#xff1a;更快、更小、更简单。它不是 Spring、没有用 Servlet、也无关 JavaEE&#xff0c;是一个有自己接口标准的开放生态。可以为应用软件国产化提供支持&#xff0c;助力信创建设。 150来个生态插件&#xff0c;覆盖各种不同的应用…

不知道Redis?来这里可以带你快速学完Redis,干活满满!

文章目录一、NoSQL的基本介绍二、为什么要使用NoSQL&#xff0c;难道SQL不够你用吗&#xff1f;三、Redis的基本概念四、Redis基本操作命令五、Redis五大数据类型及其操作命令六、三种特殊的数据类型及其操作命令七、 Redis事务八、Redis对key的监控九、Redis数据库密码十、Jed…

广州蓝景分享—8大Web前端开发的趋势

2023 年 1 月 11 日&#xff0c;2022 年度 StateOfJS 调查结果正式公布&#xff01;StateOfJS 是前端生态圈中比较有影响力的且规模较大的数据调查。本文就来解读一下 2022 年 StateOfJS 的调查结果&#xff01; JavaScript 发展很快&#xff0c;但似乎 JavaScript 开发人员的…

《传感器技术》考试学习笔记

文章目录一、选择题二、简答题1.什么是传感器&#xff1f;传感器的共性是哪些&#xff1f;2.差动变气隙式传感器电感传感器的灵敏度推导过程是什么&#xff08;推导公式&#xff09;&#xff1f;与单极性进行比较它们的优缺点是哪些&#xff1f;3.霍尔传感器如何进行微位移测量…

uniapp上实现左右关联滚动

先看效果&#xff1a; 代码&#xff1a; <template><view class"container"><!-- 左侧fixed导航区域 --><view class"left"><viewv-for"item in leftList":key"item.id"class"left_item":class…

JVM结构-类加载(类加载子系统,类加载的角色,类加载的过程,类加载器分类,双亲委派机制,类的主/被动使用)

JVM 结构-类加载2.1类加载子系统2.2类加载的角色2.3类加载的过程2.3.1加载2.3.2链接2.3.3初始化2.4类加载器分类2.4.1 引导类加载器2.4.2扩展类加载器2.4.3应用程序类加载器2.5双亲委派机制2.6类的主动/被动使用2.1类加载子系统 类加载器子系统负责从文件系统或者网络中加载 cl…

【深度强化学习】(1) DQN 模型解析,附Pytorch完整代码

大家好&#xff0c;今天和各位讲解一下深度强化学习中的基础模型 DQN&#xff0c;配合 OpenAI 的 gym 环境&#xff0c;训练模型完成一个小游戏&#xff0c;完整代码可以从我的 GitHub 中获得&#xff1a; https://github.com/LiSir-HIT/Reinforcement-Learning/tree/main/Mod…

腾讯云新用户怎么配置服务器的方法教程

腾讯云新用户怎么配置服务器&#xff1f;腾讯云服务器配置选择攻略&#xff0c;先选择云服务器地域和可用区&#xff0c;然后根据用户使用场景需要平衡型、计算型或高IO型等特性来选择云服务器CVM实例规格&#xff0c;主机教程网来详细说下腾讯云服务器配置选择攻略。 1、腾讯云…

政府工作报告连提9年科技创新 企业研发如何“又快又好”

今年的政府工作报告&#xff0c; “科技创新” 这一描述连续出现7次&#xff0c;这也是自2015年开始&#xff0c; “科技创新” 这一概念在全国“两会”政府工作报告中连续九年被提到。政府工作报告指出&#xff0c;科技政策要聚焦自立自强&#xff0c;完善新型举国体制&#x…

ccc-pytorch-LSTM(8)

文章目录一、LSTM简介二、LSTM中的核心结构三、如何解决RNN中的梯度消失/爆炸问题四、情感分类实战&#xff08;google colab&#xff09;一、LSTM简介 LSTM&#xff08;long short-term memory&#xff09;长短期记忆网络&#xff0c;RNN的改进&#xff0c;克服了RNN中“记忆…