当前位置: 首页 > news >正文

大数据机器学习算法与计算机视觉应用02:线性规划

Linear Programming

  • Definition of linear programming
  • max and min-cost max flow
  • linear program to solve minimax optimal strategies in games
  • Algoithms for linear programming
  • l1 regression
  • Seidel’s 2-dimensional linear programming algorithm

linear program 线性规划

线性规划包含以下几个特征:

  1. 包含 n n n个变量 x 1 , x 2 , ⋯ , x n x_1,x_2,\cdots,x_n x1,x2,,xn
  2. 所有的限制条件都是变量的线性组合
  3. 目标函数也是这些变量的线性组合并且求最大值
  4. 没有乘积

所有的限制条件都满足是大于等于(小于等于)的话,这个线性规划称为是有边界的,否则就是没有边界的。
对于一些没有边界的线性规划,目标函数可能没有最大值。

max and min-cost max flow最大流

Modeling Network Flow

网络流模型是一种常见的算法模型,其主要包含以下几个组成部分:

  1. 变量:对于每条边 ( u , v ) (u,v) (u,v), f u v f_{uv} fuv表示这条边的流的大小
  2. 目标:最大化最终节点 T T T接收到的流
  3. 限制条件:
    • 每条边上的流不能超过这条边的承载能力(每条边上的流存在最大值)
    • 除了源点 S S S和最终节点 T T T之外,其他节点进入的流量总和等于输出的流量总和。

一个例子如下:
网络流图

min-cost max flow 最小开销最大流

每条边 ( u , v ) (u,v) (u,v)都有一个最大负载 c ( u , v ) c(u,v) c(u,v)和成本 w ( u , v ) w(u,v) w(u,v),目标则是设法让每条边流量和单位成本的乘积总和最小,也就是
min ⁡ ∑ ( u , v ) ∈ E w ( u , v ) f u v \min \sum\limits_{(u,v)\in E}^ {} w(u,v)f_{uv} min(u,v)Ew(u,v)fuv

这个问题如何解决呢?

第一种方法:先求最大流 f f f,然后优化目标函数。

第二种方法:连接终点和源点 ( T , S ) (T,S) (T,S)并让这条边的单位成本为一个很大的负值,这样计算目标函数的同时就保证了最大流。

review: Zero Sum Game

之前的零和博弈和我们刚刚的最大流问题有点相似。他们都有如下的共同点:

变量:一堆变量说明:在零和博弈中是执行各种动作的概率,在最大流问题中是每条边的流量。

目标:都是变量的线性组合。在零和博弈中,是概率和对应收益乘积的总和(收益给定),在最大流问题中,是通往终点所有流量的总和。

约束条件:也是变量的线性组合。

Linear Program to solve minimax optimal strategies in games

线性规划的一般形式如下:

目标函数: c ⃗ T X ⃗ \vec{c}^T\vec{X} c TX

约束条件: A X ⃗ ≤ b A\vec{X} \leq b AX b

每个约束条件都将变量的向量空间的超平面分割成两个半平面,多个半平面的交集被称为可行域

如果可行域是空集,说明该线性规划是不可行的。线性规划可以是没有边界的,但是一般都是可行的,否则目标函数无解。

一般来说,可行域都是一个凸集。这保证可行域一般只有唯一解。

Algorithms for Linear Programming

常见的线性规划算法包括:

  • Simplex Algorithm 单纯形法:这种方法简单使用,但是在最坏情况下需要指数时间复杂度。
  • Ellipsoid Algorithm 椭球算法:具有多项式的时间复杂度,但是实际运行较慢
  • Karmarkar’s Algorithm(interior point) 卡马卡算法:同样多项式的时间复杂度,而且运行较快

这里不做详细算法解释,只做大致介绍。

Simplex Algorithm

单纯形法从可行域的一个顶点开始,依次和附近的点比较,如果发现新的最大值,就进行迁移。

Ellipsoid algorithm

椭球算法将目标函数替换为一个约束条件,并且使用二分查找方法。

