首页 > 其他分享 >非线性规划的经典例题--选址问题

非线性规划的经典例题--选址问题

时间:2024-08-13 23:05:06浏览次数:10  
标签:小问 函数 16 -- 非线性 xx 料场 选址 例题

本章会介绍如何利用非线性规划解决选址问题,这个问题是文章线性规划在数学建模中的两道例题中第二道投料问题的第二小题,本章为基于这道题的基础上进行介绍,建议读者返回去看一看

目录

一、问题提出

二、问题分析

第二小问的目标函数其实与第一小问的一样,都是求吨千米数最小。但不同的是,在第一小问的背景下,目标函数仅仅是一个一个ax+bx+....的求和形式,是一个线性规划。
但第二小问把ai与bi的变成了一个目标变量,就成了一个非线性规划

三、模型建立

第二小问的模型在第一小问的基础上添加了4个决策变量,为两个工地的横纵坐标,此外变成了一个非线性规划

四、代码实现

1.输入目标函数

相对第一问直接输入系数向量,输入目标函数更麻烦,这里需要把新料场的坐标当作目标变量给写进函数里。这里也可以用pdist2函数计算两个坐标的距离,但要求都处理成横向量(也就是说pdist2函数也是可以在函数中处理非数值型的参数)

function f = fun5(xx)  % 注意为了避免和下面的x同号,我们把决策变量的向量符号用xx表示(注意xx的长度为16)
    a=[1.25  8.75  0.5  5.75  3  7.25];  % 工地的横坐标
    b=[1.25  0.75  4.75	5  6.5  7.25];   % 工地的纵坐标
    x = [xx(13)  xx(15)];  % 新料场的横坐标
    y = [xx(14)  xx(16)];  % 新料场的纵坐标
    c = [];  % 初始化用来保存工地和料场距离的向量 (这个向量就是我们的系数向量)
    for  j =1:2
        for i = 1:6
            c = [c;  sqrt( (a(i)-x(j))^2 + (b(i)-y(j))^2)];  % 每循环一次就在c的末尾插入新的元素
        end
    end
    % 下面我们要求吨千米数,注意c是列向量,我们计算非线性规划时给定的初始值x0是行向量
    f = xx(1:12) * c;
end

2.输入线性约束

format long g   %可以将Matlab的计算结果显示为一般的长数字格式(默认会保留四位小数,或使用科学计数法)
% 不等式约束
A =zeros(2,16);  % 注意这里要改成16
A(1,1:6) = 1;
A(2,7:12) = 1;
b = [20,20]';
% 等式约束
Aeq = zeros(6,16);  % 注意这里要改成16
for i = 1:6
    Aeq(i,i) = 1;  Aeq(i,i+6) = 1;
end
beq = [3 5 4 7 6 11]';  % 每个工地的日需求量
% 上下界
lb = zeros(16,1);
% lb = [zeros(12,1); -inf*ones(4,1)];  两个新料场坐标的下界可以设为-inf

% 进行求解
% 注意哦,这里我们只尝试了这一个初始值,大家可以试试其他的初始值,有可能能够找到更好的解。
% 未来我会在遗传算法中再来看这个例题。
x0 = [3 5 0 7 0 1 0 0 4 0 6 10 5 1 2 7];  % 用第一问的结果作为初始值
[x,fval] = fmincon(@funpp,x0,A,b,Aeq,beq,lb)  % 注意没有非线性约束,所以这里可以用[]替代,或者干脆不写
reshape(x(1:12),6,2)

标签:小问,函数,16,--,非线性,xx,料场,选址,例题
From: https://www.cnblogs.com/dlmuwxw/p/18357829

相关文章

  • 数学:素性测试算法
    算法简介对一个数的素性测试有很多种做法,有确定性测试的算法,也有概率性测试的算法。确定性素性测试算法确定性素性测试这里介绍两种:线性筛法:利用线性筛在\(O(n)\)的时间复杂度内,将一个范围内的数素性全部求出,然后\(O(1)\)查询。试除法:在\(\sqrt{n}\)内试商,判定是否......
  • Java 运算符(详解)
    文章目录一、简介二、算术运算符三、自增自减运算符四、关系运算符五、逻辑运算符六、位运算符六、赋值运算符七、条件运算符八、字符串连接符九、运算符优先级一、简介在Java中,运算符是用来对数据进行操作和处理的符号,这些符号能使得Java程序进行各种数学计算、......
  • 最小栈问题
    设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。实现 MinStack 类:MinStack() 初始化堆栈对象。voidpush(intval) 将元素val推入堆栈。voidpop() 删除堆栈顶部的元素。inttop() 获取堆栈顶部的元素。intgetMin() 获取堆栈中的最小元素......
  • 长度最小的子数组 滑动窗口法(双指针) 解决
    给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl,numsl+1,...,numsr-1,numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。示例1:输入:target=7,nums=[2,3,1,2,4,3]......
  • 【MySQL】数据库约束和多表查询
    目录1.前言2.数据库约束2.1约束类型2.2 NULL约束2.3NUIQUE:唯一约束2.4 DEFAULT:默认值约束2.5 PRIMARYKEY:主键约束2.6FOREIGNKEY:外键约束1.7 CHECK约束3.表的设计 3.1一对一3.2一对多3.3多对多4.新增5.查询5.1聚合查询5.1.1聚合函数5.1.2 GROUPBY......
  • 如何获取VS Code扩展的版本更新信息
    获取VSCode扩展的版本更新的需求因为企业内部有架设私有扩展管理器的要求,但是对于一些官方市场的插件,希望可以自动获取这些扩展的更新并上传至私有扩展管理器。于是就有了本篇介绍的需求:通过API的方式获取VSCode扩展的更新。关于VSCode的私有扩展管理器可以参考:VS......
  • 代码随想录算法训练营第十四天(一)| 226.翻转二叉树 101. 对称二叉树
    226.翻转二叉树题目:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]提示:树中节点数目范围在 [0,100] 内-100<=......
  • Leetcode JAVA刷刷站(20)有效的括号
    一、题目概述二、思路方向     在Java中,要判断一个仅包含括号('(',')','{','}','[',']')的字符串是否有效,你可以使用栈(Stack)数据结构来实现。栈是一种后进先出(LIFO,LastInFirstOut)的数据结构,非常适合用来处理这类问题。以下是具体的实现步骤和代码示例:创......
  • linux内核模块 字符设备驱动模板
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、linux内核模块是什么?二、代码示例总结前言提示:这里可以添加本文要记录的大概内容:内核版本5.10.92linux内核模块字符设备驱动模板cdev注册字符设备,创建一个/dev/下设备节点和/sy......
  • 关于Pytorch中net.eval()和torch.no_grad()的意义理解
    Q:defevaluate_accuracy(net,data_iter):#@save"""计算在指定数据集上模型的精度"""ifisinstance(net,torch.nn.Module):net.eval()#将模型设置为评估模式metric=Accumulator(2)#正确预测数、预测总数withtorch.no_grad():......