最大子段和问题实验报告

最大子段和问题实验报告
最大子段和问题实验报告

实验四最大子段和问题

1.实验目的

(1)掌握动态规划的设计思想并能熟练运用;

(2)理解这样一个观点:同样的问题可以用不同的方法解决,一个好的算法是反复努力和重新修正的结果;

2.实验要求

(1)分别用蛮力法、分治法和动态规划法设计最大子段和问题的算法;

(2)比较不同算法的时间性能;

(3)给出测试数据,写出程序文档;

3.实验设备和软件环境

操作系统:Windows 7(64x)

开发工具:Visual Studio 2013

4.实验步骤

以下实验数据都是以数组a[]={-2, 11, -4, 13, -5, -2}为例子;

蛮力法

蛮力法是首先通过两个for循环去求出所有子段的值,然后通过if语句查找出maxsum,返回子序列的最大子段和;

分治法

(1)划分:按照平衡子问题的原则,将序列(a1,a2,…,an)划分成长度相同的两个子序列(a1,a2,...,an/2)和(an/2+1,…,an);

(2)求解子问题:对与划分阶段的情况①和②可递归求解,情况③需要分别计算

s1=max{ a k n/2k=i }(1<=i<=n/2),s2=max { a k j

k=n 2+1}(n/2+1<=j<=n),则s1+s2为情况③

的最大子段和。

(3) 合并:比较在划分阶段三种情况下的最大子段和,取三者中比较大者为原问题的解。 动态规划法划分子问题

(1) 划分子问题;

(2) 确定动态规划函数;

(3) 填写表格;

分为两种情况:

(1)、当b[j-1]>0时,b[j]=b[j-1]+a[j]。

(2)、当b[j-1]<0时,b[j]=a[j]

然后做递归操作求出最大子段和;

5.实验结果

蛮力法 #include

#include

usingnamespace std;

/*------------------------------------------------------------------------------*/ int manlifa(int a [],int x )

