运筹学建模与源代码-题目是《某投资公司有100万元资金用于投资,投资方案有六种》_第1页
运筹学建模与源代码-题目是《某投资公司有100万元资金用于投资,投资方案有六种》_第2页
运筹学建模与源代码-题目是《某投资公司有100万元资金用于投资,投资方案有六种》_第3页
运筹学建模与源代码-题目是《某投资公司有100万元资金用于投资,投资方案有六种》_第4页
运筹学建模与源代码-题目是《某投资公司有100万元资金用于投资,投资方案有六种》_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、运筹学建模与源代码题目:某投资公司有100万元资金用于投资,投资方案有六种,现要做一个5年期的投资方案,具体可选择的投资方案如下:方案A: 5年内每年年初均可投资,且金额不限,投资期限一年,年投资回报率7%;方案B: 5年内每年年初均可投资,且金额不限,投资期限两年,年投资回报率10% (不计复利);方案C: 5年内每年年初均可投资,且金额不限,投资期限三年,年投资回报率12% (不计复利);方案D:只在第一年初有一次投资时机,最大投资金额为50万元,投资期限四年,年投资回报率20% (不计复利);方案E:在第二年和第四年初有一次投资时机,最大投资额为30万元,投资期限一年,年投资回报率30%

2、;方案F:在第四年年初有一次投资时机,金额不限,投资期限两年,年投资回报率25%.假设当年的投资金额及其收益均可用于下一年投资,问公司应如何投资才能使第五年末收回的资金最多?并按要求分别完成以下分析:(1) 方案C的年投资回报率在何范围内变化时最优投资方案不变?(2) 方案E的最大资金金额在何范围内变化时最优投资方案不变?(3) 最初投资额为200万元时的最优投资方案.需要?运筹学课程设计?的同学可以在我上传的文档中找到-、运筹学建模1.1 定义变量:第一年:方案 A投资额为X11,方案B投资额为X12,方案C投资额为X13,方案D投资 额为X14;第二年:方案 A投资额为X21,方案B投资额

3、为X22,方案C投资额为X23,方案E投资 额为X25;第三年:方案A投资额为X31,方案B投资额为X32,方案C投资额为X33;第四年:方案A投资额为X41,方案B投资额为X42,方案E投资额为X45;第五年:方案A投资额为X51,方案F投资额为X46;1.2 约束条件:第一年,方案A、B、C、D均可以投资,投资总额为最大100万元,方案A的投资期限为一年,方案 B为二年,方案 C为三年,方案 D为四年,且只能在第一年年初投 资.所以有 Xu +X12+X13 +X14=100方案D的最大投资额不能超过50万元,所以有X14< 50;第二年,方案A、B、C E均可以投资,方案 E的投资

4、期限为一年,投资总额为方案 A在第一年的收益,所以有X21+X22+X23+X25-1.07X11=0方案E的最大投资额不的超过30万元,所以有X25<30;第三年,方案 A、B、C均可以投资,且投资总额为方案A在第二年的收益,方案B在前两年的收益和方案E在第二年的收益的总和,所以有X31+X32+X33-1.07X 21 -1.2X12-1.3X25=0;第四年,方案A、B、E F均可以投资,方案 F的投资期限为两年,且投资总额为 方案A在第三年的收益,方案B在第二和第三年的收益,方案C在前三年的收益的总和,所以有 X41+X42+X45+X46-1.07X31-1.2X22-1.36

5、X13=0方案E的最大投资额不得超过30万元,所以有X45<30;第五年,只有方案 A可以投资,且投资总额为方案A在第四年的收益,方案 B在第三和第四年的收益,方案C在第二、三、四年的收益,方案 D在前四年的收益,方案 E在第四年的收益的总和,所以有X51-1.07X41-1.2X22-1.8X14-1.3X45-1.36X23=0;1.3 目标函数:maXz=1.07X51+1.2X42+1.36X33+1.5X46第五年末收回的资金额为所有投资可在第五年收回的投资之和,即方案A在第五年的收益,方案 B在第四和第五年的收益,方案 C在第三、四、五年的收益,方案 F 在在第四和第五年的收

