首页 > 编程语言 >【算法设计】实验五分支限界法(附源代码)

【算法设计】实验五分支限界法(附源代码)

时间:2024-03-18 23:59:52浏览次数:23  
标签:scanner int System vexs 算法 static new 源代码 限界

这里写目录标题

一、上机目的

1、通过分支限界法的示例程序进一步理解分支限界法的基本思想;
2、运用分支限界法解决实际问题,进一步加深对分支限界法的理解和运用

二、上机内容与要求

1、分析并掌握“单源最短路径” 问题的分支限界法求解方法;
2、练习使用分支限界法求解“装载”问题;

三、上机步骤

1.理解分支限界法思想和算法示例;
2.上机输入和调试算法示例程序;
3.理解实验题的问题要求;
4.上机输入和调试自己所编的实验题程序;
5.验证并分析实验题的实验结果;
6.整理出实验报告;

四、上机结果

1、将课本6.2节单源最短路径算法改为程序,并进行测试和验证

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

class ArcCell {
    int adj;  // 保存权值
    int info; // 存储最短路径长度
}

public class GraphPath {

    static ArcCell[][] AdjMatrix = new ArcCell[100][100];
    static VerType[] vexs = new VerType[100];
    static int vexnum;
    static int arcnum;
    static Queue<Integer> q = new LinkedList<>();

    static class VerType {
        int data;
        int length;
    }

    static void CreateGraph() {
        Scanner scanner = new Scanner(System.in);
        int m, n, t;
        System.out.print("输入顶点数和弧数:");
        vexnum = scanner.nextInt();
        arcnum = scanner.nextInt();
        System.out.print("输入顶点:");
        for (int i = 1; i <= vexnum; i++) {
            vexs[i] = new VerType();
            vexs[i].data = scanner.nextInt();
            vexs[i].length = 10000;
        }

        for (int i = 1; i <= vexnum; i++)
            for (int j = 1; j <= vexnum; j++) {
                AdjMatrix[i][j] = new ArcCell();
                AdjMatrix[i][j].adj = 0;
            }

        System.out.println("输入弧及权重:");
        for (int i = 1; i <= arcnum; i++) {
            m = scanner.nextInt();
            n = scanner.nextInt();
            t = scanner.nextInt();
            AdjMatrix[m][n].adj = 1;
            AdjMatrix[m][n].info = t;
        }
    }

    static int NextAdj(int v, int w) {
        for (int i = w + 1; i <= vexnum; i++)
            if (AdjMatrix[v][i].adj != 0)
                return i;
        return 0; // not found;
    }

    static void ShortestPaths(int v) {
        int k = 0; // 从首个节点开始访问
        int t;
        vexs[v].length = 0;
        q.offer(vexs[v].data);
        while (!q.isEmpty()) {
            t = q.poll();
            k = NextAdj(t, k);
            while (k != 0) {
                if (vexs[t].length + AdjMatrix[t][k].info <= vexs[k].length) {
                    vexs[k].length = vexs[t].length + AdjMatrix[t][k].info;
                    q.offer(vexs[k].data);
                }
                k = NextAdj(t, k);
            }
        }
    }

    static void Print() {
        for (int i = 1; i <= vexnum; i++)
            System.out.println(vexs[i].data + "------" + vexs[i].length);
    }

    public static void main(String[] args) {
        CreateGraph();
        ShortestPaths(1);
        Print();
    }
}

在这里插入图片描述

2、将课本6.3节装载问题改为程序,并进行测试和验证。

import java.util.PriorityQueue;
import java.util.Scanner;

class MaxHeapQNode {
    MaxHeapQNode parent;  // 父节点
    int lchild;           // 左节点: 1; 右节点: 0
    int weight;           // 总重量
    int lev;              // 层次
}

class MaxLoading {
    static int n;
    static int c;
    static int bestw;
    static int[] w;
    static int[] bestx;

    public static void main(String[] args) {
        InPut();
        MaxLoading();
        OutPut();
    }

