百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

MATLAB使用蒙特卡洛算法求解线性整数规划和0-1规划

moboyou 2025-04-15 13:15 47 浏览

蒙特卡洛方法是一种利用计算机的随机数理论模拟实际的情况的一种方法。今天主要是以实例讲解蒙特卡洛方法的MATLAB编程实现求解线性整数规划和0-1规划。


实例1

首先使用intlinprog线性整数规划求解函数对该线性规划进行求解,该函数的语法如下:

    x = intlinprog(f,intcon,A,b)
    x = intlinprog(f,intcon,A,b,Aeq,beq)
    x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)
    x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub,x0)
    x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub,x0,options)
    x = intlinprog(problem)
    [x,fval,exitflag,output] = intlinprog(___)
    %intlinprog函数标准型
    %x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)
    %f——系数阵
    %intcon——变量个数
    %A,b:不等式限制条件Ax<=b中的A和b
    %Aeq,beq:等式限制条件中的Aeq*x=beq中的Aeq和beq
    %lb,ub:自变量的最小值和最大值
    用[x , Fval]代替上述各命令行中左边的x,则可得到在最优解x处的函数值Fval
    [x,fval]=intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)

程序

clc;
clear all;
f=[-5 -8];
A=[1 1;5 9];
b=[6 45];
lb=zeros(2,1);
intcon=[1 2];
[x,fval]=intlinprog(f,intcon,A,b,[],[],lb,[]);
fprintf('max f(x) 在x1 = %f x2 = %f  处取得最大值:%f\n',x(1),x(2),-fval);

运行结果

LP:                Optimal objective value is -41.250000.                                           


Heuristics:        Found 1 solution using ZI round.                                                 
                   Upper bound is -39.000000.                                                       
                   Relative gap is 2.50%.                                                          


Cut Generation:    Applied 1 Gomory cut.                                                            
                   Lower bound is -40.000000.                                                       
                   Relative gap is 0.00%.                                                          




Optimal solution found.


Intlinprog stopped at the root node because the objective value is within a gap tolerance of the optimal
value, options.AbsoluteGapTolerance = 0 (the default value). The intcon variables are
integer within tolerance, options.IntegerTolerance = 1e-05 (the default value).


max f(x) 在x1 = 0.000000 x2 = 5.000000  处取得最大值:40.000000

蒙特卡洛求解线性整数规划程序

主程序(使用floor向下取整函数)

floor函数

floor - 朝负无穷大四舍五入
    此 MATLAB 函数 将 X 的每个元素四舍五入到小于或等于该元素的最接近整数。
    Y = floor(X)
    Y = floor(t)
    Y = floor(t,unit)
clc;
clear all;
rand('state',sum(clock));%初始化随机数发生器
f0=-inf;
x0 = [];
num = 1e7;
tic%计时开始
for i=1:num
    x=0 + 6*rand(2,1);%随机产生初始解
    x1 = floor(x);%向下取整函数
    [f,g]=mengte3(x1);%调用自定义函数计算
    if sum(g<=0)==2
        if f0<=f  %求最大值 如果当前值更优,则更新值
            x0=x1;
            f0=f;
        end
    end
end
toc%计时结束
fprintf('max f(x) 在x1 = %f x2 = %f  处取得最大值:%f\n',x0(1),x0(2),f0);

自定义函数mengte3.m

function [f,g]=mengte3(x)
%% f是目标函数  g(x)<=0
f=5*x(1)+8*x(2);
x1 = x(1);
x2 = x(2);
g=[x1+x2-6;
  5*x1+9*x2-45];
end

运行结果

历时 10.114315 秒。
max f(x) 在x1 = 0.000000 x2 = 5.000000  处取得最大值:40.000000

使用ceil向上取整函数求解

ceil - 朝正无穷大四舍五入
    此 MATLAB 函数 将 X 的每个元素四舍五入到大于或等于该元素的最接近整数。
    Y = ceil(X)
    Y = ceil(t)
    Y = ceil(t,unit)

主程序

