HNU-算法设计与分析-作业6

第六次作业【分支限界法】

在这里插入图片描述

文章目录

    • 第六次作业【分支限界法】
      • <1> 算法实现题6-2 最小权顶点覆盖问题
      • <2> 算法实现题6-6 n后问题
      • <3> 算法实现题6-7 布线问题

<1> 算法实现题6-2 最小权顶点覆盖问题

▲问题重述

问题描述:
给定一个赋权无向图 G=(V,E),每个顶点 v∈V 都有一个权值 w(v)。如果 U⊆VU⊆V,且对任意(u,v)∈E 有 u∈U 或 v∈U,就称 U 为图 G 的一个顶点覆盖。G 的最小权顶点覆盖是指 G 中所含顶点权之和最小的顶点覆盖。

算法设计:
对于给定的无向图 G,设计一个优先队列式分支限界法,计算 G 的最小权顶点覆盖。

数据输入:
由文件input.txt给出输入数据。第 1 行有 2 个正整数 n 和 m,表示给定的图 G 有 n 个顶点和 m 条边,顶点编号为 1,2,…,n。第 2 行有 n 个正整数表示 n 个顶点的权。接下来 的 m 行中,每行有 2 个正整数 u,v,表示图 G 的一条边(u,v)。

结果输出:
将计算的最小权顶点覆盖的顶点权之和以及最优解输出到文件output.txt。文件的第1行是最小权顶点覆盖顶点权之和;第2行是最优解xi(1<=i<=n),xi=0表示顶点i不在最小权顶点覆盖中,xi=1表示顶点i在最小权顶点覆盖中。

输入文件示例
input.txt
7 7
1 100 1 1 1 100 10
1 6
2 4
2 5
3 6
4 5
4 6
6 7

输出文件示例
output.txt
13
1 0 1 0 1 0 1

▲解题思路

  1. 定义一个最小堆 MinHeap 类,用于实现堆操作。
  2. HeapNode 类表示图中的一个顶点。DealNode 类包含一些操作,主要是用于处理堆中结点的操作。
  3. DealNode::BBVC() 方法是该算法的核心部分。通过不断地加入和不加入某个顶点,并通过堆来遍历所有可能的情况,找到图的最小顶点覆盖。
  4. MinCover 函数是对 DealNode::BBVC() 方法的封装,用于获取最终的最小顶点覆盖权重。
  5. main 函数中,用户输入了图的顶点数 vertexNum 和边数 edgeNum。然后输入每个顶点的权值,并通过边的信息构建了图的邻接矩阵。
  6. 调用 MinCover 函数得到最小顶点覆盖权重,并输出结果。

▲代码

#include <fstream>
#include <iostream>
using namespace std;

template <class Type>
class MinHeap // 最小堆类;
{
public:
    MinHeap(Type a[], int n);   // 带两参数的构造函数,在此程序中没有应用;
    MinHeap(int ms);            // 构造函数重载,只初始化堆的大小,对堆中结点不初始化;另外,堆元素的存储是以数组
    ~MinHeap();                 // 形式,且无父、子指针,访问父亲结点,利用数组标号进行;
    bool Insert(const Type &x); // 插入堆中一个元素;
    bool RemoveMin(Type &x);    // 删除堆顶最小结点;
    void MakeEmpty();           // 使堆为空
    bool IsEmpty();
    bool IsFull();
    int Size();

protected:
    void FilterDown(const int start, const int endOfHeap); // 自顶向下构造堆
    void FilterUp(const int start);                        // 自底向上构造堆
private:
    Type *heap;
    int maxSize;
    const int defaultSize;
    int currentSize; // 堆当前结点个数大小
};

template <class Type>
MinHeap<Type>::MinHeap(int ms) : defaultSize(100)
{
    maxSize = (ms > defaultSize) ? ms : defaultSize;
    heap = new Type[maxSize];
    currentSize = 0;
}

template <class Type>
MinHeap<Type>::MinHeap(Type a[], int n) : defaultSize(100)
{
    maxSize = (n > defaultSize) ? n : defaultSize;
    heap = new Type[maxSize];
    currentSize = n;
    for (int i = 0; i < n; i++)
        heap[i] = a[i];
    int curPos = (currentSize - 2) / 2;
    while (curPos >= 0)
    {
        FilterDown(curPos, currentSize - 1);
        curPos--;
    }
}