{

int i, j,sum=0,maxsum=0;

for (i = 0; i

{

for (j = i+1; j

{

sum = a [i];

a [i] += a [j];

if (a [i]>sum)

{

sum = a [i];

}

if (sum>maxsum)

{ maxsum = sum;

}

}

}

return maxsum;

}

int main()

{

int y,sum;

int a[] = { -20, 11, -4, 13, -5, -2 };

int c = sizeof(a)/sizeof(int);

sum = manlifa(a, c);

cout<< sum;

cin>> y;

return 0;

}

分治法

#include

#include

usingnamespace std;

int MaxSum(int a[], int left, int right)

{

int sum = 0, midSum = 0, leftSum = 0, rightSum = 0;

int center, s1, s2, lefts, rights;

if (left == right)

sum = a[left];

else

{

center = (left + right) / 2;

leftSum = MaxSum(a, left, center);

rightSum = MaxSum(a, center + 1, right);

s1 = 0;

lefts = 0;

for (int i = center; i >= left; i--)

{

lefts += a[i];

if (lefts > s1) s1 = lefts;

}

s2 = 0;

rights = 0;

for (int j = center + 1; j <= right; j++)

{

rights += a[j];

if (rights > s2) s2 = rights;

}

midSum = s1 + s2;

if (midSum

else

sum = midSum;

if (sum

}

return sum;

}

int main()

{

/*int sum;

//inta[] = { -20, 11, -4, 14, -5, -2 };

//sum1 = MaxSum(a, 0, 5);

cout<< sum1 <

int j,n;

int b[100];

cout<<"请输入序列长度:";

cin>> n;

cout<<"请输入序列子段:";

for (j = 0; j < n; j++)

{

cin>> b[j];

}

int sum,i;

sum = MaxSum(b, 0, 5);

cout<< sum<

cin>> i;

return 0;

}

动态规划法

#include

usingnamespace std;

int MaxSum(int n, int *a)

{

int sum = 0, b = 0;

for (int i = 1; i <= n; i++)

{

if (b>0)

{

b += a[i];

}

else

{

b = a[i];

}

if (b>sum)

{

sum = b;

}

}

return sum;

}

int main()

{

int k;

int a[] = { -2, 11, -4, 13, -5, -2 };

for (int i = 0; i<6; i++)

{

cout<< a[i] <<" ";

}

cout<

cout<<"数组a的最大连续子段和为:"<

cin>> k;

return 0;

}

6.讨论和分析

在一开始做最大子段问题的实验的时候,对于蛮力法和分治法的理解还是可以的,但是对于动态规划法的理解还不是那么明确透彻,通过网上的一些解释和结合自己书本上的知识,对动态规划法得到了进一步的理解,接下来是三种算法时间性能的比较:

蛮力法:

时间复杂度为O(n2)

分治法:

时间复杂度为:T(n)=O(nlog(n))

动态规划:

时间复杂度为:T(n)=O(n)

对于最大子段和问题在上述三种不同的算法中,动态规划算法的时间性能相对于其他两个比较好。

最优化实验报告

最优化方法 课程设计报告班级:________________ 姓名: ______ 学号: __________ 成绩: 2017年 5月 21 日

目录 一、摘要 (1) 二、单纯形算法 (2) 1.1 单纯形算法的基本思路 (2) 1.2 算法流程图 (3) 1.3 用matlab编写源程序 (4) 二、黄金分割法 (7) 2.1 黄金分割法的基本思路 (7) 2.2 算法流程图 (8) 2.3 用matlab编写源程序 (9) 2.4 黄金分割法应用举例 (11) 三、最速下降法 (11) 3.1 最速下降法的基本思路 (11) 3.2 算法流程图 (13) 3.3 用matlab编写源程序 (13) 3.4 最速下降法应用举例 (13) 四、惩罚函数法 (17) 4.1 惩罚函数法的基本思路 (17) 4.2 算法流程图 (18) 4.3 用matlab编写源程序 (18) 4.4 惩罚函数法应用举例 (19) 五、自我总结 (20) 六、参考文献 (20)

一、摘要 运筹学是一门以人机系统的组织、管理为对象,应用数学和计算机等工具来研究各类有限资源的合理规划使用并提供优化决策方案的科学。通过对数据的调查、收集和统计分析,以及具体模型的建立。收集和统计上述拟定之模型所需要的各种基础数据,并最终将数据整理形成分析和解决问题的具体模型。 最优化理论和方法日益受到重视,已经渗透到生产、管理、商业、军事、决策等各个领域,而最优化模型与方法广泛应用于工业、农业、交通运输、商业、国防、建筑、通信、政府机关等各个部门及各个领域。伴随着计算机技术的高速发展,最优化理论与方法的迅速进步为解决实际最优化问题的软件也在飞速发展。其中,MATLAB软件已经成为最优化领域应用最广的软件之一。有了MATLAB 这个强大的计算平台,既可以利用MATLAB优化工具箱(OptimizationToolbox)中的函数,又可以通过算法变成实现相应的最优化计算。 关键词:优化、线性规划、黄金分割法、最速下降法、惩罚函数法

算法分析与设计 实验三 最大子段和问题

昆明理工大学信息工程与自动化学院学生实验报告 ( 201 — 201 学年 第 1 学期 ) 课程名称:算法分析与设计 开课实验室: 年 月 日 一、上机目的及内容 1.上机内容 给定有n 个整数(可能有负整数)组成的序列(a 1,a 2,…,a n ),求改序列形如 ∑=j k k a 1 的子段和的 最大值,当所有整数均为负整数时,其最大子段和为0。 2.上机目的 (1)复习数据结构课程的相关知识,实现课程间的平滑过渡; (2)掌握并应用算法的数学分析和后验分析方法; (3)理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。 二、实验原理及基本技术路线图(方框原理图或程序流程图) (1)分别用穷举法、分治法和动态规划法设计最大子段和问题的算法; (2)对所设计的算法采用大O 符号进行时间复杂性分析; (3)上机实现算法,并用计数法和计时法分别测算算法的运行时间; (4)通过分析对比,得出自己的结论。 穷举法是用一个二维数组将从i 到j 的和都记录下来,再比较各元素的大小,时间复杂性为O (n 2),分治法的设计思想是不断将问题为子问题,然后求解子问题,最后对解进行合并,时间复杂性为O(nlog n ),动态规划法的设计思想是将问题划分为若干个子问题,时间复杂度为O(n)。

分治法流程图:

穷举法流程图: 动态规划法流程图: 三、所用仪器、材料(设备名称、型号、规格等或使用软件) 1台PC 及VISUAL C++6.0软件

四、实验方法、步骤(或:程序代码或操作过程) 程序代码: //穷举法 #include void main() { int i,j,n; int num[100],a[100],max; printf("\t\t\t 最大子段和问题(穷举法)\n\n"); printf("请输入所要求最大字段和整数的个数:\n"); scanf("%d",&n); printf("请分别输入这%d个整数的值:\n",n); for(i=0;i int MaxSum(int a[],int left,int right) { int sum=0; if (left==right) {

运筹学实验报告

运 筹 学 实 验 报 告 学院:经济管理学院 专业班级:工商11-2班 姓名:石慧婕 学号:311110010207

实验一线性规划 一实验目的 学习WinQSB软件的基本操作,利用Linear Programming功能求解线性规划问题。掌握线性规划的基本理论与求解方法,重点在于单纯形法的应用以及灵敏度分析方法。 二、实验内容 安装WinQSB软件,了解WinQSB软件在Windows环境下的文件管理操作,熟悉软件界面内容,掌握操作命令。利用Linear Programming功能建立线性模型,输入模型,求解模型,并对求解结果进行简单分析。 三实验步骤 1.将WinQSB文件复制到本地硬盘;在WinQSB文件夹中双击setup.exe。 2.指定安装WinQSB软件的目标目录(默认为C:\ WinQSB)。 3.安装过程需要输入用户名和单位名称(任意输入),安装完毕之后,WinQSB菜单自动生成在系统程序中。 4.熟悉WinQSB软件子菜单内容及其功能,掌握操作命令。 5.求解线性规划问题。启动程序开始→程序→WinQSB→Linear and Integer Programming。 某工厂要用三种原材料C、P、H混合调配出三种不同规格的产品A、B、D。已知产品的规格要求,产品单价,每天能供应的原材料数量及原材料单价分别见下表1和2。该厂应如何安排生产,使利润收入为最大? 表1 产品名称规格要求单价(元/kg) A 原材料C不少于50% 原材料P不超过25% 50 B 原材料C不少于25% 原材料P不超过50% 35 D 不限25 表2 原材料名称每天最多供应量(kg)单价(元/kg)

最大子段和动态规划法

实验名称: 最大子段和问题 实验目的: 了解最大子段和问题 实验环境: 操作系统:Windows XP Professional SP3 机器配置:Intel Pentium4 CPU 3.0GHz , 512MB 内存 开发工具:eclipse 实验内容: 1. 求数列的最大子段和(要求时间复杂为nlogn) (算法设计与分析 吕国英 清华大学出 版社 135页 4..3.3 二分法变异) (分治法) (也可用动态规划算法 参看递归王晓东计算机算法设计与分析第三版p61页) 算法的设计思想: 在对分治法德算法分析中注意到,若记???? ? ? <=<==∑=j i k k a n j i i b ][max ][,1<=j<=n,则所求的 最大子段和为: ][1max ][1max 1max ][1max j b n j k a j i n j k a n j i j i k j i k <=<== <=<=<=<==????? ?<=<=<=∑ ∑== 分为两种情况: (1)、当b[j-1]>0时,b[j]=b[j-1]+a[j]。 (2)、当b[j-1]<0时,b[j]=a[j]。 由此可得计算b[j]的动态规划递归式为: b[j]=max }{][],[]1[j a j a j b +-,1<=j<=n 由分析可知:次算法一共比较了n 次,故: T(n)=O(n)

据此可以写出如下程序: 实验步骤: 程序代码如下: package s; public class Po{ public static void main(String[] args) { int[] a=new int[10]; int[] b=new int[10]; int[] x=new int[10]; int start=0; int end = 0; System.out.print("数组为:");//随机赋值 for(int i =0;i<10;i++){ a[i]=(int)(Math.random()*100-50); System.out.print(a[i]+" "); } System.out.print("\n"); tem(a,x,b); int max=maxSum(a,b,end); System.out.print("最大子段和为:"); System.out.println(max); System.out.print("结束位置为:"); System.out.println(findend(a,b,end)); int begin=findStart(a,b,start,end); System.out.print("开始位置为:"); System.out.println(begin); systemout(x,start,end,a,b); } public static void tem(int a[],int x[],int b[]) {int n=a.length-1; int sum=0; b[0]=x[0];

运筹学实验报告1

运筹学实验报告(一) 实验要求:学会在Excel 软件中求解。 实验目的:通过小型线性规划模型的计算机求解方法。 熟练掌握并理解所学方法。 实验内容: 题目: 某昼夜服务的公交线路每天各时间区段内所需司机和乘务人员数如下; 设司机和乘务人员分别在各时间区段一开始上班,并连续工作八小时,问该公交线 路至少配备多少名司机和乘 务人员。列出这个问题的线 性规划模型。 解:设Xj 表示在第j 时间区段开始上班的司机和乘务人员数 班次 时间 所需人数 1 6:00-10:00 60 2 10:00-14:00 70 3 14:00-18:00 60 4 18:00-22:00 50 5 22:00-2:00 20 6 2:00-6:00 30

。 6-10 10-14 14-18 18-22 22-2 2-6 1 X1--- X1 2 X2--- X2 3 X3--- X3 4 X4--- X4 5 X5--- X5 6 X6 X6--- 60 70 60 50 20 30 所需人 数 Min z=x1+x2+x3+x4+x5+x6 St: x1+x6>=60 X1+x2>=70 X2+x3>=60 X3+x4>=50 X4+x5>=20 X5+x6>=30 Xj>=0,xj为整数, j=1,2,3,4,5,6

过程: 工作表[Book1]Sheet1 报告的建立: 2011-9-28 19:45:01 目标单元格(最小值) 单元格名字初值终值 $B$1 min 0 150 可变单元格 单元格名字初值终值 $B$3 x 0 45 $C$3 x 0 25 $D$3 x 0 35 $E$3 x 0 15 $F$3 x 0 15 $G$3 x 0 15 结果:最优解X=(45,25,35,15,15,15)T 目标函数值z=150 小结:1.计算机计算给规划问题的解答带来方便,让解答变得简洁;

分治法求最大子段和问题

分治法求最大子段和问题 共有四种方法: 算法一; 算法二; 算法三、Divide and Conquer 算法四源代码、On-line Algorithm 算法一源代码: /*Given (possibly negative) integers A1, A2, …, AN, find the maximum value. 找最大子段和*/ #include #include #include intMaxSubsequenceSum(int A[],int N); main() { inti,N,*A,MaxSum,judge; LARGE_INTEGER begin,end,frequency; //代表64位有符号整数,记录程序运行时间QueryPerformanceFrequency(&frequency);//可以获得当前的处理器的频率 printf("输入整数的个数:"); scanf("%d",&N); A=(int *)malloc(N*sizeof(int)); //用数组给数据动态分配空间 printf("自行输入数据请按1,随机产生数据请按2\n"); scanf("%d",&judge); if(judge==1){ //自行输入数据 printf("输入%d个整数:",N); for(i=0;i

运筹学线性规划实验报告

《管理运筹学》实验报告实验日期: 2016年 04月 21日—— 2016 年 05 月 18 日

3.在点击“新建”按钮以后,按软件的要求输入目标函数个数和约束条件个数,输入目标函数级约束条件的歌变量的系数和b值,并选择好“≤”、“≥”或“=”,如图二所示,最后点击解决

4.注意事项: (1)输入的系数可以是整数、小数,但不能是分数,要把分数化为小数再输入。(2)输入前要合并同类项。 当约束条件输入完毕后,请点击“解决”按钮,屏幕上讲显现线性规划问题的结果,如图所示

5.输出结果如下

5.课后习题: 一、P31习题1 某家具公司生产甲、乙两种型号的组合柜,每种组合柜需要两种工艺(制白坯和油漆).甲型号组合柜需要制白坯6工时,油漆8工时:乙型号组合柜需要制白坯12工时,油漆4工时.已知制白坯工艺的生产能力为120工时/天,油漆工艺的生产能力为64工时/天,甲型号组合柜单位利润200元,乙型号组合柜单位利润为240元. 约束条件: 问题: (1)甲、乙两种柜的日产量是多少?这时最大利润是多少? 答:由实验过程中的输出结果得甲组合柜的日产量是4个,乙的事8个。 . 0,0,6448,120126;240200 z max ≥≥≤+≤++=y x y x y x y x

(2)图中的对偶价格13.333的含义是什么? 答: 对偶价格13.333的含义是约束条件2中,每增加一个工时的油漆工作,利润会增加13.33元。 (3)对图中的常数项围的上、下限的含义给予具体说明,并阐述如何使用这些信息。 答:当约束条件1的常数项在48~192围变化,且其他约束条件不变时,约束条件1的对偶价格不变,仍为15.56;当约束条件2的常数项在40~180围变化,而其他约束条件的常数项不变时,约束条件2的对偶价格不然,仍为13.333。 (4)若甲组合柜的利润变为300,最优解不变?为什么? 答:目标函数的最优值会变,因为甲组合柜的利润增加,所以总利润和对偶价格增加;甲、乙的工艺耗时不变,所以甲、乙的生产安排不变。 二、学号题 约束条件: 无约束条件 (学号)学号43214321432143214321 0 0,30 9991285376)(53432max x x x x x x x x x x x x x x x x x x x x z ≤≥≤-+-+≥-+-+=-++-+++=??????????????-≥?-?-?-?-?-7606165060~5154050~414 )30(40~313)20(30~21210 20~11 10~1)(学号)(学号)(学号学号学号)(学号不变学号规则

运筹学指派问题的匈牙利法实验报告

运筹学 课 程 设 计 报 告 专业: 班级: 学号: : 2012年6月20日

目录 一、题目。 二、算法思想。 三、算法步骤。 四、算法源程序。 五、算例和结果。 六、结论与总结。

一、题目:匈牙利法求解指派问题。 二、算法思想。 匈牙利解法的指派问题最优解的以下性质: 设指派问题的系数矩阵为C=()c ij n n?,若将C的一行(或列)各元素分别减去一个常数k(如该行或列的最小元素),则得到一个新的矩阵C’=()'c ij n n?。那么,以C’位系数矩阵的指派问题和以C位系数矩阵的原指派问题有相同最优解。 由于系数矩阵的这种变化不影响约束方程组,只是使目标函数值减少了常 数k,所以,最优解并不改变。必须指出,虽然不比要求指派问题系数矩阵中无 负元素,但在匈牙利法求解指派问题时,为了从以变换后的系数矩阵中判别能否 得到最优指派方案,要求此时的系数矩阵中无负元素。因为只有这样,才能从总 费用为零这一特征判定此时的指派方案为最优指派方案。 三、算法步骤。 (1)变换系数矩阵,使各行和各列皆出现零元素。 各行及各列分别减去本行及本列最小元素,这样可保证每行及每列中都有 零元素,同时,也避免了出现负元素。 (2)做能覆盖所有零元素的最少数目的直线集合。

因此,若直线数等于n,则以可得出最优解。否则,转第(3)步。 对于系数矩阵非负的指派问题来说,总费用为零的指派方案一定是最优指派方案。在第(1)步的基础上,若能找到n个不同行、不同列的零元素,则对应的指派方案总费用为零,从而是最优的。当同一行(或列)上有几个零元素时,如选择其一,则其与的零元素就不能再被选择,从而成为多余的。因此,重要的是零元素能恰当地分布在不同行和不同列上,而并在与它们的多少。但第(1)步并不能保证这一要求。若覆盖所有零元素的最少数目的直线集合中的直线数目是n,则表明能做到这一点。 此时,可以从零元素的最少的行或列开始圈“0”,每圈一个“0”,同时把位于同行合同列的其他零元素划去(标记为),如此逐步进行,最终可得n个位于不同行、不同列的零元素,他们就对应了最优解;若覆盖所有零元素的最少数目的直线集合中的元素个数少于n,则表明无法实现这一点。需要对零元素的分布做适当调整,这就是第(3)步。 (3)变换系数矩阵,是未被直线覆盖的元素中出现零元素。回到第(2)步。 在未被直线覆盖的元素中总有一个最小元素。对未被直线覆盖的元素所在的行(或列)中各元素都减去这一最小元素,这样,在未被直线覆盖的元素中势必会出现零元素,但同时却又是以被直线覆盖的元素中出现负元素。为了消除负元素,只要对它们所在的列(或行)中个元素都加上这一最小元素(可以看作减去这一最小元素的相反数)即可。 四、算法源程序。

最大子序列和的总结

最大子序列和 第一种情况:可以一个不取 【问题描述】:最大子序列和也叫数列的连续最大和,顾名思义,就是在一个长度为n的数列{An}中,求i,j(1<=i<=j<=n),使得数列{An}中,第i个元素到第j个元素之间,所有元素的和最大。例如:-2, 11, -4, 13, -5, -2时答案为20(11 -4 13) 解法一穷举法:以前我想出了一种算法,具体做法是:取出所给序列的所有子序列求和,共分n组,第一组长度为1,有n个;第二组长度为2, 有n-1个;……,最后一组,长度为n,只有一个。比较这n(n+1)/2个序列的和,再将每组的最大值比较,从而得到最大值以及其上下标。 a1 a2 a n-1 a n a1+a2 a2+a3 a n-1+a n a1+a2+a3 a2+a3+a4 ...... ...... ...... a1+a2......+a n-1 a2+a3......+a n a1+a2......+a n-1 +a n 此算法比较直接,也容易写出代码,但其时间开销为O(n2),空间开销为O(n),效率不高。 解法二:动态规划求解, 1 2 F[i]:表示以元素i结尾的连续最大子序列的和 那么对于第i个元素来说,要形成连续的最大子序列,只和相邻的前一个元素有关。因为可以不取,所以如果元素a[i]连接到以元素i-1结尾的最大连续子序列f[i-1]后是负数(f[i-1]+a[i]<0);则宁可不取,这样最大连续子序列和为0。 动态方程: f[i]:=max{0,f[I-1]+a[i]} (边界条件:f[0]=0;) 3、代码1: for I:=1 to n do if (f[I-1]+a[i])>0 then f[i]:=f[I-1]+a[i] else f[i]:=0; max:=-maxlongint; for i:=1 to n do if f[i]>max then max:=f[i];

运筹学实验报告

运筹学实验报告 专业: 班级:? 姓名:? ?学号: 指导教师: 数学与应用数学专业 2015—12—18 实验目录 一、实验目得?3 二、实验要求?3 三、实验内容..................................................................................................................... 3 1、线性规划?3 2、整数规划?6 3、非线性规划 (13) 4、动态规划........................................................................................................... 14 5、排队论?19 四、需用仪器设备........................................................................................................... 26 五、MATLAB优化工具箱使用方法简介 (26) 六、LINGO优化软件简介.......................................................................................... 26 七、实验总结?27

一、实验目得 1、会利用适当得方法建立相关实际问题得数学模型; 2、会用数学规划思想及方法解决实际问题; 3、会用排队论思想及方法解决实际问题; 4、会用决策论思想及方法解决实际问题; 5、掌握MATLAB、LINGO等数学软件得应用; 二、实验要求 1、七人一组每人至少完成一项实验内容; 2、每组上交一份实验报告; 3、每人进行1~2分钟实验演示; 4、实验成绩比例: 出勤:40% 课堂提问:20% 实验报告:30% 实验演示:10%. 三、实验内容 1、线性规划 例运筹学74页14题 Minz=—2x —x2 s、t、2x1+5x2≤60 x1+x2≤18 3x1+x2≤44 X2≤10 X1,x2≥0 用matlab运行后得到以下结果:

算法分析习题详细答案五

1.最大子段和问题:给定整数序列 n a a a ,,,21 ,求该序列形如 j i k k a 的子段和 的最大值: j i k k n j i a 1max ,0max 1) 已知一个简单算法如下: int Maxsum(int n,int a,int& best i,int& bestj){ int sum = 0; for (int i=1;i<=n;i++){ int suma = 0; for (int j=i;j<=n;j++){ suma + = a[j]; if (suma > sum){ sum = suma; besti = i; bestj = j; } } } return sum; }试分析该算法的时间复杂性。 2) 试用分治算法解最大子段和问题,并分析算法的时间复杂性。 3) 试说明最大子段和问题具有最优子结构性质,并设计一个动态规划算法解最大子段和问题。分析算法的时间复杂度。 (提示:令1()max ,1,2,,j k i j n k i b j a j n L ) 解:1)分析按照第一章,列出步数统计表,计算可得)(2 n O 2)分治算法:将所给的序列a[1:n]分为两段a [1:n/2]、a[n/2+1:n],分别求出这两段的最大子段和,则a[1:n]的最大子段和有三种可能: ①a[1:n]的最大子段和与a[1:n/2]的最大子段和相同; ②a[1:n]的最大子段和与a[n/2+1:n]的最大子段和相同; ③a[1:n]的最大子段和为两部分的字段和组成,即 j n j i l n i j a a a a a 122;

