数模·图论

news2024/11/15 20:11:49

matlab中图的表示

顶点集+权值集的形式

s是源点,t是终点,w是对应的权值
调用graph(s,t,w)作为参数创建图
调用plot函数绘图plot(G,'EdgeLabel',G.Edges.Weight,'LineWidth',2)
设置x和y的坐标范围set(gca,'XTick',[],'YTick',[])

s=[1 2 3];
t=[4 1 2];
w=[5 2 6];
G=graph(s,t,w);
plot(G,'EdgeLabel',G.Edges.Weight,'LineWidth',2);
set(gca,'XTick',[],'YTick',[]);%设置x和y的坐标范围

*邻接矩阵转图(常见)

调用matlab中的特殊数据结构graph和digraph,传入邻接矩阵A
graph指的是无向图,digraph指的是有向图,graph只接受对称矩阵

  • 无向图
%% matlab中邻接矩阵转无向图
clear;clc;
A = [0 1 0 0 2;%矩阵A必须是对称的,这样直接传入是错误的!!!
     1 0 3 0 0;
     0 0 0 4 0;
     0 0 0 0 5;
     0 0 0 5 0];
G = graph(A);%直接转换
plot(G,"EdgeLabel",G.Edges.Weight,'LineWidth',2);
set(gca,'XTick',[],'YTick',[]);%设置x和y的坐标范围
  • 有向图
%% matlab中邻接矩阵转有向图
clear;clc;
A = [0 1 0 0 2;
     1 0 3 0 0;
     0 0 0 4 0;
     0 0 0 0 5;
     0 0 0 5 0];
G = digraph(A);%直接转换
plot(G,"EdgeLabel",G.Edges.Weight,'LineWidth',2);
set(gca,'XTick',[],'YTick',[]);%设置x和y的坐标范围

最短路算法

数模里使用的单源最短路算法一般都是指dijsktra算法,也可以使用Bellman算法

dijsktra算法

  • 注意负权值不可以使用dijsktra算法

matlab代码

需要注意的是:dijsktra朴素版一般采取邻接矩阵存储,matlab中一般只接受图作为参数,要将邻接矩阵转换为有向图
P指路径数组,d指最短距离

%% dijkstra算法
[P,d]=shortestpath(G,1,4);%路径数组和距离
disp(P);disp(d);





网络最大流

网络最大流问题的概念

  • 流量图
    在这里插入图片描述

就是一条边的权值不再是一个值了,而是一个元组(c,x)分别表示最大流量和当前流量,如下图所示
在这里插入图片描述

  • 可行流

进来的流量始终等于出去的流量

在这里插入图片描述

  • 增广链

在这里插入图片描述

Ford Fulkerson算法

不断寻找增广链,直到再也找不到为止
对于一条增广链,将顶点标号为+/-表示前向弧或反向弧,delta表示流量增加,取一条链上最小的增量,对于一条弧,如果是前向弧则增加delta,否则减小
邻接矩阵c表示最大流量,x表示当前流量,这个操作可以通过邻接矩阵顺利完成
如果没有路径可以采取DFS/BFS搜索创造路径
必须注意的是,局部最优不一定就是全局最优,表现题目中在一个管道的流量全部占满不一定是全局最优解,为了解决这个问题,我们会添加负权值的反向弧供程序反悔

在这里插入图片描述

matlab代码

maxflow函数,接受图作为参数,传入起点和终点返回mf作为当前网络最大流

%% matlab求解网络最大流问题
clear;clc;
a=zeros(7);
a(1,2)=4;a(1,4)=3;a(1,5)=10;
a(2,3)=1;a(2,4)=3;a(3,7)=7;
a(4,3)=4;a(4,6)=5;a(5,3)=3;
a(5,4)=3;a(5,6)=4;a(6,7)=8;
matrix=digraph(a);
plot(matrix,"EdgeLabel",matrix.Edges.Weight,"LineWidth",2);
mf=maxflow(matrix,1,7)%%不接受邻接矩阵,只接受有向图