template <class Type>
MinHeap<Type>::~MinHeap()
{
    delete[] heap;
}

template <class Type>
void MinHeap<Type>::FilterDown(const int start, const int endOfHeap)
{
    int i = start, j = i * 2 + 1;
    Type temp = heap[i];
    while (j <= endOfHeap)
    {
        if (j < endOfHeap && heap[j] > heap[j + 1])
            j++;
        if (temp < heap[j])
            break;
        else
        {
            heap[i] = heap[j];
            i = j;
            j = 2 * i + 1;
        }
    }
    heap[i] = temp;
}

template <class Type>
void MinHeap<Type>::FilterUp(const int start)
{
    int i = start, j = (i - 1) / 2;
    Type temp = heap[i];
    while (i > 0)
    {
        if (temp >= heap[j])
            break;
        else
        {
            heap[i] = heap[j];
            i = j;
            j = (i - 1) / 2;
        }
    }
    heap[i] = temp;
}

template <class Type>
bool MinHeap<Type>::RemoveMin(Type &x)
{
    if (IsEmpty())
    {
        cerr << "Heap empty!" << endl;
        return false;
    }
    x = heap[0];
    heap[0] = heap[currentSize - 1];
    currentSize--;
    FilterDown(0, currentSize - 1);
    return true;
}

template <class Type>
bool MinHeap<Type>::Insert(const Type &x)
{
    if (IsFull())
    {
        cerr << "Heap Full!" << endl;
        return false;
    }
    heap[currentSize] = x;
    FilterUp(currentSize);
    currentSize++;
    return true;
}

template <class Type>
bool MinHeap<Type>::IsEmpty()
{
    return currentSize == 0;
}

template <class Type>
bool MinHeap<Type>::IsFull()
{
    return currentSize == maxSize;
}

template <class Type>
void MinHeap<Type>::MakeEmpty()
{
    currentSize = 0;
}

template <class Type>
int MinHeap<Type>::Size()
{
    return currentSize;
}

// 最小堆结点
class HeapNode // 堆结点类;
{
    friend class DealNode;

public:
    operator int() const { return cn; }

private:
    int i,  // i标示堆中结点号
        cn, // cn标示当前加入的覆盖顶点中权重之和
        *x, // x数组标示那些顶点加入了覆盖顶点的行列
        *c; // c数组标示X中的覆盖顶点中所有的邻接顶点
};

// VC类用来对堆中结点内部的的操作
class DealNode
{
    friend int MinCover(int **, int[], int);

private:
    void BBVC();
    bool cover(HeapNode E);
    void AddLiveNode(MinHeap<HeapNode> &H, HeapNode E, int cn, int i, bool ch);
    int **a, n, *w, *bestx, bestn;
};

void DealNode::BBVC()
{
    // 建立初始空堆
    MinHeap<HeapNode> H(1000);
    HeapNode E;
    E.x = new int[n + 1];
    E.c = new int[n + 1];
    for (int j = 1; j <= n; j++)
    {
        E.x[j] = E.c[j] = 0;
    }

    int i = 1, cn = 0;
    while (true)
    {
        if (i > n)
        {
            if (cover(E))
            {
                for (int j = 1; j <= n; j++)
                    bestx[j] = E.x[j];
                bestn = cn;
                break;
            }
        }
        else
        {
            if (!cover(E))
                AddLiveNode(H, E, cn, i, true); // 加入结点标号为i 的结点到顶点覆盖集中,并把更新后的结点再插入堆中
            AddLiveNode(H, E, cn, i, false);    // 不把结点标号为 i 的结点加入到顶点覆盖集中,并把更新后的结点插入堆中
        }
        if (H.IsEmpty())
            break;
        H.RemoveMin(E); // 取堆顶点赋给E
        cn = E.cn;
        i = E.i + 1;
    }
}

// 检测图是否被覆盖
bool DealNode::cover(HeapNode E)
{
    for (int j = 1; j <= n; j++)
    {
        if (E.x[j] == 0 && E.c[j] == 0) // 存在任意一条边的两个顶点都为0的情况下,为未覆盖情况
            return false;               // X[j]记录覆盖顶点,c[j]记录与覆盖顶点相连的顶点 0表征未覆盖,1表征已覆盖
    }
    return true;
}