intMaxSubSum ( int *a, int left , int right){ int sum =0; if( left==right) sum = a[left] > 0? a[ left]:0 ; else {int center = ( left + right) /2; int leftsum =MaxSubSum ( a, left , center) ; int rightsum =MaxSubSum ( a, center +1, right) ; int s_1 =0; int left_sum =0; for ( int i = center ; i >= left; i--){ left_sum + = a [ i ]; if( left_sum > s1) s1 = left_sum; } int s2 =0; int right_sum =0; for ( int i = center +1; i <= right ; i++){ right_sum + = a[ i]; if( right_sum > s2) s2 = right_sum; } sum = s1 + s2; if ( sum < leftsum) sum = leftsum; if ( sum < rightsum) sum = rightsum; } return sum; } int MaxSum2 (int n){ int a; returnMaxSubSum ( a, 1, n) ; } 该算法所需的计算时间T(n)满足典型的分治算法递归分式T(n)=2T(n/2)+O(n),分治算法的时间复杂度为O(nlogn)

2015运筹学实验报告

实验报告 课程名称:运筹学 专业:市场营销 班级:11302 任课教师:汪长飚 学号:201305549 (21) 姓名:杨威 实验日期:2015 年 6 月10 日 长江大学管理学院

一、实验性质和教学目的 本实验是管理及经济类本科生运筹学课程的上机操作实验,实验的内容是本科生阶段运筹学Ⅰ的所有内容,主要包括线性规划、整数规划、运输问题、目标规划、动态规划、图与网络、网络计划等。实验目的在于使学生掌握应用计算机工具解决运筹学模型优化求解的方法步骤,熟悉各种运筹学优化软件的使用,特别是Excel 优化功能的使用,为今后在实际工作中解决大型的实际问题优化模型奠定基础。同时,通过熟悉优化软件的操作激发同学的学习兴趣,提高本课程的教学效果。 二、实验软件 软件名称:MS-office Excel电子表格软件 开发者:Microsoft 软件内容:Office Excel 规划求解软件包及相关挂接软件包