最小费用最大流问题

在这里插入图片描述

简单来说既要最短权值消耗,又要尽可能多的流量

解题思路

优先进行最短路径算法,因为在最大流算法中,必定会引入负权值的边供程序进行反悔操作,所以不能使用dijsktra算法,要么使用Bellman要么使用Floyd算法,以下采用Floyd算法

Floyd算法

动态规划的思想,不多说了,注意把路径记录下来(利用path存储中继结点)

function[path,dis]=Floyd(w)
    dis=w;
    n=size(w);
    path=zeros(n);
    for k=1:n
        for i=1:n
            for j=1:n
                if(dis(i,k)+dis(k,j)<dis(i,j))
                    dis(i,j)=dis(i,k)+dis(k,j);
                    path(i,j)=k;
                end
            end
        end
    end
end

最终代码(详细注释)

注意cost的计算方式cost_all=cost_all+delta*w(mypath(i-1),mypath(i));
添加弧的过程不要搞错对象

cost_all=0;
vector=input("请输入出发点和终点");
while(1)%死循环
    [path,dis]=Floyd(w);
    i=vector(1);
    j=vector(2);
    mypath=[j];
    %获取路径数组
    while path(i,j)~=0
        j=path(i,j);
        mypath=[mypath j];%matlab中数组拼接操作

    end

    mypath=[i fliplr(mypath)];
    if size(mypath,2)==2%%如果size等于2说明没有最短路了
        break;
    end

    %计算最大流过程
    max_x=[+inf];
    for i=2:size(mypath,2)%%注意size也是默认对行求长度
        max_x=[max_x min(max_x(i-1),c(mypath(i-1),mypath(i))-x(mypath(i-1),mypath(i)))];
    end

    delta=min(max_x);

    %每条边加上流量
    for i=2:size(mypath,2)
        x(mypath(i-1),mypath(i))=x(mypath(i-1),mypath(i))+delta;
        cost_all=cost_all+delta*w(mypath(i-1),mypath(i));%这里是增量乘以权值
    end

    %添加弧的过程
    for i=2:size(mypath,2)
        if(x(mypath(i-1),mypath(i)))==c(mypath(i-1),mypath(i))
            %只能添加反向弧
            w(mypath(i),mypath(i-1))=-w(mypath(i-1),mypath(i));
            %删除原弧
            c(mypath(i-1),mypath(i))=0;
            w(mypath(i-1),mypath(i))=+inf;
        end
        if x(mypath(i-1),mypath(i))<c(mypath(i-1),mypath(i))&&x(mypath(i-1),mypath(i))>0
            w(mypath(i),mypath(i-1))=-w(mypath(i-1),mypath(i));
        end
    end

    %统计费用的过程
end
disp("最小费用最大流的结果是");cost_all





旅行商TSP问题

在这里插入图片描述

解题思路

从本质来讲,这是一个哈密顿回路,我们需要做的就是不断改变以下结点相互之间的顺序(源点和终点不变),最终取得合法的最优解
注意这个最优解不是全局最优解,极度依赖于初始回路的顺序

在这里插入图片描述

改良圈算法

简单来说,如果两个顶点i和j间存在一条路径满足以下约束,我们尝试改变其原有次序,让他们两个顶点优先靠在一起
因为改变了次序,为了得到合法的回路,我们必须反转i+1~j原有次序。

在这里插入图片描述

具体步骤

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

matlab代码

这个算法本质上就是暴力模拟,枚举所有的改变方式
注意取值范围 i<i+1<j
以下对k的遍历是为了逐步逼近局部最优解,但即使是这样,也不能保证找到全局最优解

%% 旅行熵问题
clear;clc;
A = [0 56 21 35;%邻接矩阵
     56 0 49 39;
     21 49 0 77;
     35 39 77 0;]