void DealNode::AddLiveNode(MinHeap<HeapNode> &H, HeapNode E, int cn, int i, bool ch)
{
    HeapNode N;
    N.x = new int[n + 1];
    N.c = new int[n + 1];
    for (int j = 1; j <= n; j++)
    {
        N.x[j] = E.x[j];
        N.c[j] = E.c[j];
    }
    N.x[i] = ch ? 1 : 0;

    if (ch)
    {
        N.cn = cn + w[i]; // 记录i顶点是否加入覆盖的行列中;
        for (int j = 1; j <= n; j++)
            if (a[i][j] > 0) // 如果i,j相邻,刚把j顶点加入覆盖邻接顶点集中;
                N.c[j]++;
    }
    else
    {
        N.cn = cn;
    }
    N.i = i;
    H.Insert(N); // 插入堆中
}

int MinCover(int **a, int v[], int n)
{
    DealNode Y;
    Y.w = new int[n + 1];
    for (int j = 1; j <= n; j++)
    {
        Y.w[j] = v[j]; // 初始化DealNode类对象Y;
    }
    Y.a = a;
    Y.n = n;
    Y.bestx = v; // 将地址赋予bestx,
    Y.BBVC();
    return Y.bestn; // bestn是最后的最小顶点覆盖集权重;
}

int main()
{
    int startV, endV;       // 一条边的起始节点,终止节点
    int vertexNum, edgeNum; // 顶点数,边数
    int i;

    cin >> vertexNum >> edgeNum;

    int **a; // 图的邻接矩阵表示,1表示有边
    a = new int *[vertexNum + 1];

    for (int k = 0; k <= vertexNum; k++)
        a[k] = new int[vertexNum + 1];
    for (int i = 0; i <= vertexNum; i++)
        for (int j = 0; j <= vertexNum; j++)
            a[i][i] = 0;

    int *p; // 顶点的权值数组
    p = new int[vertexNum + 1];
    for (i = 1; i <= vertexNum; i++)
        cin >> p[i];

    for (i = 1; i <= edgeNum; i++)
    {
        cin >> startV >> endV;
        a[startV][endV] = 1;
        a[endV][startV] = 1;
    }

    int minVertex = MinCover(a, p, vertexNum);
    cout << minVertex << endl;
    for (i = 1; i <= vertexNum; i++)
    {
        cout << p[i] << " ";
    }
    cout << endl;

    return 0;
}

▲验证

在这里插入图片描述

<2> 算法实现题6-6 n后问题

▲问题重述

设计一个解n后问题的队列式分支限界法,计算在n × n n\times nn×n个方格上放置彼此不受攻击的n个皇后的一个放置方案。
案例

input
5
output
1 3 5 2 4

▲解题思路

  1. 定义一个结构体node,表示棋盘上的每一个可能的位置,以及记录了当前状态的一些信息,如列、左右对角线等的占用情况。
  2. 使用优先队列priority_queue来存储搜索过程中的状态,按照结构体中的x值进行排序。这里的x表示当前放置的皇后所在的行数。
  3. 在主循环中,初始化棋盘的初始状态,将第一行的每一个位置作为起点,生成相应的初始状态,并加入优先队列中。
  4. 进入主循环,每次从优先队列中取出一个状态,判断是否达到了目标状态(即放置了所有皇后),如果是则输出解,并结束程序(因为只需要找到一个可行解即可)。
  5. 如果当前状态不是目标状态,继续在下一行尝试放置皇后。遍历每一列,对于每一个可行的位置,生成新的状态并加入优先队列中。
  6. 在生成新状态时,进行剪枝操作,检查当前位置是否与之前的皇后冲突,如果冲突则跳过该位置。
  7. 重复以上步骤,直到找到一个解或者队列为空。由于采用优先队列,搜索时会先尝试最有希望的位置,加速找到解的过程。

▲代码