实验一应用EXCEL规划求解的加载与参数的设置 一、实验目的与要求 1. 1.掌握EXCEL宏的加载和规划工具的加载 2. 2.了解规划求解参数的设置 二、实验步骤与方法 1.规划求解加载,在“工具”菜单上,单击“加载宏”。 2.规划求解参数。 1)设置目标单元格 在此指定要设置为特定数值或者最大值或最小值的目标单元格。该单元格必须包含公式,公式为规划问题的目标函数,根据不同问题的线性规划而异。 2)等于 在此指定是否希望目标单元格为最大值、最小值或某一特定数值。如果需要指定数值,请在右侧编辑框中输入该值。 3)可变单元格 在此指定可变单元格。求解时其中的数值不断调整,直到满足约束条件并且“设置目标单元格”框中指定的单元格达到目标值。可变单元格必须直接或间接地与目标单元格相关联。可变单元格即为数学模型中的决策变量。 4)推测 单击此按钮,自动推测“设置目标单元格”框中的公式所引用的所有非公式单元格,并在“可变单元格”框中定位这些单元格的引用。一般不选择“推测”,而是将光标置于可变单元格内,再在工作表中选择决策变量所在的单元格区域。 5)约束 在此列出了规划求解的所有约束条件。 (1) 添加:显示“添加约束”对话框。 (2) 更改:显示“更改约束”对话框。 (3) 删除:删除选定的约束条件。 6)求解 对定义好的问题进行求解。 在“可用加载宏”框中,选中“规划求解”旁边的复选框

