实验二.线性规划问题软件实现

实验目的:掌握线性规划、整数规划、非线性规划问题的基本形式,会根据实际问题构建相应的基本形式,并利用MATLAB或LINGO软件实现。

1.写出求解以下规划问题的MATLAB程序或Lingo程序:

(1)指派问题其系数矩阵为:

 (2)线性规划问题:

(3)已知某商品有8个配送中心,有15个用户需要该商品,用户的需求量和配送中心的供应量,以及运费(见数据data.xlsx),若配送中心给用户配送,配送量要大于1000小于2000,则求最小运费调用计划。(数据data.xlsx如下图) 

用户单位商品运费需求量
中心1中心2中心3中心4中心5中心6中心7中心8
用户1390.6618.5553442113.15.21217.710113000
用户2370.8636440401.825.6113.11172.4894.53100
用户3876.31098.6497.6779.89031003.3907.240.12900
用户4745.41037305.9725.7445.7531.41376.4768.13100
用户5144.5354.6624.7238290.7269.4993.29743100
用户6200.2242691.5173.4560589.7661.8855.73400
用户7235205.5801.5326.6477433.6966.411123500
用户8517541.5338.4219249.5335937.3701.83200
用户95423211104576896.8878.4728.312433000
用户10665827427523.2725.2813.8692.22843100
用户11799855.1916.5709.310571115.53006173300
用户12852.27981083714.61177.41216.840.8898.23200
用户13602614820517.7899.6952.7272.47273300
用户149031092.5612.5790932.41034.9777152.32900
用户15600.7710522448726.6811.8563426.83100
供应量1860019600171001890017000191002050017200
3000
3100
2900
3100
3100
3400
3500
3200
3000
3100
3300
3200
3300
2900
3100
1860019600171001890017000191002050017200

2.一家公司准备在某个地区建立两个分公司,向7个区的居民经营,每个区的居民数如下图,每个分公司只能向本区和相邻区的居民经营,分店应建在何处,才能使得所能供应的居民的 数量最大?请给出数学模型及求解程序。

 3.写出求解下列非线性问题的M程序及Lingo程序

 1.(1)

%方法一:MATLAB程序

clear all
clc
C=[16 15 19 22;17 21 19 18;24 22 18 17;17 19 22 16]';
%生成目标函数系数矩阵
c=reshape(C,1,4*4);
%生成等式约束系数矩阵
Aeq=zeros(8,16);
a=ones(1,4);
for i=1:4
    Aeq(i,4*(i-1)+1:4*i)=a;
end
for i=1:4
    for j=1:4
         Aeq(i+4,4*(j-1)+i)=1;
    end
end
beq=ones(8,1);
%套用MATLAB混合整形规划函数求解
intlinprog(c,1:16,[],[],Aeq,beq,zeros(1,16),ones(1,16))

解答结果:

LP:    Optimal objective value is 66.000000

ans= 0 1 0 0 1 0 0 0 0 0 1 0 0  0 0 1

即x12=x21=x33=x44=1

故工作1-4分别由第2、1、3 、4个人去做,代价最小为66.

%方法二:LINGO程序

model:
sets:
ren/1..4/:a;
work/1..4/:b;
link(ren,work):c,x;
endsets
data:
    c=16 15 19 22 17 21 19 18 24 22 18 17 17 19 22 16;
enddata
min=@sum(link:c*x);
@for(ren(i):@sum(work(j):x(i,j))=1);
@for(work(j):@sum(ren(i):x(i,j))=1);
@for(link(i,j):@bin(x(i,j)));
          end

解答结果:

 

(2)解:将线性规划问题化为MATLAB标准型:

 

%方法一:MATLAB程序

c=-[100 90 80 70];
A=[-1 -1 0 0;0 0 -1 -1;3 0 2 0;0 3 0 2];
b=[-30 -30 120 48]';
[x,fval]=linprog(c,A,b,[],[],zeros(4,1),[])

求解结果:

x =

   14.0000

   16.0000

   39.0000

         0

fval =

  -5.9600e+03

%方法二:LINGO程序
max=100*x1+90*x2+80*x3+70*x4;
x1+x2>30;
x3+x4>30;
3*x1+2*x3<120;
3*x2+2*x4<48;

求解结果:

 

(3)解:

%方法一:MATLAB程序