#include <bits/stdc++.h>
using namespace std;
#define N 100
int n;
struct node
{
    int vis[N] = {0}, col[N] = {0}, lr[N] = {0}, rl[N] = {0};
    int x, y;
    node(int a, int b) : x(a), y(b) {}
    bool operator<(const node &a) const
    {
        return x < a.x;
    }
};
priority_queue<node> q;
int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        node temp = node(0, i);
        temp.vis[0] = i + 1;
        temp.col[i] = 1;
        temp.rl[temp.x + temp.y] = 1;
        temp.lr[50 + temp.x - temp.y] = 1;
        q.push(temp);
    }
    while (!q.empty())
    {
        node temp = q.top();
        q.pop();
        if (temp.x == n - 1)
        {
            for (int i = 0; i < n; i++)
            {
                cout << temp.vis[i] << " ";
            }
            cout << endl;
            break; // 只需要给出一个答案即可
        }
        if (temp.x < n - 1)
        {
            for (int i = 0; i < n; i++)
            {
                node next = node(temp.x + 1, i);
                if (temp.col[next.y] || temp.lr[50 + next.x - next.y] || temp.rl[next.x + next.y])
                { // 剪枝
                    continue;
                }
                for (int i = 0; i < N; i++)
                {
                    next.lr[i] = temp.lr[i];
                    next.rl[i] = temp.rl[i];
                    next.col[i] = temp.col[i];
                }
                next.col[next.y] = 1;
                next.lr[50 + next.x - next.y] = 1;
                next.rl[next.x + next.y] = 1;
                for (int i = 0; i < next.x; i++)
                {
                    next.vis[i] = temp.vis[i];
                }
                next.vis[next.x] = i + 1;
                q.push(next);
            }
        }
    }
    return 0;
}

▲验证

验证了n=5,10,15三种情况。

在这里插入图片描述

<3> 算法实现题6-7 布线问题

▲问题重述

在这里插入图片描述

▲解题思路

  1. MinHeap 类定义了最小堆,用于存储待处理的状态。该堆的元素是 BoardNode 类型的对象。
  2. BoardNode 类表示电路板的一种摆放方式,包含了一些必要的信息。len 方法用于计算电路板摆放的长度。
  3. BBArrangeBoards 函数是基于分支限界法的核心算法。它通过不断生成摆放状态,使用最小堆来搜索可能的最优解。HeapSize 为堆的大小。
  4. Make2DArray 函数用于动态创建二维数组。
  5. main 函数中,用户输入了电路板数量 n。通过 Make2DArray 创建了二维数组 B,表示电路板之间的连接关系。然后调用 BBArrangeBoards 函数求解问题,并输出最小长度和对应的摆放方式。

▲代码

#include <array>
#include <bits/stdc++.h>
#include <queue>
using namespace std;
int n, *p;
template <class Type>
class MinHeap // 最小堆类;
{
public:
    MinHeap(Type a[], int n);   // 带两参数的构造函数,在此程序中没有应用;
    MinHeap(int ms);            // 构造函数重载,只初始化堆的大小,对堆中结点不初始化;另外,堆元素的存储是以数组
    ~MinHeap();                 // 形式,且无父、子指针,访问父亲结点,利用数组标号进行;
    bool Insert(const Type &x); // 插入堆中一个元素;
    bool RemoveMin(Type &x);    // 删除堆顶最小结点;
    void MakeEmpty();           // 使堆为空
    bool IsEmpty();
    bool IsFull();
    int Size();

protected:
    void FilterDown(const int start, const int endOfHeap); // 自顶向下构造堆
    void FilterUp(const int start);                        // 自底向上构造堆
private:
    Type *heap;
    int maxSize;
    const int defaultSize;
    int currentSize; // 堆当前结点个数大小
};

template <class Type>
MinHeap<Type>::MinHeap(int ms) : defaultSize(100)
{
    maxSize = (ms > defaultSize) ? ms : defaultSize;
    heap = new Type[maxSize];
    currentSize = 0;
}

template <class Type>
MinHeap<Type>::MinHeap(Type a[], int n) : defaultSize(100)
{
    maxSize = (n > defaultSize) ? n : defaultSize;
    heap = new Type[maxSize];
    currentSize = n;
    for (int i = 0; i < n; i++)
        heap[i] = a[i];
    int curPos = (currentSize - 2) / 2;
    while (curPos >= 0)
    {
        FilterDown(curPos, currentSize - 1);
        curPos--;
    }
}