Karmarkar’s algorithm

卡马卡方法又被称作内部点方法,它寻找最优解的方法并非从可行域边界的一个顶点出发,而是从可行域内部的一个点开始。

L1 Regression

线性回归是另外一种形式的线性规划,它的背景是求解向量方程 A x ⃗ = b ⃗ \mathbf{A}\vec{x} = \vec{b} Ax =b

在许多情况下,这个方程是没有精确解的,这个时候我们转而去计算最接近的解,也就是要求
min ⁡ Σ i = 1 , … , n ∣ A x ⃗ − b ⃗ ∣ \min\Sigma_{i=1,\dots,n}|\mathbf{A}\vec{x}-\vec{b}| minΣi=1,,nAx b 对应的 x ⃗ \vec{x} x

为什么这是一种线性规划?

我们可以将线性回归视作如下表述:对 A \mathbf{A} A的每一行 A i \mathbf{A_i} Ai,都有约束条件
A i x ⃗ − b i ≤ s i \mathbf{A_i}\vec{x}-b_i \leq s_i Aix bisi

A i x ⃗ − b i ≥ − s i \mathbf{A_i}\vec{x}-b_i \geq -s_i Aix bisi
目标函数则是求
min ⁡ Σ i = 1 , … , n s i \min \Sigma_{i=1,\dots,n}s_i minΣi=1,,nsi
对于线性回归问题,我们一般使用的是最小二乘法,这里不再赘述了。

Seidel’s 2-dimensional linear programming algorithm

在解决一个二维线性规划问题时,以下的一个算法可以作为参考:

假设约束条件是 a i x ∗ ⃗ ≤ b i a_i\vec{x^*}\leq b_i aix bi
我们递归寻找 a 2 x ∗ ⃗ ≤ b 2 , … , a m x ∗ ⃗ ≤ b m a_2\vec{x^*}\leq b_2,\dots,a_m\vec{x^*}\leq b_m a2x b2,,amx bm的对应最优解。
接下来,对应 a 1 a_1 a1有两种情况:

  1. 先前的最优解满足新的约束条件,那么先前的最优解就是整体最优解,时间复杂度很明显是 O ( 1 ) O(1) O(1)
  2. 新的约束条件给出了新的最优解。这个时候需要计算新的最优解,遍历新的约束条件和先前 m − 1 m-1 m1个约束条件的交点依次计算是否最优,时间复杂度是 O ( m ) O(m) O(m)

那么这个算法总共的时间复杂度满足:
T ( m ) = T ( m − 1 ) + O ( m ) T(m) = T(m-1)+O(m) T(m)=T(m1)+O(m)
可得该算法的最坏时间复杂度是 O ( m 2 ) O(m^2) O(m2)

我们能不能优化以下,让这个算法的期望时间复杂度变为 O ( m ) O(m) O(m)呢?这就是Seidel算法。

(注意,这里的算法一般不指代高斯-赛德尔迭代法,后者一般用于运动学求数值解)。

Seidel’s Algorithm 非常简单,就是在随机排列上述的约束条件后进行相同的递归算法。那么,为什么随机排布一下之后,这个算法的期望时间复杂度就变成了 O ( m ) O(m) O(m)呢?原因就是,随机排布之后,第二种遍历的情况大大减少了。

我们知道最优解一定在两条约束条件 a i , a j a_i,a_j ai,aj的交点上,那么其中一个在最新的这一步出现的概率是多少呢?
很明显概率是:
2 × ( m − 1 ) ! ( m ) ! = 2 m 2 \times \frac{(m-1)!}{(m)!} = \frac{2}{m} 2×(m)!(m1)!=m2
因此每步递归的期望时间复杂度为:
( 1 − 2 m ) O ( 1 ) + 2 m O ( m ) = O ( 1 ) (1-\frac{2}{m})O(1) + \frac{2}{m}O(m) = O(1) (1m2)O(1)+m2O(m)=O(1)
总算法的期望时间复杂度为:
T ( m ) = T ( m − 1 ) + O ( 1 ) T ( m ) = O ( m ) T(m) = T(m-1) + O(1) T(m) = O(m) T(m)=T(m1)+O(1)T(m)=O(m)

