首页 > 编程语言 >【学习笔记】Matlab和python双语言的学习(最大最小化规划)

【学习笔记】Matlab和python双语言的学习(最大最小化规划)

时间:2024-08-06 19:25:41浏览次数:17  
标签:10 right 函数 python 学习 fminimax Matlab 最小化 left

文章目录


前言

通过模型算法,熟练对Matlab和python的应用。
学习视频链接:
https://www.bilibili.com/video/BV1EK41187QF?p=28&vd_source=67471d3a1b4f517b7a7964093e62f7e6

一、最大最小化规划

  • 在博弈论中有一个经典理论 ——— 最大最小策略(Minimax strategy),是由博弈论奠基人约翰·冯·诺伊曼(John von Neumann)在1928年提出的一种在理性行为基础上做的保守博弈策略:使得博弈者的最小收入最大化的策略。由此衍生出了最大最小算法(Minimax算法),是一种找出失败的最大可能性中的最小值的算法(即最小化对手的最大得益)。在实际问题中也有许多求最大值的最小化问题,例如急救中心选址问题就是要规划其到所有地点最大距离的最小值,在投资规划中要确定最大风险的最低限度等,为此,对每个,我们先求出目标值 f i ( x ) f_i(x) fi​(x) 的最大值,然后再求这些最大值中的最小值。
  • 最大最小化问题的一般数学模型:
    m i n { m a x [ f 1 ( x ) ] , m a x [ f 2 ( x ) ] , … , m a x [ f m ( x ) ] } s . t . { A x ≤ b A e q ⋅ x = b e q C ( x ) ≤ 0 C e q ( x ) = 0 V L B ≤ X ≤ V U B min\left\{max\Big[f_1\left(x\right)\Big],max\Big[f_2\left(x\right)\Big],\ldots,max\Big[f_m\left(x\right)\Big]\right\}\\s.t.\begin{cases}Ax\leq b\\Aeq\cdot x=beq\\C\left(x\right)\leq0\\Ceq\left(x\right)=0\\VLB\leq X\leq VUB\end{cases} min{max[f1​(x)],max[f2​(x)],…,max[fm​(x)]}s.t.⎩ ⎧​Ax≤bAeq⋅x=beqC(x)≤0Ceq(x)=0VLB≤X≤VUB​

二、选址问题

  • 设某城市有某种物品的 10 个需求点,第 i 个需求点 P I P_I PI​ 的坐标 ( a i , b i ) (a_i,b_i) (ai​,bi​),道路网与坐标轴平行,彼此正交,现打算建一个该物品的供应中心,且由于受到城市某些条件的限制,该供应中心只能设在 x 界于 [3,8],y 界于 [4,10] 的范围之内,问该中心应建在何处为好?

在这里插入图片描述

  • 设供应中心的位置为 ( x , y ) (x,y) (x,y),要求它到最远需求点的距离尽可能小,由于道路网与坐标轴平行,彼此正交,故采用沿道路行走计算距离,可知每个需求点 P i P_i Pi​, 到该中心的距离为 ∣ x − a i ∣ + ∣ y − b i ∣ |x-a_i|+|y- b_i| ∣x−ai​∣+∣y−bi​∣,于是模型为: min ⁡ ( x , y ) { max ⁡ i [ ∣ x − a i ∣ + ∣ y − b i ∣ ] } s . t . { 3 ≤ x ≤ 8 4 ≤ y ≤ 10 \min_{(x,y)}\left\{\max_i\left[\left|x-a_i\right|+\left|y-b_i\right|\right]\right\}\\s.t.\begin{cases}3\leq x\leq8\\4\leq y\leq10\end{cases} (x,y)min​{imax​[∣x−ai​∣+∣y−bi​∣]}s.t.{3≤x≤84≤y≤10​

三、代码实现----Matlab

1.Matlab 的 fminimax 函数

fminimax 函数的基本语法如下:

[x, fval] = fminimax(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon)

输入参数基本与非线性规划 fmincon 函数几乎一致,但目标函数需要用函数向量表示。

2.Matlab 代码

%% 最大最小化规划的函数
% [x,fval] = fminimax(fun,x0,A,b,Aeq,beq,lb,ub,noncon,options)
% x0 表示给定的初始值(用行向量或者列向量表示),必须得写
% A b 表示线性不等式约束
% Aeq beq 表示线性等式约束
% lb ub 表示上下界约束
% fun 表示目标函数,需要用函数向量表示
% nonlcon 表示非线性约束的函数
% option 表示求解非线性规划使用的方法

x0 = [5,5]; % 在给定范围内
lb = [3,4];
ub = [8,10];
[x,fval] = fminimax(@fun,x0,[],[],[],[],lb,ub)
function f = fun(x)
    f = zeros(10,1);
    a = [1 4 3 5 9 12 6 20 17 8];
    b = [2 10 8 18 1 4 5 10 8 9];
    for i = 1:10
        f(i) = abs(x(1) - a(i)) + abs(x(2) - b(i));
    end
end

运行结果:

在这里插入图片描述

即:中心应建在 (8.0,8.5) 处,最远需求点的距离为 13.5。

四、代码实现----python

在Python中,有几个库可以用于求解类似于MATLAB中 fminimax 的多目标优化问题。fminimax 是用于求解最小化最大目标函数值的问题。在Python中,SciPyCVXPY 等库可以用来进行这种类型的优化。

本文使用 SciPySciPy 库中的 minimize 函数可以通过自定义目标函数来实现类似 fminimax 的功能。我们可以定义一个目标函数,该函数返回多个目标函数的最大值,然后使用 minimize 进行优化。

import numpy as np
from scipy.optimize import minimize

# 定义要最小化的目标函数:目标是最小化多个目标函数的最大值
def fun(x):
    f = np.zeros((10,))
    a = np.array([1, 4, 3, 5, 9, 12, 6, 20, 17, 8])
    b = np.array([2, 10, 8, 18, 1, 4, 5, 10, 8, 9])
    for i in range(10):
        f[i] = abs(x[0] - a[i]) + abs(x[1] - b[i])
    return np.max(f)

# 初始猜测
x0 = np.array([7, 7])

bounds = [(3,8),(4,10)]

# 使用SLSQP优化器进行优化
result = minimize(fun, x0, bounds=bounds , method='SLSQP')

print("Optimal value:", result.fun)
print("Optimal solution:", result.x)

运行结果:

在这里插入图片描述

总结

本文介绍了最大最小化规划,并通过选址问题作为示例建立模型,分别使用Matlab和python进行代码编写。

标签:10,right,函数,python,学习,fminimax,Matlab,最小化,left
From: https://blog.csdn.net/m0_65032457/article/details/140961850

相关文章

  • 关于简单的部分数学函数用python求导的示例
    1.求常数的导数题目代码1.求常数的导数:$f(x)=c$ 运行代码fromsympyimport*x,c=symbols('xc')c.diff(x)结果 2.求幂函数导数:题目代码2.求幂函数导数:$$f(x)=x^\mu$$运行代码fromsympyimport*x,mu=symbols('xmu')(x**mu).diff(x)结果  3.求三角......
  • 想学习人工智能、大语言模型?这份学习路线与免费学习资源最值得推荐
    想学习人工智能吗?但不知道如何开始?要熟练掌握人工智能相关的技术,光学习很多课程是不够的。为了摆脱只是跟着教程学习,你需要亲自动手,从头开始编写算法,动手实践,并通过使用人工智能解决问题来做一些有趣的边项目。这篇文章试图创建一份免费的课程路径,希望对大家学习有帮助。(注......
  • LLM学习笔记-位置编码篇
    在Transformer模型中,位置编码(PositionalEncoding)的引入是为了补充自注意力机制(Self-Attention)在捕捉序列位置信息方面的不足。自注意力机制是Transformer的核心,但它对输入序列的位置信息并不敏感。具体来说,Transformer模型对输入序列中的每个元素进行处理时是并行的,而不是像传统......
  • 使用python解决一些计算 我们代码不比计算机差!
    使用python解决一些计算我们代码不比计算机差!一.简单基础计算1.基本的计算符号加+减-乘*****除/取余%乘方******整除//加减乘除不必多说说说比较陌生的取余乘方与整除取余%:10%3-->110-3-3-3=1最后剩下的数就是余数整除//:10//3-->310除3=3.333333去掉......
  • 机器学习中的两个重要函数--sigmoid和softmax
    机器学习中,常常见到两个函数名称:sigmoid和softmax。前者在神经网络中反复出现,也被称为神经元的激活函数;后者则出现在很多分类算法中,尤其是多分类的场景,用来判断哪种分类结果的概率更大。本文主要介绍这两个函数的定义,形态,在算法中的作用,以及两个函数之间的联系。1.sigmoid函数......
  • python 音频处理(2)——提取PPG特征之whisper库的使用(2.1)
    提取PPG特征之——whisper库的使用(2.1)1安装对应的包方法一(自用):直接pip即可:pipinstallopenai-whisper成功后如下图所示方法二:当时用了他这个方法环境直接崩了,已老实condainstall-cconda-forgeffmpegcondainstall-cconda-forgepoetrypoetryinitpoetry......
  • 18.python语句
    if语句一、if语句的介绍1、if单分支2、if的多分支3、if的嵌套4、三目运算=================================二、实操1、if单分支格式:if条件:执行语句1else执行语句2案例1在if语句判断中:我们可以使用比较运算符、成员运算符、逻辑运算符等,<,==,!=,>=,<=、and......
  • 【python海龟画图】代码整理
    春联点击查看代码importturtlet=turtlet.showturtle()t.penup()t.goto(-150,150)t.pendown()t.color('black','red')t.begin_fill()foriinrange(2):t.forward(50)t.right(90)t.forward(400)t.right(90)t.end_fill()t......
  • python画个狗狗,有没有更好的画法呢,欢迎评论区告诉我
    一个有趣的画狗狗的图,来自网友分享。-----仅分享有没有更好的画法,欢迎分享!经过我的测试,这个比turtle画画要好很多。因为turtle不仅画画慢,而且画到一半就停下来不画了。有知道原因的同学,欢迎分享原因,谢谢。fromturtleimport*screensize(500,500)#【头部轮廓】pen......
  • Java-数学学习手册-全-
    Java数学学习手册(全)原文:LearnJavawithMath协议:CCBY-NC-SA4.0一、介绍市场上有很多好的Java编程书籍,但是对于一个刚接触Java并且只有很少编程知识的初学者来说,找到一本合适的并不容易。这本书将帮助初学者学习如何有效地用Java编程。我的意图是简化Java更复杂......