template <class Type>
MinHeap<Type>::~MinHeap()
{
    delete[] heap;
}

template <class Type>
void MinHeap<Type>::FilterDown(const int start, const int endOfHeap)
{
    int i = start, j = i * 2 + 1;
    Type temp = heap[i];
    while (j <= endOfHeap)
    {
        if (j < endOfHeap && heap[j] > heap[j + 1])
            j++;
        if (temp < heap[j])
            break;
        else
        {
            heap[i] = heap[j];
            i = j;
            j = 2 * i + 1;
        }
    }
    heap[i] = temp;
}

template <class Type>
void MinHeap<Type>::FilterUp(const int start)
{
    int i = start, j = (i - 1) / 2;
    Type temp = heap[i];
    while (i > 0)
    {
        if (temp >= heap[j])
            break;
        else
        {
            heap[i] = heap[j];
            i = j;
            j = (i - 1) / 2;
        }
    }
    heap[i] = temp;
}

template <class Type>
bool MinHeap<Type>::RemoveMin(Type &x)
{
    if (IsEmpty())
    {
        cerr << "Heap empty!" << endl;
        return false;
    }
    x = heap[0];
    heap[0] = heap[currentSize - 1];
    currentSize--;
    FilterDown(0, currentSize - 1);
    return true;
}

template <class Type>
bool MinHeap<Type>::Insert(const Type &x)
{
    if (IsFull())
    {
        cerr << "Heap Full!" << endl;
        return false;
    }
    heap[currentSize] = x;
    FilterUp(currentSize);
    currentSize++;
    return true;
}

template <class Type>
bool MinHeap<Type>::IsEmpty()
{
    return currentSize == 0;
}

template <class Type>
bool MinHeap<Type>::IsFull()
{
    return currentSize == maxSize;
}

template <class Type>
void MinHeap<Type>::MakeEmpty()
{
    currentSize = 0;
}

template <class Type>
int MinHeap<Type>::Size()
{
    return currentSize;
}

class BoardNode
{
    friend int BBArrangeBoards(int **, int, int *&);

public:
    operator int() const { return cd; }
    int len(int **, int ii);

private:
    int *x, s, cd;
};

int BoardNode::len(int **conn, int ii)
{
    int sum = 0;
    for (int i = 1, sum = 0; i <= ii; i++)
    {
        for (int j = i + 1; j <= ii; j++)
        {
            int dist = x[i] > x[j] ? x[i] - x[j] : x[j] - x[i];
            sum += conn[i][j] * dist;
        }
    }
    return sum;
}

int BBArrangeBoards(int **conn, int n, int *&bestx)
{
    int HeapSize = 10;
    MinHeap<BoardNode>
        H(HeapSize);
    BoardNode E;
    E.x = new int[n + 1];
    E.s = 0;
    E.cd = 0;
    for (int i = 1; i <= n; i++)
        E.x[i] = i;
    int bestd = INT_MAX;
    bestx = 0;
    while (E.cd < bestd)
    {
        if (E.s == n - 1)
        {
            int ld = E.len(conn, n);
            if (ld < bestd)
            {
                delete[] bestx;
                bestx = E.x;
                bestd = ld;
            }
            else
                delete[] E.x;
        }
        else
        {
            for (int i = E.s + 1; i <= n; i++)
            {
                BoardNode N;
                N.x = new int[n + 1];
                N.s = E.s + 1;
                for (int j = 1; j <= n; j++)
                    N.x[j] = E.x[j];
                N.x[N.s] = E.x[i];
                N.x[i] = E.x[N.s];
                N.cd = N.len(conn, N.s);
                if (N.cd < bestd)
                    H.Insert(N);
                else
                    delete[] N.x;
            }
        }
        delete[] E.x;
    }
    try
    {
        H.RemoveMin(E);
    }
    catch (...)
    {
        return bestd;
    }
    while (true)
    {
        delete[] E.x;
        try
        {
            H.RemoveMin(E);
        }
        catch (...)
        {
            break;
        }
    }
    return bestd;
}

template <class T>
void Make2DArray(T **&x, int rows, int cols)
{
    x = new T *[rows];
    for (int i = 0; i < rows; ++i)
    {
        x[i] = new T[cols];
    }
}

