实验五 分支限界法

news2024/11/27 11:52:06

实验五  分支限界法

01背包问题的分治限界法的实现

剪枝函数

限界函数

1.实验目的

1、理解分支限界法的剪枝搜索策略,掌握分支限界法的算法框架

2、设计并实现问题,掌握分支限界算法。

2.实验环境

java

3.问题描述

给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?

4.复杂度

算法整体的时间复杂度主要由回溯操作的时间复杂度决定,在最坏情况下为O(2^n)。然而,在实际应用中,由于剪枝操作的存在,实际的分支数会远远小于2^n,因此算法的执行时间通常会有所缩减。

5.算法实现

package shiyan5;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

class Item {
    int weight;
    int value;
    double density; // 物品的单位价值(价值重量比)

    public Item(int weight, int value) {
        this.weight = weight;
        this.value = value;
        this.density = (double) value / weight;
    }
}

public class BranchAndBound {
    static List<Item> items;
    static int capacity;
    static int maxTotalValue;
    static List<Item> selectedItems;

    public static void main(String[] args) {
        readInputData("input.txt");
        branchAndBound();
        writeOutputData("output.txt");
    }

    private static void readInputData(String filename) {
        try {
            File file = new File(filename);
            Scanner scanner = new Scanner(file);

            int n = scanner.nextInt();
            capacity = scanner.nextInt();
            items = new ArrayList<>();

            for (int i = 0; i < n; i++) {
                int weight = scanner.nextInt();
                int value = scanner.nextInt();
                items.add(new Item(weight, value));
            }

            scanner.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void branchAndBound() {
        Collections.sort(items, (a, b) -> Double.compare(b.density, a.density)); // 按单位价值从大到小排序

        maxTotalValue = 0;
        selectedItems = new ArrayList<>();

        backtrack(0, 0, 0);

        // 按照物品的原始顺序排序
        Collections.sort(selectedItems, (a, b) -> Integer.compare(items.indexOf(a), items.indexOf(b)));
    }

    private static void backtrack(int level, int currentWeight, int currentValue) {
        if (level == items.size() || currentWeight == capacity) {
            if (currentValue > maxTotalValue) {
                maxTotalValue = currentValue;
                selectedItems.clear();
                for (int i = 0; i < level; i++) {
                    if (items.indexOf(items.get(i)) != -1) {
                        selectedItems.add(items.get(i));
                    }
                }
            }
            return;
        }

        if (currentWeight + items.get(level).weight <= capacity) {
            currentWeight += items.get(level).weight;
            currentValue += items.get(level).value;

            backtrack(level + 1, currentWeight, currentValue);

            currentWeight -= items.get(level).weight;
            currentValue -= items.get(level).value;
        }

        if (bound(level + 1, currentWeight, currentValue) > maxTotalValue) {
            backtrack(level + 1, currentWeight, currentValue);
        }
    }

    private static double bound(int level, int currentWeight, int currentValue) {
        double maxBound = currentValue;
        int currentLevel = level;
        int currentWeightSum = currentWeight;

        while (currentWeightSum < capacity && currentLevel < items.size()) {
            if (currentWeightSum + items.get(currentLevel).weight <= capacity) {
                currentWeightSum += items.get(currentLevel).weight;
                maxBound += items.get(currentLevel).value;
            } else {
                double remainingWeight = capacity - currentWeightSum;
                maxBound += (remainingWeight / items.get(currentLevel).weight) * items.get(currentLevel).value;
                break;
            }
            currentLevel++;
        }

        return maxBound;
    }

    private static void writeOutputData(String filename) {
        try {
            FileWriter writer = new FileWriter(filename);
            writer.write("背包中物品的总价值: " + maxTotalValue);
            writer.write("\n\n已选物品列表:\n");

            for (Item item : selectedItems) {
                writer.write("重量: " + item.weight + ", 价值: " + item.value);
                writer.write("\n");
            }

            writer.close();
            System.out.println("输出成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

输入

 运行

输出

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

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

相关文章

JMeter基础入门教程之CSV数据文件设置CSV Data Set Config

最近在做压力测试&#xff0c;登录功能用到了配置元件&#xff1a;CSV 数据文件设置&#xff0c;可以将登录用户名和密码放在一个csv文件中&#xff0c;然后通过CSV数据文件设置元件读取出来&#xff0c;用来做压测。 一、CSV文件 CSV文件小知识分享&#xff1a;是指"逗号…

Linux内核--内存管理

MMU的产生背景 在计算机出现的早期&#xff0c;其内存资源十分有限&#xff0c;一般只有几十几百KB&#xff0c;当时的程序规模也小&#xff0c;对于当时的程序而言&#xff0c;KB级的内存资源尚足够使用。但随着计算机技术的发展&#xff0c;应用程序的规模不断膨胀&#xff…

k8s部署wordpress+mysql博客平台

k8s部署wordpressmysql博客平台 1、yaml文件准备1.1 wordpress-db.yaml1.2 wordpress.yaml 2、部署安装2.1 先创建wordpress命名空间2.2 部署wordpress-db2.3部署wordpress 3、访问测试 1、yaml文件准备 1.1 wordpress-db.yaml apiVersion: apps/v1kind: Deploymentmetadata:…

【flink】ColumnarRowData

列式存储 在调试flink读取parquet文件时&#xff0c;读出来的数据是ColumnarRowData&#xff0c;由于parquet是列式存储的文件格式&#xff0c;所以需要用一种列式存储的表示方式&#xff0c;ColumnarRowData就是用来表示列式存储的一行数据&#xff0c;它包含多个数组的数据结…

Matlab求解基于RRT算法的自定义垛型的路径避障

目录 背景 1 RRT搜索算法 2 基于Matlab的RRT搜索算法 3 基于Matlab的自定义垛型绘制 4 基于RRT算法的自定义垛型的路径避障 背景 在码垛机械臂路径规划过程中&#xff0c;需要根据现有箱子的码垛状态&#xff0c;给出下一个箱子的最佳码放无碰撞路径。RRT 快速搜索随机…

vue2项目 自定义详情组件

vue2项目 自定义详情组件 效果组件代码组件引入以及传参格式寄语 效果 组件代码 DetailFormRow.vue已经封装好&#xff0c;根据数据格式直接引用即可。 <template><div class"detail-form"><el-row class"detail-form-row" style"ma…

基本函数、常见曲线图像

基本函数图像是指一些常见的数学函数的图像&#xff0c;这些函数在数学和工程等领域中经常被使用。下面是一些常见的基本函数及其图像&#xff1a; 参考文献&#xff1a;同济版高等数学【第七版】上下册教材

几张表格搞定Mysql的SQL语句

一、数据库的登录与退出 登录Mysqlmysql -uroot -p123退出Mysqlexit 二、对数据库的操作 查询所有数据库show databases;创建数据库create database 数据库名字;删除数据库drop database 数据库名字;查询创建数据库的具体语句show create database 数据库名字;使用数据库use…

自学网络安全(黑客),遇到问题怎么解决

自学网络安全很容易学着学着就迷茫了&#xff0c;找到源头问题&#xff0c;解决它就可以了&#xff0c;所以首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题&#xff0c;看到后面有惊喜哦 1、打基础时间太长 学基础花费很长时间&#xff0c;光语言都有几门&#xf…

RocketMQ的系统设计

消息存储 下图为producer、broker、consumer的交互过程 1.消息存储整体架构 CommitLog&#xff1a;消息主体以及元数据的存储主体&#xff0c;存储Producer端写入的消息主体内容(即Producer端投递的消息都会先写入CommitLog中)&#xff0c;消息内容不是定长的。单个文件大小默…

代码随想录day8 | KMP 28.实现strStr() 459.重复的子字符串

文章目录 一、实现strStr()二、重复的子字符串 一、实现strStr() 先学学KMP算法&#xff0c;代码随想录 28.实现strStr() class Solution { public:void getNext(int* next, const string& s) {int j -1;next[0] j;for(int i 1; i < s.size(); i) { // 注意i从1开始…

win 安装虚拟机 再安装macos

0 视频教程 windows虚拟机一键安装苹果系统macos&#xff0c;轻松拥有xcode环境_哔哩哔哩_bilibili在windows环境下vmware虚拟机一键安装macos Catalina10.15.7苹果系统&#xff0c;帮助学习ios编程的朋友们实现xcode环境。文字教程&#xff1a;https://www.dhzy.fun/archives…

【Matlab】基于遗传算法优化 BP 神经网络的数据分类预测(Excel可直接替换数据)

【Matlab】基于遗传算法优化 BP 神经网络的数据分类预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.文件结构3.Excel数据4.分块代码4.1 arithXover.m4.2 delta.m4.3 ga.m4.4 gabpEval.m4.5 initializega.m4.6 maxGenTerm.m4.7 nonUnifMutation.m4.8 normGeomSel…

Qt ComboBox 下拉框设置多列

Qt ComboBox 下拉框设置多列 通过设置listview实现。 class MultiColumnComboBoxItemDelegate; class MultiColumnComboBoxListView;class MultiColumnComboBox : public QComboBox {Q_OBJECT public:explicit MultiColumnComboBox(QWidget *parent nullptr);~MultiColumnCo…

Linux -- 进阶 自动挂载服务 ( autofs ) 介绍及安装 主配置文件分析

背景引入 &#xff1a; 针对于 挂载 &#xff0c; 大家有没有思考过一个问题&#xff0c;如果我们需要挂载的文件或访问的远程数据甚至只是挂载一些设备&#xff0c;如果太多的话&#xff0c;数量很大的话&#xff0c;那 光每次挂载 敲的 mount 命令&#xff0c;都得敲很多遍…

Flask 文件上传,删除上传的文件

目录结构 app.py from flask import Flask, request, render_template, redirect, url_for import osapp Flask(__name__) BASE_DIR os.getcwd() UPLOAD_FOLDER os.path.join(BASE_DIR, testfile)app.route(/) def home():files os.listdir(UPLOAD_FOLDER)return render_t…

如何对maven项目进行打jar包,出现不能打包的情况

若没有正确执行相应的操作,就会出现模块依赖无法找到的情况 Could not find artifact xxx:caro2o-system:pom:3.8.5 in public (https://maven.aliyun.com/repository/public)正确的打包操作 1.将现有的包清空 2.重新下载包 3.为确保数据正确,再次进行打包操作 4.观察控制…

【Python】基于Python和Qt的海康威视相机开发

文章目录 0 前期教程1 前言2 例程解析3 图像获取4 其他问题与解决办法5 使用到的python包 0 前期教程 【项目实践】海康威视工业相机SDK开发小白版入门教程&#xff08;VS2015OpenCV4.5.1&#xff09; 1 前言 此前写了一篇基于C开发海康威视相机的博客&#xff0c;貌似看的人…

设计模式结构型——享元模式

目录 什么是享元模式 享元模式的实现 享元模式的特点 什么是享元模式 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;享元模式中的“享元”指被共享的单元&#xff0c;享元模式通过复用对象&#xff0c;以达到节省内存的目的。要求能够…

[数学建模] [2019年A 模拟练习][层次分析法、熵值法、多目标优化、主成分分析法] 4. 深圳居民健康水平评估与测控模型研究

1、前言 2019年“深圳杯”数学建模挑战赛A题 原题&#xff0c;这个是当时学校内部校赛所作&#xff0c;为了拿到参加国赛名额&#xff0c;也权当是做一个简单的练手。 本次练习属于综合评判类&#xff0c;常用的方法无非 层次分析法、熵值法、多目标优化、主成分分析法 等&am…