L=size(A,1);%长度是哈密顿图长度-1
c=[1 2 3 4 1];
res=+inf;
for k=1:L
    flag=0;
    %暴力模拟选i和j的情况,注意TSP要求i<i+1<j,
    for i=1:L-2;
        for j=i+2:L
            %反转i+1~j的路径
            if A(c(i),c(j))+A(c(i+1),c(j+1))<A(c(i),c(i+1))+A(c(j),c(j+1))
                c(i+1:j)=c(j:-1:i+1);%反转i+1~j的路径
                flag=1;
            end
        end
    end
    if flag==1
        temp=0;
        for i=1:L
            temp=temp+A(c(i),c(i+1));
        end
        res=min(res,temp);
    end
end
res
%需要注意的是,这个求法依赖于种子c的取值

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

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

相关文章

程序包不存在【java: 程序包org.springframework.boot不存在】

1、问题提示&#xff1a;java: 程序包org.springframework.boot不存在 注意&#xff1a;已经下载好了程序包&#xff0c;就是提示不存在 2、解决办法

一个开源完全免费的无损视频或音频的剪切/裁剪/分割/截取和视频合并工具

大家好&#xff0c;今天给大家分享一款致力于成为顶尖跨平台FFmpeg图形用户界面应用的软件工具LosslessCut。 LosslessCut是一款致力于成为顶尖跨平台FFmpeg图形用户界面应用的软件工具&#xff0c;专为实现对视频、音频、字幕以及其他相关媒体资产的超高速无损编辑而精心打造。…

《后端程序猿 · EasyPOI 导入导出》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

蓝桥杯嵌入式第十五届模拟考试3解析

1 题目 2 程序 /* USER CODE BEGIN PTD */ char buf1[20],buf2[20],buf3[20],buf4[20],buf5[20],buf6[20],buf7[20],buf8[20],buf9[20]; struct keys {int step;int length;int state; }key[5]; int display; double v1,v2; int t; double v1l1.2,v1u2.2,v2l1.4,v2u3.0; dou…

深度学习复盘与论文复现D

文章目录 一、新环境搭建与适应1、easy_install和pip的安装使用2、关于安装包超时的解决方案3、brew安装包安装4、使用新环境运行以前项目5、解决win的pycharm修改内存后无法启动 二、Dataset 数据读取问题1、Lightning Torch 读取数据2、Pytorch的DataLoader数据读取机制3、Py…

Dify中的经济索引模式实现过程

当索引模式为经济时&#xff0c;使用离线的向量引擎、关键词索引等方式&#xff0c;降低了准确度但无需花费 Token。 一.提取函数**_extract** 根据不同文档类型进行内容的提取&#xff1a; def _extract(self, index_processor: BaseIndexProcessor, dataset_document: Data…

力扣经典题目之->移除值为val元素的讲解,的实现与讲解

一&#xff1a;题目 博主本文将用指向来形象的表示下标位的移动。 二&#xff1a;思路 1&#xff1a;两个整形&#xff0c;一个start&#xff0c;一个end&#xff0c;在一开始都 0&#xff0c;即这里都指向第一个元素。 2&#xff1a;在查到val之前&#xff0c;查一个&…

C语言 ——— 将一句英语短句中的单词进行倒置

目录 题目要求 代码实现 题目要求 将一句英语短句中的单词进行倒置&#xff0c;标点符号不倒置 如&#xff1a; 输入&#xff1a;"I like chongqing very much," 输出&#xff1a;"much, very chongqing like I" 代码实现 #include<stdio.h> #i…

c#与欧姆龙PLC通信——如何更改PLC的IP地址

前言 我们有时候需要改变欧姆龙Plc的ip地址,下图有两种更改方式,一种是已知之前Plc设置的Ip地址,还有一种是之前不知道Pl的Ip地址是多少,下面分别做介绍。 1、已知PLC的IP地址的情况下更改地址 假设已知PLC的Ip地址,比如本文中PLC的IP为192.168.1.2,我首先将电脑的IP地…

搭建调用链监控Zipkin和Sleuth