int main()
{
    cin >> n;
    p = new int[n + 1];
    int **B;
    Make2DArray(B, n + 1, n + 1);
    for (int i = 1; i <= n - 1; i++)
        for (int j = i + 1; j <= n; j++)
            cin >> B[i][j];
    cout << BBArrangeBoards(B, n, p) << endl;
    for (int i = 1; i <= n; i++)
        cout << p[i] << " ";
    cout << endl;
    return 0;
}

▲验证

书上案例验证通过。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从融媒到智媒,小程序框架可助力传媒企业在AI实践下的服务变现

过去5年&#xff0c;媒体行业一直都在进行着信息化建设向融媒体平台建设的转变。一些融媒体的建设演变总结如下&#xff1a; 新闻终端的端侧内容矩阵建设&#xff0c;如App新闻端&#xff0c;社交平台上的官方媒体等 新闻本地生活双旗舰客户端&#xff0c;兼顾主流媒体核心宣传…

Android 10.0 Launcher3定制folder文件夹2x2布局之三foldericon的2x2的布局后拖拽只能停放在右边的问题修复

1.前言 在10.0的系统rom产品定制化开发中,在对Launcher3的folder文件夹功能定制中,要求folder文件夹跨行显示,就是 2x2布局显示,默认的都是占1格的,现在要求占4格显示,系统默认是不支持显示4格的,所以接下来需要分析相关的 功能,然后来实现这个功能 2.Launcher3定制fo…

HNU-算法设计与分析-作业2

第二次作业【分治算法】 文章目录 第二次作业【分治算法】<1>算法实现题 2-2 马的Hamilton周游路线问题<2> 算法实现题 2-3 半数集问题<3>算法实现题 2-6 排列的字典序问题<4> 算法实现题 2-7 集合划分问题 <1>算法实现题 2-2 马的Hamilton周游路…

某东-绑卡

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872 本文章未…

代码随想录--链表--反转链表

题目 题意&#xff1a;反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 思路 如果再定义一个新的链表&#xff0c;实现链表元素的反转&#xff0c;其实这是对内存空间的浪费。 其实只需要改变链表的next指针的…

柯桥外语成人教育之生活口语培训“January and May”才不是“一月和五月”!真正的意思差远了!

“January and May”正确翻译是&#xff1f; 一月跟五月这八杆子打不到的月份能有什么关系&#xff1f;为什么要放在一起说&#xff1f;其实&#xff0c;它们不仅有关系而且还很亲密。 这个俚语起源于英国作家乔叟所著的《坎特伯雷故事集》中“商人的故事”&#xff1a; Januar…

【重生之我在学Android】WorkManager (章一)

相关文章 【重生之我在学Android原生】ContentProvider(Java) 【重生之我在学Android原生】Media3 【重生之我在学Android】WorkManager &#xff08;章一&#xff09; 前言 官方文档 官方推荐 - 前台服务、后台服务都可以使用WorkManger来实现 案例 语言&#xff1a;JA…

Leetcode---1.两数之和 (详解加哈希表解释和使用)