最大字段和问题

最大字段和问题 1.实验题目 给定由N 个整数(可能有负整数)组成的序列(1a ,2a ,…,n a ),求该序列形如∑=j i k k a 的子段和的最大值,当所有整数均为负整数是,其最大子段和为0。 2.实验目的 (1)深刻掌握动态规划法的设计思想并能熟练运用; (2)理解这样一个观点:同样的问题可以用不同的方法解决,一个好的算法是反复努力和重新修正的结果。 3.实验分析 蛮力法:利用3个for 的嵌套(实现从第1个数开始计算子段长度为1,2,3…n 的子 段和,同理计算出第2个数开始的长度为1,2,3…n-1的子段和,依次类推到第n 个数开始计算的长为1的子段和)和一个if (用来比较大小),将其所有子段的和计算出来并将最大子段和赋值给summax1。 用了3个for 嵌套所以时间复杂性为○(n 3)。 分治法: (1)划分:按照平衡子问题的原则,将序列(1a ,2a ,…,n a )划分成长度相同的 两个字序列(1a ,…,??2/n a )和(??12/+n a ,…,n a ) 。 (2)求解子问题:对于划分阶段的情况分别的两段可用递归求解,如果最大子段和在 两端之间需要分别计算 s1=?? ??)2/1(max 2/n i a n i k k ≤≤∑=,s2=????)2/(max 12/n j n a j n k k ≤≤∑+=, 则s1+s2为最大子段和。若然只在左边或右边,那就好办了,前者视s1为summax2,后者视s2 o summax2。 (3)合并:比较在划分阶段的3种情况下的最大子段和,取三者之中的较大者为原问 题的解。 (4)时间复杂性分析: f(n) = 2*f(n/2) + ○(n/2), 最后为○(nlogn)。 动态规划法: 动态规划法求解最大字段和问题的关键是要确定动态规划函数。记 )1(max )(1n j a j b i i k k j i ≤≤? ?????=∑=≤≤ 则

最大字段和

最大字段和 【实验目的】 1掌握动态规划法的设计思想并能熟练运用; 2分别用分治法和动态规划法设计最大子段和问题的算法; 【实验设备与环境】 1 PC机一台 2 Turbo C 或VC++ 【实验内容:】 给定由n个整数(可能为负整数)组成的序列a1, a2, …, an,求该序列形如的子段和的最大值,当所有整数均为负整数时定义其最大子段和为0。 【实验方法步骤】 1用分治法求最大子段和 程序代码: #include int MaxSum(int a[],int left,int right) { int i,sum=0; if(left==right) sum=a[left]>0?a[left]:0; else { int center=(left+right)/2; int leftsum=MaxSum(a,left,center); int rightsum=MaxSum(a,center+1,right); int s1=0,s2=0,lefts=0,rights=0; for(i=center;i>=left;i--) { lefts+=a[i]; if(lefts>s1) s1=lefts; }

for(i=center+1;i<=right;i++) { rights+=a[i]; if(rights>s2) s2=rights; } sum=s1+s2; if(sum

运筹学实验之最小费用最大流综合实验

综合性、设计性实验报告格式 桂林电子科技大学 数学与计算科学学院综合性、设计性实验报告 实验室: 实验日期:2014年12月13日 院(系) 数学与计算科学 年级、专业、班 姓名 成绩 课程 名称 运筹学实验 实验项目 名 称 最小费用最大流(综合实验) 指导 教师 南江霞 教师 评语 教师签名: 年 月 日 一 ,实验目的 1. 掌握最大流及最小费用最大流问题的数学建模; 2. 掌握最大流问题的WinQSB 软件求解和Lingo 软件求解; 3. 掌握最小费用最大流问题问题的的WinQSB 软件求解和Lingo 软件求解。 二,实验原理 1、熟悉建立最大流问题的数学模型; 2、熟悉建立最小费用最大流问题的数学模型; 3、熟悉WinQSB 软件的基本操作。 4、熟悉Lingo 软件建模。 三,使用仪器,材料 WinQSB 软件 Lingo 软件 四,实验内容与步骤 求最大流: 五,实验过程原始记录(数据,图表,计算等) 用WinQSB 软件进行求解 S A B C D T (7,2) (10,10) (5,3) (7,7) (5,1) (8,4) (10,9) (5,3)

用Lingo 软件进行求解 建立数学模型 ()()()(),max max ,,min ,..0,0,,ij ij i j A ij ji j V j V i j A j i A ij ij e f f i S s t f f f i T i S T f c i j A ∈∈∈∈∈=??-=-=??≠?≤≤∈∑∑∑ model : sets :

nodes/S,A,B,C,D,T/; arcs(nodes,nodes)/ S,A S,B A,B,A,C B,C,B,D C,D,C,T D,T/:C,f; endsets data: C=7 10 5 7 5 8 7 10 5; enddata max=flow; @for(nodes(i)|i#ne#1#and#i#ne#@size(nodes): @sum(arcs(i,j):f(i,j))-@sum(arcs(j,i):f(j,i))=0); @sum(arcs(i,j)|i#eq#1:f(i,j))=flow; @sum(arcs(i,j)|j#eq#@size(nodes):f(i,j))=flow; @for(arcs:@bnd(0,f,C)); end Global optimal solution found. Objective value: 15.00000 Infeasibilities: 0.000000 Total solver iterations: 4 Variable Value Reduced Cost FLOW 15.00000 0.000000 C( S, A) 7.000000 0.000000 C( S, B) 10.00000 0.000000 C( A, B) 5.000000 0.000000 C( A, C) 7.000000 0.000000 C( B, C) 5.000000 0.000000 C( B, D) 8.000000 0.000000 C( C, D) 7.000000 0.000000 C( C, T) 10.00000 0.000000 C( D, T) 5.000000 0.000000 F( S, A) 7.000000 0.000000 F( S, B) 8.000000 0.000000 F( A, B) 0.000000 0.000000 F( A, C) 7.000000 0.000000 F( B, C) 3.000000 0.000000 F( B, D) 5.000000 0.000000 F( C, D) 0.000000 0.000000 F( C, T) 10.00000 -1.000000 F( D, T) 5.000000 -1.000000 S到T的最大流=15 六,实验结果分析或总结

运筹学实验报告

. 运筹学实验报告 专业: 班级: 姓名: 学号: 指导教师:

数学与应用数学专业 2015-12-18 实验目录 一、实验目的 (3) 二、实验要求 (3) 三、实验内容 (3) 1、线性规划 (3) 2、整数规划 (6) 3、非线性规划 (13) 4、动态规划 (115) 5、排队论 (19) 四、需用仪器设备 (26) 五、MATLAB优化工具箱使用方法简介 (26) 六、LINGO优化软件简介 (26) 七、实验总结 (27)

一、实验目的 1、会利用适当的方法建立相关实际问题的数学模型; 2、会用数学规划思想及方法解决实际问题; 3、会用排队论思想及方法解决实际问题; 4、会用决策论思想及方法解决实际问题; 5、掌握MATLAB、LINGO等数学软件的应用; 二、实验要求 1、七人一组每人至少完成一项实验内容; 2、每组上交一份实验报告; 3、每人进行1~2分钟实验演示; 4、实验成绩比例: 出勤:40% 课堂提问:20% 实验报告:30% 实验演示:10%。 三、实验内容 1、线性规划 例运筹学74页14题 Min z=-2x 1-x2 2x1+5x2≤60 x1+x2≤18 3x1+x2≤44 X2≤10 X1,x2≥0

用matlab运行后得到以下结果: the program is with the linear programming Please input the constraints number of the linear programming m=6 m = 6 Please input the variant number of the linear programming n=2 n = 2 Please input cost array of the objective function c(n)_T=[-2,-1]' c = -2 -1 Please input the coefficient matrix of the constraints A(m,n)=[2,5;1,1;3,1;0,1;-1,0;0,-1] A = 2 5 1 1 3 1 0 1 -1 0 0 -1 Please input the resource array of the program b(m)_T=[60,18,44,10,0,0]' b = 60

(完整版)运筹学实验报告

运筹学实验报告 班级:数电四班姓名:刘文搏学号: 一、实验目的 运用MATLAB程序设计语言完成单纯性算法求解线性规划问题。 二、实验内容 编写一个MATLAB的函数文件:linp.m用于求解标准形的线性规划问题: min f=c*x subject to :A*x=b ; x>=0; 1、函数基本调用形式:[x,minf,optmatrx,flag]=linp(A,b,c) 2、参数介绍: A:线性规划问题的约束A*x=b且x>=0中变量的系数组成的矩阵,是 一个m*n的矩阵。 c :线性规划问题的目标函数f=c*x中各变量的系数向量,是一个n 维的行 向量。 b :线性规划问题的约束A*x=b且x>=0中的常数向量,是一个m维的列 向量。 x :输出线性规划问题的最优解,当线性规划问题没有可行解或有可 行解无 最优解时x=[]. minf :输出线性规划问题的最优值,当线性规划问题没有可行解时 minf=[], 当线性规划问题有可行解无最优解时minf=-Inf。 flag :线性规划问题的求解结果标志值,当线性规划问题有最优解

时flag=1, 当线性规划问题有可行解无最优解时flag=0,当线性规划问题没有 可行解时flag=-1. cpt:输出最优解对应的单纯性表,当线性规划问题没有可行解或有 可 行解无最优解时cpt=[]. 三、Linp函数 %此函数是使用两阶段算法求解线性规划问题 function [x,minf,flag,cpt]=linp(A,b,c); for i=1:p %判断b是否<=0;将b转换成大于0; if b(i)<0 A(i,:)=-1*A(i,:); b(i)=-1*b(i); end end %返回值:x,第一张单纯形表,基,标志参数 A,c,b %********第一张单纯形表的初始化 [m,n]=size(A);%获得矩阵A的维数 [p,q]=size(b); dcxb=zeros(m+2,m+n+1);%确定第一张单纯形表的大小 dcxb(1,:)=[-c,zeros(1,m+1)];%?给表的第一行赋值 dcxb(2,:)=[zeros(1,n),-1*ones(1,m),0];%?给表的第二行赋值 dcxb([3:m+2],:)=[A,eye(m,m),b];%添A和b到表中

运筹学实验报告 林纯雪

运筹学报告 一、投资计划问题 某地区在今后3年内有4种投资机会,第一种是在3年内每年年初投资,年底可获利润20%,并可将本金收回。第二种是在第一年年初投资,第二年年底可获利50%,并可将本金收回,但该项投资金额不超过2百万元。第三种是在第二年年初投资,第三年年底收回本金,并获利60%,但该项投资金额不超过1.5百万元。第四种是在第三年年初投资,第三年年底收回本金,并可获利40%,但该项投资金额不超过1百万元。现在该地区准备了3百万元资金,如何制定投资方案,使到第三年年末本利的和最大? 解:设x1,x2,x3,x4依次表示从一种投资方案到第四种投资方案的投资额 程序如下: max=x1*1.2+x2*1.5+(x1+x3)*1.2+x4*1.6+(x1+x3+x5)*1.2+x6*1.4; x1+x2+x3+x4+x5+x5+x6=3; x2<2; x4<1.5; x6<1; end 求解结果: Global optimal solution found. Objective value: 10.80000 Total solver iterations: 0 Variable Value Reduced Cost X1 3.000000 0.000000 X2 0.000000 2.100000 X3 0.000000 1.200000 X4 0.000000 2.000000 X5 0.000000 6.000000 X6 0.000000 2.200000 Row Slack or Surplus Dual Price

1 10.80000 1.000000 2 0.000000 3.600000 3 2.000000 0.000000 4 1.500000 0.000000 5 1.000000 0.000000 二、配料问题 某冶炼厂计划炼制含甲、乙、丙、丁4种金属成分的合金1吨,4种金属的含量比例为:甲不少于23%,乙不多于15%,丙不多于4%,丁介于35%~65%之间,此外不允许有其他成分。该厂准备用6种不同等级的矿石熔炼这种合金,各种矿石中的杂质在熔炼中废弃。现将每种矿石中的4种金属含量和价格列表如下,试计算如何选配各种矿石才能使合金的原料成本达到最低。 金属含量和价格 解:设x1,x2,x3,x4,x5,x6依次表示矿石1到矿石6所需的用量 程序如下: min=23*x1+20*x2+18*x3+10*x4+27*x5+12*x6; 0.25*x1+0.4*x2+0.2*x3+0.2*x5+0.08*x6>0.23; 0.1*x1+0.1*x3+0.15*x4+0.2*x5+0.05*x6<0.15; 0.1*x1+0.05*x4+0.1*x6<0.04; 0.25*x1+0.3*x2+0.3*x3+0.2*x4+0.4*x5+0.17*x6>0.35; 0.25*x1+0.3*x2+0.3*x3+0.2*x4+0.4*x5+0.17*x6<0.65; 0.25*x1+0.4*x2+0.2*x3+0.2*x5+0.08*x6+0.1*x1+0.1*x3+0.15*x4+0.2*x5+0.05*x6+0. 1*x1+0.05*x4+0.1*x6+0.25*x1+0.3*x2+0.3*x3+0.2*x4+0.4*x5+0.17*x6=1; end

相关文档
最新文档