clear all
clc
C=[390.6 618.5	553	442	113.1 5.2 1217.7 1011;370.8	636 440	401.8 25.6 113.1 1172.4 894.5; 876.3 1098.6 497.6 779.8 903 1003.3 907.2 40.1;745.4 1037 305.9 725.7 445.7 531.4 1376.4 768.1;144.5 354.6 624.7 238 290.7 269.4 993.2 974;200.2 242 691.5 173.4 560 589.7 661.8 855.7; 235 205.5 801.5	326.6 477 433.6	966.4 1112;517 541.5 338.4	219 249.5 335 937.3 701.8; 542	321	1104 576 896.8 878.4 728.3 1243; 665 827 427 523.2 725.2 813.8 692.2 284;799 855.1 916.5 709.3 1057 1115.5 300 617;852.2 798 1083 714.6 1177.4 1216.8 40.8 898.2;602	614	820 517.7 899.6 952.7 272.4 727;903	1092.5 612.5 790 932.4 1034.9 777 152.3; 600.7 710 522 448 726.6811.8 563 426.8];
beq=[3000 3100 2900 3100 3100 3400 3500 3200 3000 3100 3300 3200 3300 2900 3100]';
b=[18600 19600 17100 18900 17000 19100 20500 17200]';
%生成目标函数系数矩阵
%可以利用xlsread函数读取数据
%C=xlsread(‘data.xls’,’B3:I17’);
%beg= xlsread(‘data.xls’,’J3:J17’);
%b= xlsread(‘data.xls’,’B18:I18’);
c=reshape(C,1,8*15);
c=[c,zeros(1,120)];
%生成不等约束系数矩阵
A=zeros(8,2*8*15);
a=ones(1,15);
for i=1:8
    A(i,15*(i-1)+1:15*i)=a;
end
%生成等式约束矩阵
Aeq=zeros(15,2*8*15);
k=1;
for i=1:15
    for j=1:8
         Aeq(i,15*(j-1)+k)=1;
    end
    k=k+1;
end
A1=zeros(2*8*15);
j=1;
for i=1:2:239;
    A1(i,j)=-1;
    A1(i,120+j)=1000;
    A1(i+1,j)=1;
    A1(i+1,120+j)=-2000;
    j=j+1;
end
A=[A;A1];
b=[b;zeros(240,1)];
intlinprog(c,121:240,A,b,Aeq,beq,zeros(1,8*15),[])
%方法二:LINGO程序

model:
sets:
yonghu/1..15/:a;
dian/1..8/:b;
link(yonghu,dian):c,x,y;
endsets
data:
a=@file('data.txt');
b=@file('data.txt');
c=@file('data.txt');
@text(data2.txt)=@table(x);
@text()=@table(x);
enddata
min=@sum(link:c*x);
@for(dian(j):@sum(yonghu(i):x(i,j))<b(j));
@for(yonghu(i):@sum(dian(j):x(i,j))=a(i));
@for(link:1000*y<x; x<2000*y; @bin(y));
end

2. 解: 

 

 MATLAB程序:

解法一:利用面向问题求解:
clear all
clc
x = optimvar('x',11,1,'Type','integer','LowerBound',0,'UpperBound',1);
%依照上述数学模型,声明了一个11维0-1变量x
c=[109 89 104 122 117 83 100 115 81 56 73];
prob = optimproblem;
prob.Objective = -c*x;
prob.Constraints.cons1 =sum(x)<=2;
prob.Constraints.cons2 = sum(x(1:3))<=1;
prob.Constraints.cons3 = sum(x([1,4]))<=1;
prob.Constraints.cons4 = sum(x([2,4,5:7]))<=1;
prob.Constraints.cons5 = sum(x([3,5,8]))<=1;
prob.Constraints.cons6 = sum(x([6,9,10]))<=1;
prob.Constraints.cons7 = sum(x([7:9,11]))<=1;
options = optimoptions('intlinprog','Display','off');

[sol,fval] = solve(prob,'Options',options)

解法二:利用求解器intlinproc求解:
f=[109 89 104 122 117 83 100 115 81 56 73];
A=zeros(7,11);
A(1,:)=1;
A(2,1:3)=1;
A(3,[1,4])=1;
A(4,[2,4,5:7])=1;
A(5,[3,5,8])=1;
A(6,[6,9,10])=1;
A(7,[7:9,11])=1;
b=ones(7,1);
b(1)=2;
intcon=1:11;
lb=zeros(11,1);
ub=ones(11,1);
[x,fval,exitflag,output] = intlinprog(-f,intcon,A,b,[],[],lb,ub)

LINGO程序:

max=109*x12+89*x13+104*x14+ 122*x23+ 117*x34+ 83*x35+ 100*x36+ 115*x46+ 81*x56+ 56 *x57+73*x67;
x12+x13+x14+ x23+ x34+ x35+ x36+ x46+ x56+ x57+x67<=2;
x12+x13+x14<=2;
x12+ x23<=1;
x13+x23+ x34+ x35+ x36<=1;
x14+ x34+ x46<=1;
x35+x56+ x57<=1;
x36+ x46+ x56+x67<=1;
@bin(x12);
@bin(x13);
@bin(x14);
@bin(x23);
@bin(x34);
@bin(x35);
@bin( x36);
@bin(x46);
@bin(x56);
@bin(x57);
@bin(x67);

 3.解:

%方法一:MATLAB程序

定义目标函数:
function y=fun1(x);
y=[2 3 1]*x+[3 1 0]*x.^2;
y=-y;
end
定义非线性约束条件:
function [f,g]=fun2(x);
f=[x(1)+2*x(1)^2+x(2)+2*x(2)^2+x(3)-10
   x(1)+x(1)^2+x(2)+x(2)^2-x(3)-50
   2*x(1)+x(1)^2+2*x(2)+x(3)-40];