项目环境: win7、jdk8 1、添加依赖&#xff0c;添加了spring-cloud-starter-zipkin会自动导入Sleuth <!--Sleuth&#xff0c;zipkin--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</…

安卓onNewIntent 什么时候执行

一.详细介绍 onNewIntent 方法 onNewIntent 是 Android 中 Activity 生命周期的一部分。它在特定情况下被调用&#xff0c;主要用于处理新的 Intent&#xff0c;而不是创建新的 Activity 实例。详细介绍如下&#xff1a; 使用场景 singleTop 启动模式&#xff1a; 如果一个 Ac…

python+mysql图书管理系统,谈谈思路及实现代码

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

【链表】算法题(一) ---- 力扣 / 牛客

一、移除链表元素 移除链表中值为val的元素&#xff0c;并返回新的头节点 思路&#xff1a; 题目上这样说&#xff0c;我们就可以创建一个新的链表&#xff0c;将值不为val的节点&#xff0c;尾插到新的链表当中&#xff0c;最后返回新链表的头节点。 typedef struct ListNo…

java《字符串进阶篇》--习题逐语句分析及认识链式编程

一、前言 字符串相关的习题分享&#xff0c;随着学习的深入&#xff0c;应该要多做一些习题来巩固知识点&#xff0c;而不是一味的去学习新的东西。这几天尽可能地去给大家分享一些常用的方法及习题的讲解&#xff0c;希望大家认真观看&#xff0c;每一道题都有对应的分析。基…

GAMMA数据处理(八)

新学习了一个命令&#xff1a; SLC_cat_ScanSAR - Concatenate sequential ScanSAR burst SLC images (Sentinel-1, TSX, RCM...)&#xff0c;做数据拼接的。之前一直没有涉及到拼接问题&#xff0c;就一直没管。如果研究区包含两景SLC&#xff0c;可以拼接成一景。但是不知道…

计算机丢失CH375DLL怎么办,CH375DLL.DLL;计算机找不到CH375DLL怎么办,CH375DLL.DLL

翻遍CSDN&#xff0c;发现的文章不是只有描述不给资源&#xff0c;要不就是资源收费。 真是狗屎啊&#xff1b; 在千辛万苦找到资源后&#xff0c;我决定写一篇&#xff1b; 首先是资源文件下载 我上传的&#xff1a;&#xff08;肯定是0积分&#xff0c;如果收费了告诉我&…

Nuxt.js 错误侦探:useError 组合函数

title: Nuxt.js 错误侦探&#xff1a;useError 组合函数 date: 2024/7/14 updated: 2024/7/14 author: cmdragon excerpt: 摘要&#xff1a;文章介绍Nuxt.js中的useError组合函数&#xff0c;用于统一处理客户端和服务器端的错误&#xff0c;提供statusCode、statusMessage和…

IOT 可编程控制系统

IOT&#xff08;物联网&#xff09;可编程控制系统&#xff0c;如GF-MAXCC等&#xff0c;是一种集成了多种先进技术和功能的智能化控制设备&#xff0c;它能够在物联网系统中发挥关键作用&#xff0c;实现对多种设备的集中管理和控制。具体来说&#xff0c;IOT可编程控制系统的…

7天学会CANOpen

本系列文章&#xff0c;主要介绍CANOpen的学习知识&#xff0c;能够全面掌握CANOpen原理。文章会不定期的更新。 学习基础&#xff1a;CAN通信。 1. CANOpen通信协议1 2. CANOpen对象字的理解 3. CANOpen之CAN-ID、NODE-ID、COB-ID 4. CanOpen报文类型 5. CANO报文---SDO…

python 怎样生成窗体

通过import tkinter导入Tkinter模块&#xff0c;没有这句下面的都不成立了。 wintkinter.Tk()&#xff0c;这句是创建windows的窗口对象&#xff0c;注意后面的Tk&#xff0c;大小写。 win.title("窗口")&#xff0c;这段是设置窗口上的标题。 另外窗口的大小你可以通…