MATLAB使用蒙特卡洛算法实例求解线性规划

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


实例1

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

    x = linprog(f,A,b)
    x = linprog(f,A,b,Aeq,beq)
    x = linprog(f,A,b,Aeq,beq,lb,ub)
    x = linprog(f,A,b,Aeq,beq,lb,ub,options)
    x = linprog(problem)
    [x,fval] = linprog(___)
    [x,fval,exitflag,output] = linprog(___)
    [x,fval,exitflag,output,lambda] = linprog(___)
    其中f,A,b,是不可缺省的输入变量,
    x是不可缺省的输出变量,它是问题的解.vlb,vub均是向量,
    分别表示x的下界和上界,x0为x的起始点,
    options为optimset函数中定义的参数的值,fval是目标函数在
    解x处的值。

程序

clc;
clear all;
close all;
c = [2;3;1];
a = [1, 4,2;3,2,0];
b = [8;6];
[x,y] = linprog(c,-a,-b,[],[],zeros(3,1));
fprintf('min f(x) 在x1 = %f x2 = %f  x3 = %f处取得最小值:%f
',x(1),x(2),x(3),y);

运行结果

Optimal solution found.


min f(x) 在x1 = 2.000000 x2 = 0.000000  x3 = 3.000000处取得最小值:7.000000
>> 

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

主程序

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

自定义函数mengte1.m

function [f,g]=mengte1(x)
%% f是目标函数  g(x)<=0
f=2*x(1)+3*x(2)+x(3);
g=[-x(1)-4*x(2)-2*x(3)+8;
    -3*x(1)-2*x(2)+6];
end

运行结果

历时 0.954040 秒。
min f(x) 在x1 = 1.954169 x2 = 0.103206  x3 = 2.821145处取得最小值:7.039102

实例2


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

程序

clc;
clear all;
c = [5;4;6];
a = [1,-1,1;3,2,4;3,2,0];
b = [20,42,30];
[x,y,exitflag,putput,lambda] = linprog(-c,a,b,[],[],zeros(3,1));
fprintf('min f(x) 在x1 = %f x2 = %f  x3 = %f处取得最小值:%f
',x(1),x(2),x(3),y);

运行结果





Optimal solution found.


min f(x) 在x1 = 0.000000 x2 = 15.000000  x3 = 3.000000处取得最小值:-78.000000

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

主程序

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

自定义函数mengte2.m

function [f,g]=mengte2(x)
%% f是目标函数  g(x)<=0
f=-5*x(1)-4*x(2)-6*x(3);
x1 = x(1);
x2 = x(2);
x3 = x(3);
g=[x1-x2+x3-20;
   3*x1+2*x2+4*x3-42;
   3*x1+2*x2-30];
end

运行结果

历时 1.056990 秒。
min f(x) 在x1 = 0.201508 x2 = 14.099784  x3 = 3.280495处取得最小值:-77.08

参考内容

[1] 孙忠潇.Simulink仿真及代码生成技术入门到精通[M].北京:北京航空航天大学出版社,2015.


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


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

展开阅读全文

页面更新:2024-04-06

标签:线性规划   实例   随机数   主程序   发生器   算法   函数   目标   程序   方法   内容

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top