clc;
clear all;
rand('state',sum(clock));%初始化随机数发生器
f0=-inf;
x0 = [];
num = 1e7;
tic%计时开始
for i=1:num
    x=0 + 6*rand(2,1);%随机产生初始解
    x1 = ceil(x);
    [f,g]=mengte3(x1);%调用自定义函数计算
    if sum(g<=0)==2
        if f0<=f  %求最大值 如果当前值更优,则更新值
            x0=x1;
            f0=f;
        end
    end
end
toc%计时结束
fprintf('max f(x) 在x1 = %f x2 = %f  处取得最大值:%f\n',x0(1),x0(2),f0);

运行结果

历时 11.714213 秒。
max f(x) 在x1 = 3.000000 x2 = 3.000000  处取得最大值:39.000000

实例2

首先使用intlinprog线性整数规划求解函数对该线性规划进行求解:

程序

clc;
clear all;
f=[-6 -2 -3 -5];
A=[-3 5 -1 -6;2 1 1 -1;1 2 4 5];
b=[-4 3 10]';
intcon=[1 2 3 4];
lb=zeros(4,1);
ub=ones(4,1);
[x,fval]=intlinprog(f,intcon,A,b,[],[],lb,ub);
fprintf('max f(x) 在x1 = %f x2 = %f x3 = %f x4 = %f  处取得最大值:%f\n',x(1),x(2),x(3),x(4),-fval);

运行结果

LP:                Optimal objective value is -14.500000.                                           


Heuristics:        Found 1 solution using ZI round.                                                 
                   Upper bound is -13.000000.                                                       
                   Relative gap is 0.00%.                                                          




Optimal solution found.


Intlinprog stopped at the root node because the objective value is within a gap tolerance of the optimal
value, options.AbsoluteGapTolerance = 0 (the default value). The intcon variables are
integer within tolerance, options.IntegerTolerance = 1e-05 (the default value).


max f(x) 在x1 = 1.000000 x2 = -0.000000 x3 = 1.000000 x4 = 1.000000  处取得最大值:14.000000
>>

蒙特卡洛求解0-1规划程序

主程序(四舍五入round函数)

clc;
clear all;
rand('state',sum(clock));%初始化随机数发生器
f0=-inf;
x0 = [];
num = 1e7;
tic%计时开始
for i=1:num
    x=0 + 1*rand(4,1);%随机产生初始解
    x1 = round(x);%利用四舍五入round函数0-1变量
    [f,g]=mengte4(x1);%调用自定义函数计算
    if sum(g<=0)==3
        if f0<=f  %求最大值 如果当前值更优,则更新值
            x0=x1;
            f0=f;
        end
    end
end
toc%计时结束
fprintf('max f(x) 在x1 = %f x2 = %f  x3 = %f x4 = %f  处取得最大值:%f\n',x0(1),x0(2),x0(3),x0(4),f0);

自定义函数mengte4.m

function [f,g]=mengte4(x)
%% f是目标函数  g(x)<=0
f=6*x(1)+2*x(2)+3*x(3)+5*x(4);
x1 = x(1);
x2 = x(2);
x3 = x(3);
x4 = x(4);


g=[-3*x1+5*x2-x3-6*x4+4;
  2*x1+x2+x3-x4-3;
  x1+2*x2+4*x3+5*x4-10];
end

运行结果

历时 11.086100 秒。
max f(x) 在x1 = 1.000000 x2 = 0.000000  x3 = 1.000000 x4 = 1.000000  处取得最大值:14.0

本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。


作 者 | 郭志龙
编 辑 | 郭志龙
校 对 | 郭志龙

相关推荐

黄道十二宫杀手密码51年后被破解,来自两位程序员和数学家合作

杨净边策发自凹非寺量子位报道|公众号QbitAI黄道十二宫杀手(ZodiacKiller)可能是世界上最知名的高智商连环杀手,52年来从未被抓获。他的事迹已被改编成了多部好莱坞电影。△...

深入剖析MediaCodec解码器的基本原理及使用「建议新手收藏」