g=x(1)^2+x(3)-2;
end
定义线性不等约束矩阵
A=[-1 -2 0;-1 0 0];b=[-1;-10];
[x,y]=fmincon(@fun1,rand(3,1),A,b,[],[],[],[],@fun2)
%方法二:LINGO程序

max=2*x1+3*x1^2+3*x2+x2^2+x3;
x1+2*x1^2+x2+x2^2+x3<10;
x1+x1^2+x2+x2^2-x3<50;
2*x1+x1^2+2*x2+x3<40;
x1^2+x3=2;
x1+2*x2>1;
x1>10;
@free(x2);
@free(x3);

答案供参考,如有错误请自行改正,本人只是随意分享之前的作业,代码均来源于网络+个人稍微修改,认为有用可参考哈~

  • 8
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
XXXX 大学 XXXXXXXX 学院 标 准 实 验 报 告 (实验)课程名称: 信号与系统 XXXX 大学教务处制表 XXXX 大 学 实 验 报 告 学生姓名:XXX 学 号:XXXXXX 指导教师:XX 一、实验室名称:信号与系统实验实验项目名称: 实验一 表示信号、系统的 MATLAB 函数 实验 离散系统的冲激响应、卷积和 实验三 离散系统的转移函数,零、极点分布和模拟 三、实验原理: 实验一 利用 MATLAB 强大的数值处理工具来实现信号的分析和处理,应用 MATLAB 函数来构成信号。常见基本信号归纳如下: 1、单位样值序列 0 1 ) (n 0 0 n n 对应的 MATLAB 语句为: ; 1 ) 1 ( ); , 1 ( x N zeros x 2、单位阶跃序列 0 1 ) (n u 0 0 n n 对应的 MATLAB 语句为: ); , 1 ( N ones x 3、正弦序列 ) / 2 sin( ) ( Fs fn A n x 对应的 MATLAB 语句为: ) / * * * 2 sin( * 1 : 0 fai Fs n f pi A x N n 4、复正弦序列 n j e n x ) ( 对应的 MATLAB 语句为: ) * * exp( 1 : 0 n w j x N n 5、指数序列 n a n x ) ( 对应的 MATLAB 语句为: n a x N n .^ 1 : 0 实验 1. conv 函数: 在离散时间情况下,线性时不变系统的输入输出关系可通过冲激响应 ] [n h 表示 k k n h k x n h n x n y ] [ ] [ ] [ ] [ ] [ MATLAB 提供了求卷积函数 conv,即 y=conv(x,h) 注意:conv 并不产生存储在 y 中的 y[n]样本的序号,而这个序号是有意义的, 因为 x 和 h 的区间都不是 conv 的输入区间,这样就应负责保持这些序号之间的 联系。 2.filter 函数: 考虑一个满足下列差分方程的 LTI 系统: M m m N k k m n x b k n y a 0 0 ] [ ] [ 式中 x[n]是系统输入,y[n]是系统输出。若 x 是包含在区间 1 x x x N n n n 内 x[n]的一个 MATLAB 向量, 而向量 a 和 b 包含系数 k a 和 k b , 那么 y=filter(b,a,x) 就可实现 [ ] y n 。 注意: k a k a ) 1 ( , k b k b ) 1 ( 。因为 MATLAB 要求所有的向量序号都从 1 开 始。 实验三 M m m N k k m n x b k n y a 0 0 ] [ ] [ jN N j jM M j j j j e a e a a e b e b b e A e B e H ... ... ) ( ) ( ) ( 1 0 1 0 ) ( ) ( ) ( ] [ ] [ ] [ ] [ ] [ z H z X z Y m n h m x n h n x n y m N N M M z a z a a z b z b b z A z B z H ... ... ) ( ) ( ) ( 1 1 0 1 1 0 将转移函数分解因式: N i i M i i N i i k M i i k z z K z a z b z H 1 1 1 1 0 0 ) 1 ( ) 1 ( ) ( 得到系统的零、极点图。 在 MATLAB 中,可以用函数[z,p,K]=tf2zp(num,den)求得有理分式形式 的系统转移函数的零、极点,用函数 zplane(z,p)绘出零、极点分布图;也 可以用函数 zplane(num,den)直接绘出有理分式形式的系统转移函数的零、 极点分布图。 四、实验目的: 实验一 加深对常用离散信号的理解; 熟悉表示信号的基本 MATLAB 函数; cos,sin,exp,imag,real,ones,pi,rand,randn,zeros, sinc,sum 实验 加深对离散系统冲激响应、卷积和分析方法的理解 利用 MATLAB 函数 conv、filter 计算卷积及系统输出 实验三 加深对离散系统转移函数、零极点概念的理解 会根据系统转移函数求系统零极点分布 利用 MATLAB 函数 tf2zp、zplane 求系统零极点及绘制零极点图 五、实验内容: 1、使用实验仿真系统 2、MATLAB 仿真 六、实验器材(设备、元器件) : 计算机、matlab 软件 七、实验步骤: 实验实验内容(一) :使用实验仿真系统 1、 在 MATLAB 环境下输入命令 ">>xhxt" , 启动 《信号与系统》

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值