    static void InPut() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Input1:");
        n = scanner.nextInt();
        System.out.println("Input2:");
        c = scanner.nextInt();
        System.out.println("Input3:");
        w = new int[n + 1];
        bestx = new int[n + 1];
        for (int i = 1; i <= n; ++i)
            w[i] = scanner.nextInt();
    }

    static void AddAliveNode(PriorityQueue<MaxHeapQNode> q, MaxHeapQNode E, int wt, int i, int ch) {
        MaxHeapQNode p = new MaxHeapQNode();
        p.parent = E;
        p.lchild = ch;
        p.weight = wt;
        p.lev = i + 1;
        q.add(p);
    }

    static void MaxLoading() {
        PriorityQueue<MaxHeapQNode> q = new PriorityQueue<>((a, b) -> Integer.compare(b.weight, a.weight));
        // 定义剩余重量数组r
        int[] r = new int[n + 1];
        r[n] = 0;
        for (int j = n - 1; j > 0; --j)
            r[j] = r[j + 1] + w[j + 1];
        int i = 1;
        MaxHeapQNode E = new MaxHeapQNode();
        int Ew = 0;
        while (i != n + 1) {
            if (Ew + w[i] <= c) {
                AddAliveNode(q, E, Ew + w[i] + r[i], i, 1);
            }
            AddAliveNode(q, E, Ew + r[i], i, 0);

            // 取下一节点
            E = q.poll();
            i = E.lev;
            Ew = E.weight - r[i - 1];
        }
        bestw = Ew;
        for (int j = n; j > 0; --j) {
            bestx[j] = E.lchild;
            E = E.parent;
        }
    }

    static void OutPut() {
        System.out.println("最优装载量为 " + bestw);
        System.out.println("装载的物品为 ");
        for (int i = 1; i <= n; ++i)
            if (bestx[i] == 1)
                System.out.print(i + " ");
    }
}

在这里插入图片描述

在这里插入图片描述

标签:scanner,int,System,vexs,算法,static,new,源代码,限界
From: https://blog.csdn.net/a1234567822/article/details/136683217

相关文章

  • 【算法与数据结构】二叉树链式结构的实现【前中后序】
    文章目录......
  • 【算法】多路归并(鱼塘钓鱼)
    有 N 个鱼塘排成一排,每个鱼塘中有一定数量的鱼,例如:N=5 时,如下表:鱼塘编号12345第1分钟能钓到的鱼的数量(1..1000)101420169每钓鱼1分钟钓鱼数的减少量(1..100)24653当前鱼塘到下一个相邻鱼塘需要的时间(单位:分钟)3544即:在第 11 个鱼塘中钓鱼第 11 分钟内可钓到 1010 条鱼,......
  • Bostan-Mori 算法
    EI哥哥科普到OI界的科技……最近出现了基于这个的多项式复合/复合逆复杂度的突破,所以今天去看了一下。这是一个用于解决多项式有理分式的单项系数问题\([x^n]\frac{P}{Q}\)的算法。该算法在解决常系数齐次线性递推问题时,代码明显短很多,常数相较原方法极其优越。首先我们考......
  • 代码随想录算法训练营day27 | leetcode 39. 组合总和、40. 组合总和 II、131. 分割回
    目录题目链接:39.组合总和-中等题目链接:40.组合总和II-中等题目链接:131.分割回文串-中等题目链接:39.组合总和-中等题目描述:给你一个无重复元素的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的所有不同组合,并以列表形......
  • 【字符串匹配】BF与KMP算法
    一、字符串匹配问题字符串匹配问题是指在一个主文本字符串中查找一个指定的模式字符串,并确定模式字符串在主文本中出现的位置。这个问题在计算机科学中非常常见,尤其是在文本处理、数据搜索和生物信息学等领域。字符串匹配问题通常涉及到以下几个方面:模式识别:识别主文本中是......
  • AcWing 1171. 距离 Tarjan算法离线求LCA
    题目输入样例1:22121001221输出样例1: 100100输入样例2:32121031151232输出样例2: 1025LCA算法:LCA(LeastCommonAncestors)最近公共祖先Tarjan求LCA是一种离线的算法,也就是说它一遍求出所有需要求的点的LCA,而不是需要求哪两个点再去求......
  • Unity类银河恶魔城学习记录11-1 p103 Item源代码
     Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考此代码仅为较上一P有所改变的代码【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibiliItemData.csusingSystem.Collections;usingSystem.Collections.Generic;usingUn......
  • Unity类银河恶魔城学习记录10-14 p102 Applying damage to skills and clean up源代码
     Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考此代码仅为较上一P有所改变的代码【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibiliEntity.csusingSystem.Collections;usingSystem.Collections.Generic;usingUnit......
  • 代码随想录算法训练营第五十天| ● 123.买卖股票的最佳时机III ● 188.买卖股票的
    买卖股票的最佳时机III  题目链接:123.买卖股票的最佳时机III-力扣(LeetCode)思路:与买卖股票2的区别在于我可以买卖两次,那么dp数组的状态就从两种变成了种,即第一次持有,第一次卖出,第二次持有,第二次卖出,注意这四种状态是不会同时存在的,除此之外还有一种状态,那就是不操作。if(......
  • 基于实体抽取-SMC-语义向量的大模型能力评估通用算法(附代码)
    大模型相关目录大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容从0起步,扬帆起航。大模型应用向开发路径及一点个人思考大模型应用开发实用开源项目汇总大模型问答项目问答性能评估方法大模型......