一,MediaCodec工作原理MediaCodec类Android提供的用于访问低层多媒体编/解码器接口,它是Android低层多媒体架构的一部分,通常与MediaExtractor、MediaMu...

Retrofit WebService 实践

前言作为Android开发,平时和后端聊得最多的除了喝酒就是接口。常用语:Restful和WebService,前者现在聊得多,后者以前聊得多。默认含义分别为:Restful:HTTP协议...

建议收藏!175部4K UHD版本经典高分电影洗版参考目录(2015之前)

本内容来源于@什么值得买APP,观点仅代表作者本人|作者:1L789近两年很多经典高分老电影陆续开始重制成4KUHD版本,虽然我早已将这些电影的BD蓝光版收入,但纠结一番后还是花了不少时间将其全部...

2 个月的面试亲身经历告诉大家,如何进入 BAT 等大厂?

这篇文章主要是从项目来讲的,所以,从以下几个方面展开。怎么介绍项目?怎么介绍项目难点与亮点?你负责的模块?怎么让面试官满意?怎么介绍项目?我在刚刚开始面试的时候,也遇到了这个问题,也是我第一个思考的问...

详解Android官推Kotlin-First的图片加载库

前言Coil是一个非常年轻的图片加载库,在2020年10月22日才发布了1.0.0版本,但却受到了Android官方的推广,在AndroidDevelopersBackst...

webview 渲染机制:硬件加速方式渲染的Android Web

webview渲染是什么?webview渲染是用于展现web页面的控件;webview可以内嵌在移动端,实现前端的混合式开发,大多数混合式开发框架都是基于webview模式进行二次开发的w...

因为我对Handler的了解,居然直接给我加了5K

1Handler是什么?android提供的线程切换工具类。主要的作用是通过handler实现从子线程切换回主线程进行ui刷新操作。1.1为什么Handler能实现线程切换?在创建Handler的...

「经典总结」一个View,从无到有会走的三个流程,你知道吗?

前言一个View,从无到有会走三个流程,也就是老生常谈的measure,layout,draw三流程我们都知道Android视图是由一层一层构成的层级结构,直白点说,就是父View包含子View而子V...

这些垃圾代码是谁写的?哦,原来小丑竟是我自己

程序员是最喜欢自嘲、自黑的群体之一,比如他们常常称自己是“码农”、“程序猿”,再比如他们的工作明明是写代码、修Bug,也有人调侃说:“明明我们是修代码、写Bug!”本文整理了一些程序员“修代码、写...

手把手教你爬取天堂网1920*1080大图片(批量下载)——理论篇

/1前言/平时我们要下载图片,要要一个一个点击下载是不是觉得很麻烦?那有没有更加简便的方法呢?答案是肯定的,这里我们以天堂网为例,批量下载天堂网的图片。/2项目准备工作/首先我们第一步我们要安装...

音视频开发需要你懂得 ffmpeg 开源库的编码原理

引言音视频开发需要你懂得音视频中一些基本概念,针对编解码而言,我们必须提前懂得编解码器的一些特性,码流的结构,码流中一些重要信息如sps,pps,vps,startcode以及基本的工作原理,...

「8年老 Android 开发」最全最新 Android 面试题系列全家桶(带答案)

下面跟大家分享的这些面试题都是互联网大厂真实流出的面试内容,每个问题都附带完整详细的答案,不像网上的那些资料三教九流有的甚至还没答案,这些面试题我也是经过日积月累才整理出来的精品资料。这些面试题主要是...

手把手教你爬取天堂网1920*1080大图片(批量下载)——实战篇

/1前言/上篇文章手把手教你爬取天堂网1920*1080大图片(批量下载)——理论篇我们谈及了天堂网站图片抓取的理论,这篇文章将针对上篇文章的未尽事宜进行完善,完成图片的批量抓取。/2图片网址解...

PHP 8.1.9 更新发布

CLI:修复了内置服务器通过PHP_CLI_server_WORKERS环境变量的潜在溢出。修正了GH-8952(不再可能有意关闭std句柄)。Core:修复了GH-8923的错误(Windows上的...