文章目录 题目 [两数之和](https://leetcode.cn/problems/two-sum/)方法一&#xff1a;暴力枚举代码方法二&#xff1a;哈希表代码 哈希表哈希表的基本概念哈希函数&#xff08;Hash Function&#xff09;&#xff1a;冲突&#xff08;Collision&#xff09;&#xff1a;链地址…

Linux查看进程命令ps和top

Linux 是一种自由和开放源代码的操作系统&#xff0c;它的使用在全球范围内非常广泛。在 Linux 中&#xff0c;进程是操作系统中最重要的组成部分之一&#xff0c;它代表了正在运行的程序。了解如何查看正在运行的进程是非常重要的&#xff0c;因为它可以帮助你了解系统的运行状…

Qwen学习笔记4:Qwen 7B模型调用天气API实现天气的实时查询

前言 在学习Qwen模型的函数调用功能后&#xff0c;进一步尝试利用本地的Qwen模型访问OpenWeather API来获取实时的天气情况。 参考代码来源于视频教程&#xff1a; 简单粗暴&#xff0c;轻松配置Qwen模型查询实时数据功能_哔哩哔哩_bilibili 说明 该代码运行前&#xff0c…

基于51单片机的AD/DA转换的串口通信proteus仿真(附源码)

文章目录 一、前言二、PCF85911.介绍2.原理图3.引脚介绍 三、仿真图1.未仿真时2.仿真时 四、仿真程序main.cIIC.c 五、总结 一、前言 AT89C52是一款经典的8051系列单片机&#xff0c;它通常不包含内置的模数转换器&#xff08;ADC&#xff09;或数字模拟转换器&#xff08;DAC…

「Python绘图」绘制奥运五环

python 绘制奥运五环 一、预期结果 二、核心代码 import turtle print("开始绘制奥运五环")# 创建Turtle对象 pen turtle.Turtle() pen.shape("turtle") pen.pensize(8)print("绘制蓝色圆") pen.up() pen.goto(50-170,0) pen.down() pen.color…

进程信号 signal

文章目录 信号基础信号的产生OS中的时间 信号的保存sigset_tsigprocmasksigpending 信号的捕捉用户态和内核态sigactionvolatile SIGCHLD 信号基础 生活中的信号 你在网上买了很多件商品&#xff0c;再等待不同商品快递的到来。但即便快递没有到来&#xff0c;你也知道快递来临…

HNU-算法设计与分析-作业5

第五次作业【回溯算法】 文章目录 第五次作业【回溯算法】<1> 算法分析题5-3 回溯法重写0-1背包<2> 算法分析题5-5 旅行商问题&#xff08;剪枝&#xff09;<3> 算法实现题5-2 最小长度电路板排列问题<4> 算法实现题5-7 n色方柱问题<5> 算法实现…

[论文阅读]FINE-TUNE THE PRETRAINED ATST MODEL FOR SOUND EVENT DETECTION

摘要 本研究提出了一种微调预训练模型ATST&#xff08;音频师生转换模型&#xff09;的方法&#xff0c;用于声音事件检测&#xff08;SED&#xff09;。通过引入ATST-Frame模型&#xff0c;该方法在DCASE挑战任务4数据集上取得了新的SOTA结果&#xff0c;有效解决了预训练模型…

Leetcode - 130双周赛

目录 一&#xff0c;3142. 判断矩阵是否满足条件 二&#xff0c;3143. 正方形中的最多点数 三&#xff0c;3144. 分割字符频率相等的最少子字符串 四&#xff0c;3145. 大数组元素的乘积 一&#xff0c;3142. 判断矩阵是否满足条件 本题题意&#xff0c;满足每一列的数全部…

LLama3大模型本地部署 仅需6步完成对话模型本地安装部署。附送可视化ui安装、自定义模型目录,修改模型保存地址,第三方微调模型、中文模型下载地址

本篇分为三部分 一&#xff1a;6步完成llama3大模型本地部署 二&#xff1a;8步完成llama3可视化对话界面安装 三&#xff1a;重设模型文件路径 四&#xff1a;微调模型、中文模型下载资源分享 一、LLama3 大模型本地部署安装 首先去mata官网下载ollama客户端 Ollama 选择合适…

Linux操作系统最著名的两大系列Red Hat和Debian

Linux操作系统可以根据其背后的项目或社区分为不同的系列&#xff0c;其中最著名的两大系列是Red Hat系列和Debian系列。 1.著名的两大系列是Red Hat和Debian Red Hat系列&#xff1a; Red Hat Enterprise Linux (RHEL)&#xff1a;这是Red Hat公司推出的企业级操作系统&#…

计算机网络-路由策略与路由控制一

到目前为止我们学习了路由与交换基础&#xff0c;路由协议有静态、RIP、OSPF、IS-IS等&#xff0c;但是根据实际组网需求&#xff0c;往往需要实施一些路由策略对路由信息进行过滤、属性设置等操作&#xff0c;通过对路由的控制&#xff0c;可以影响数据流量转发。 因此我们开始…

Vitis HLS 学习笔记--资源绑定-使用URAM(1)

目录 1. 简介 2. 代码分析 2.1 存储器代码 2.2 Implementation报告 2.3 存储器类型指定 2.4 存储器初始化 3. 总结 1. 简介 在博文《Vitis HLS 学习笔记--资源绑定-使用URAM-CSDN博客》中&#xff0c;介绍了如何在Vitis HLS环境下设计一个简易的存储器模型。 通过以下…