相关文章:

大数据机器学习算法与计算机视觉应用02:线性规划

Linear Programming Definition of linear programmingmax and min-cost max flowlinear program to solve minimax optimal strategies in gamesAlgoithms for linear programmingl1 regressionSeidel’s 2-dimensional linear programming algorithm linear program 线性规…...

godot——主题、Theme、StyleBox

我刚开始被这些术语吓到了,一直不敢去接触它们,都用的默认样式。现在好不容易有点思路了,记录下来。 下面看看怎么自定义样式。 1.先新建一个Theme 2.再次点击创建好的Theme 得到 图1 这样一个面板。(看不懂没事,继…...

深入理解接口测试:实用指南与最佳实践5.0(一)

✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…...

SQL面试题——飞猪SQL面试 重点用户

飞猪SQL面试题—重点用户 在一些场景中我们经常听到这样的一些描述,例如20%的用户贡献了80%的销售额,或者是20%的人拥有着80%的财富,你知道这样的数据是怎么算出来的吗 数据如下,uid 是用户的id ,amount是用户的消费金额 |uid|amount| ---…...

Angular 和 Vue2.0 对比

前言 :“业精于勤,荒于嬉;行成于思,毁于随” 很久没写博客了,大多记录少进一步探查。 Angular 和 Vue2.0 对比: 一.概念 1.1 Angular 框架: 是一款由谷歌开发的开源web前端框架(核…...

websocket服务器(协程风格)--swoole进阶篇

swoole的websocket服务器(协程风格)示例真不算友善,从头了解到尾,那还好,但是谁有那么多时间从头到尾了解。示例不够针对性,写websocket就该单独写websocket的东西,偏偏又加上http的东西。这里我来解读一下websocket服务器(协程风格)示例 <?php use Swoole\Http\…...

Windows C/C++ Socket 编程

承接上文&#xff1a;socket 编程 本文目录 Windows Client 端WSADATA 结构体WSAStartup() 函数SOCKET 以及 socket() 函数sockaddr_ininet_pton() 函数in_addr structmemcpy()connect() 函数send() 函数recv() 函数 Windows Server 端 在进行 socket 编程之前&#xff0c;你要…...

计算两个结构的乘法

在行列可自由变换的平面上&#xff0c;2点结构有3个 3点结构有6个 计算2*2 2a1*2a14a6 2a1*2a24a8 2a1*2a34a12 显然2a1*2a14a6因为这3个结构都分布在同一列上&#xff0c;就是整数乘法。2a1*2a2的结果有2种写法&#xff0c;一种外形像2a1细节为2a2&#xff0c;一种外形为2…...

学校服务器连接pycharm配置2

上一个可能还是有点问题&#xff0c;因为实际在跑的时候读取的其实是本地的anaconda&#xff0c;这个重新整了一下流程 首先在学校服务器先激活自己创建的虚拟环境&#xff0c;这里就不截图了 然后在pycharm里面打开设置 选择这个python解释器 这里有添加解释器 选择SSH …...

AI赋能电商:创新应用提升销售与用户体验

目录 一、引言 二、AI技术在电商领域的创新应用 三、AI技术提高电商销售效率和用户体验的实践路径 一、引言 随着人工智能&#xff08;AI&#xff09;技术的不断成熟&#xff0c;电商行业正迎来一场深刻的变革。AI技术在购物推荐、会员分类、商品定价等方面的创新应用&…...

详解kafka消息发送重试机制的案例

在 Kafka 生产者中实现消息发送的重试机制&#xff0c;可以通过配置 KafkaProducer 的相关属性来实现。以下是一些关键的配置项&#xff1a; retries&#xff1a;设置生产者发送失败后重试的次数。 retry.backoff.ms&#xff1a;设置生产者在重试前等待的时间。 buffer.memo…...

linux文本管理!!!

文章目录 第1章 文本过滤/查看命令1.echo&#xff1a;输出文本2.cat&#xff1a;合并文件或查看文件内容3.head&#xff1a;显示文件头部信息4.tail&#xff1a;显示文件尾部信息5.wc: 统计文本行号6.less&#xff1a;分页显示文件内容7.grep&#xff1a;文本过滤工具8.定向符号…...

软件设计师-计算机体系结构分类

计算机体系结构分类 Flynn分类法 根据不同的指令流数据流组织方式分类单指令流但数据流SISD,单处理器系统单指令多数据流SIMD&#xff0c;单指令流多数据流是一种采用一个控制器来控制多个处理器&#xff0c;同时对一组数据&#xff08;又称“数据矢量”&#xff09;中的每一…...

《基于深度学习的车辆行驶三维环境双目感知方法研究》

复原论文思路&#xff1a; 《基于深度学习的车辆行驶三维环境双目感知方法研究》 1、双目测距的原理 按照上述公式算的话&#xff0c;求d的话&#xff0c;只和xl-xr有关系&#xff0c;这样一来&#xff0c;是不是只要两张图像上一个测试点的像素位置确定&#xff0c;对应的深…...

jwt用户登录,网关给微服务传递用户信息,以及微服务间feign调用传递用户信息

1、引入jwt依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency> 2、Jwt工具类&#xff0c;生成token以及解析token package com.niuniu.gateway.uti…...

ubontu安装anaconda

1.下载 Anaconda 安装脚本 2. 复制到服务器上/home/username文件夹中&#xff0c;进入文件夹&#xff0c;执行&#xff1a; bash Anaconda3-2024.10-1-Linux-x86_64.sh一直按回车&#xff0c;然后输入yes同意协议。 3. 初始化 Anaconda 环境&#xff0c;会自动配置环境变量&a…...

【Docker容器化技术】docker安装与配置、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库

文章目录 一、Docker的安装与配置1、docker概述2、安装docker3、docker架构4、配置镜像加速器 二、Docker命令1、服务相关命令2、镜像相关命令3、容器相关命令 三、Docker容器数据卷1、数据卷概念及作用2、配置数据卷3、配置数据卷容器 四、Docker应用部署实战1、部署MySQL2、部…...

Python模拟A卷实操题

1.某机械公司生产两种产品。A的单件利润分别是100元&#xff0c;B的单件利润是150元。 每种产品由三种材料构成&#xff0c;现给出每种材料的库存&#xff08;库存小于100000&#xff09;&#xff0c;求利润最大的生产方案。输入说明&#xff1a;第一行给出生产每件A产品所需要…...

Leetcode 检测相邻递增子数组

3349. 检测相邻递增子数组 I 给你一个由 n 个整数组成的数组 nums &#xff0c;请你找出 k 的 最大值&#xff0c;使得存在 两个 相邻 且长度为 k 的 严格递增 子数组 。具体来说&#xff0c;需要检查是否存在从下标 a 和 b (a < b) 开始的 两个 子数组&#xff0c;并满…...

rockylinux 8安装 gcc11.2

方法 1&#xff1a;从源代码编译安装最新版本的 GCC 下载 GCC 源代码&#xff1a; 访问 GCC 官方网站下载最新版本的源代码&#xff0c;例如&#xff1a; wget https://ftp.gnu.org/gnu/gcc/gcc-11.2.0/gcc-11.2.0.tar.gz tar -xf gcc-11.2.0.tar.gz cd gcc-11.2.0安装依赖项&a…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

SpringAI实战:ChatModel智能对话全解

一、引言&#xff1a;Spring AI 与 Chat Model 的核心价值 &#x1f680; 在 Java 生态中集成大模型能力&#xff0c;Spring AI 提供了高效的解决方案 &#x1f916;。其中 Chat Model 作为核心交互组件&#xff0c;通过标准化接口简化了与大语言模型&#xff08;LLM&#xff0…...