6、益的总和,求其最大值即为最有投资方案.1.4 模型:maxz=1.07x51+1.2x42+1.36x 33+1.5x46X11 +X12+X13+X14 = 100X14W 50X21 +X22+X23+X25-1.07X11=0X25 W 30X31+X32+X33-1.07X21-1.2X12-1.3X25=0X41+X42+X45+X46-1.07X 31-1.2X 22-1.36X13 =0X45 30X51-1.07X41-1.2X32-1.8X14-1.3X45-1.36X23=0x,j>0 i=1,2,3,4,5 j=1,2,3,4,5,6二、程序源代码LP_test.j

7、ava/* author Administrator* 单纯形法* 第一行:第一个数字为1代表求目标函数的最大值,-1代表求目标函数的最小值;* 第二个数字代表约束条件的个数;* 第三个数字代表变量个数;* 第四、五、六个数字分别代表w的约束条件个数,=的约束条件个数,R的约束条件个数;* 接下来输入约束条件的系数矩阵和右端项,注意根据w,二, n的顺序;* 最后根据变量下标顺序输入目标函数的价值系数;* 1 3 3 1 1 11 -2 1 11- 2 0 1 1- 4 1 2 3- 3 1 1代表:(x1)-2(x2)+(x3)<=11-2(x1)+(x3)=1-4(x1)+(x2)+

8、2(x3)>=3min z=-3(x1)+(x2)+(x3)*/import java.util.Scanner;import java.util.regex.Pattern;import javax.*;public class LP_Test public static void main(String args) System.out.println("欢送使用本软件,本软件由本小组专门为运筹学课程设计开发! 下面进入程序,请按提示输入正确条件数据!");Scanner sc=new Scanner(System.in);System.out.println(&

9、quot;请输入目标函数类型:1表示 max;-1表示min:");double minmax= Integer.parseInt(sc.next();System.out.println("请输入约束条件个数:");int m=sc.nextInt();System.out.println("请输入变量个数(注意,只输入原始变量数,即不包括引入变 int n=sc.nextInt();System.out.println("请输入 <=的约束条件个数:");int m1=sc.nextInt();System.out.prin

10、tln("请输入=的约束条件个数:");int m2=sc.nextInt();System.out.println("请输入 >=的约束条件个数:");int m3=sc.nextInt();double a口口=new doublemn+1;for(int i=0;i<m;i+)System.out.println("请输入系数矩阵第"+(i+1)+"行(注:数与数间用,'间隔,并 且先输入完 <=的,再输入完=的,最后输入完 >=的):");double b=new doubl

11、en+1;String regex=","Pattern p=Pattern pile(regex);String r=p.split(sc.next();for(int j=0;j<r.length;j+)if(!(rj.trim().equals("")bj=Double.parseDouble(rj);aij=bj;double x=new doublen;System.out.println("请输入目标函数系数(注:数与数间用,间隔):");String regex=","Pattern p=Pat

12、tern pile(regex);String r=p.split(sc.next();for(int j=0;j<r.length;j+)if(!(rj.trim().equals("")xj=Double.parseDouble(rj); System.out.println("辛苦了,您输入的系数矩阵为: ");for(int j=0;j<n+1;j+)System.out.print(aij+"t");)System.out.println("");)for(int i=0;i<n;i+)

13、System.out.print(xi+"t");)System.out.println("");/传入参数,开始执行 /LP lp = new LP(minmax,m,n,m1,m2,m3,a,x);lp.solve();)LP.java/* author Administrator* 单纯型算法* /public class LP private int m; /约束条件的个数private int n; / 变量个数private int m1; /<=的约束条件个数private int m2; /=的约束条件个数private int m

14、3; />=的约束条件个数private int error; /判断是否是错误的private int basic口; 基变量矩阵private int nonbasic;/ 非基变量矩阵private double a; /约束条件的系数矩阵private double minmax; /目标函数的最大值或最小值/* param minmax -求函数的最大值或最小值* param m -约束条件的个数* param n -变量个数* param ml -<=的约束条件个数* param m2 -=的约束条件个数* param m3 ->=的约束条件个数* param a

15、 -约束条件的系数矩阵* param x -目标函数的价值系数*/public LP(double minmax,int m,int n,int m1,int m2,int m3,double a,double x) (double value;this.error = 0;this.minmax = minmax;this.m = m;this.n = n;this.m1 = m1;this.m2 = m2;this.m3 = m3;/ 数据初始化 /error:判断约束条件总数是否与输入一致if(m != m1+m2+m3)(this.error = 1;系数矩阵athis.a = new

16、 doublem+2口;for(int i = 0; i < m+2; i+)(this.ai = new doublen+m+m3+1;/基变量矩阵this.basic = new intm+2;/非基变量矩阵this.nonbasic = new intn+m3+1;/系数矩阵内数值全初始化为0for(int i = 0; i <= m+1; i+)(for(int j = 0; j <= n+m+m3; j+)(this.aij = 0.0;)/标记非基变量for(int j = 0; j <= n+m3; j+)(nonbasicj = j;)/标记基变量for

17、(int i = 1,j = n+m3+1; i <= m; i+,j+)(basici=j;)for(int i = m-m3+1,j = n+1; i<= m; i+,j+)(this.aij=-1;this.am+1j=-1;)for(int i = 1; i <= m; i+)(for(int j = 1; j <= n; j+)(value = ai-1j-1;this.aij=value;)value = ai-1n;if(value<0)(error = 1;)this.ai0=value;)for(int j = 1; j <= n; j+)

18、 /价值系数即约束条件右端项(value = xj - 1;this.a0j = value * minmax;/ 矩阵第一行为目标函数系数)for(int j = 1; j <= n; j+)(value = 0;for(int i = m1+1; i <= m; i+)value+=this.aij;this.am+1j=value;)/构造函数结束 /换入public int enter(int objrow)(int col = 0;for(int j = 1; j <= this.n + this.m3; j+)(/10e-8 : 一个很小的数if(this.non

19、basicj <= this.n + this.m1 + this.m3 && this.aobjrowj > 10e-8) (col=j;break;)return col;)/由列号得到换出行号public int leave(int col)(double temp=-1;int row = 0;for(int i = 1; i <= this.m; i+)(double val = this.aicol;if( val > 10e-8)(val = this.ai0/val;if(val < temp | temp = -1)(row =

20、i;temp = val;return row;/对调换入换出变量public void swapbasic(int row,int col)(int temp = this.basicrow;this.basicrow = this.nonbasiccol;this.nonbasiccol = temp;/换入换出public void pivot(int row,int col)(/主元化为1,主元所在列各元素化为for(int j = 0;j <= this.n + this.m3; j+)(if(j != col)(this.arowj = this.arowj / this.a

21、rowcol;)this.arowcol = 1.0 / this.arowcol;for(int i = 0; i <= this.m + 1; i+)(if(i != row)(for(int j = 0; j <= this.n + this.m3; j+)(if(j != col)(this.aij = this.aij - this.aicol * this.arowj;if(Math.abs(this.aij) < 10e-8)this.aij=0;)this.aicol = -this.aicol * this.arowcol;)swapbasic(row,co

22、l);System.out.println("反复迭代过程如下:");for(int i=0;i<=m;i+)System.out.print("X("+basici+")"+"");for(int j=0;j<n+1;j+)System.out.print(aij+"t");)System.out.println("");)/单纯行迭代public int simplex(int objrow)int row = 0;while(true)(int col =

23、enter(objrow);if(col > 0)(row=leave(col);)else(return 0;)if(row > 0)(pivot(row,col);)else(return 2;)第一阶段public int phase1()(this.error = simplex(this.m + 1);if(this.error > 0)(return this.error;)for(int i = 1; i <= this.m; i+)(if(this.basici > this.n + this.m1 + this.m3)(if(this.ai0 &

24、gt; 10e-8)return 3;)for(int j = 1; j <= this.n; j+)(if(Math.abs(this.aij) >= 10e-8)(pivot(i,j);break;)return 0;)/第二阶段public int phase2()(return simplex(0); 容错判断,计算 error的数值)public int compute()(/error原始为0,假设,此处>0,表示输入有错误if(this.error > 0)return this.error;if(this.m != this.m1) 如果约束条件个数不全为<=,转为第一阶段(this.error = phase1();/再次判断if(this.error > 0)ret

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论