数学建模中的编程
就拿数学建模来说,建模的过程是要将一个实际的问题简化为一个可以用数据和很简短的语言能表示出来的问题,然后通过数学工具解决这个问题,比如说概率,微积分,等等。当然数学里面还有很多可以解决实际问题的算法,比如说线性规划、拟合、回归等等很多。因为实际问题的数据可能会比较复杂,按照某个算法用人脑一步步求解往往会很麻烦。
因此通过计算机编程可以编出来算法的程序,直接给数据,计算机就可以算出来。说白了就是人来建立模型,然后编程算法用计算机来计算模型中的答案,比如最优解。要想自己编程序需要对这个算法有足够深的认识。事实上很多算法前人都写好了C或C++的源程序,当然用matLab会更省事一些。
数学建模与编程关系:
1、数学建模更像是从现实世界到数学抽象的过程。要经历把现实问题理想化的步骤,其间必须要决定舍弃哪些影响甚微的多余因素,好简化问题;只有简化了问题才能提出模型。
2、编程更像是在抽象空间本身提出问题,解决问题。这么说来,编程问题反而更像“纯粹”的数学问题。因为程序世界本身就是基于0、1建立起来的抽象世界,编程更像是在抽象世界里,解决抽象问题。所以它一般不需要考虑对哪些因素作取舍。
3、在这二者分别发展的情况下,它们各自的触角越伸越广泛,相互的边界也是日渐模糊的。比如图像处理、图像识别等等,虽然是编程问题,但它距离现实已比“一步之遥”还要近了。或者从另一个角度说,像这种问题是数学建模和编程通力合作解决的。
数学建模中的C语言编程
这个问题的前提条件不明确,本人试着给出一种方法的描述,该回答基于下述假设:
1、n个工件是同时到达的;
2、任意工件可以任意机器上加工;
3、已知工件的加工时间;
基本思想:
采用短工作优先算法,从而使总加工时间最少。
该算法的详细说明可以参考任何一本《操作系统原理》
解法步骤:
1、将工件按加工时间排序,需要时间最少的排在最前;
2、设置一个M大小的数组U,表示各机器已用时间;
3、设置一个M大小的数组N,表示各机器加工当前工件还需要的时间;
4、设置一个M大小的数组R,表示各机器已运行的时间;
4、将数组U、R、N的各元素都置为0;
5、对工件数据中每个元素执行下述操作:
从数组N中找到值最小的元素x;
将数组N中每个元素的值减去元素x的值作为其新值;
将数组R中每个元素的值加上元素x的值为作其新值;
将元素x值设置为工件要求的加工时间;
修改数组U中的值:U[x]+=R[x]+N[x];
6、将数组U中各元素的值求和,得到的即为最短的总时间
祝你好运!
-------------------------------------------------------
程序用JAVA语言编写,并省略了排序操作,并假定机器数为3
publicstaticvoidmain(String[]arg)throwsexception
int[]W=newint[]{1,2,3,55,56,77,77,88,99,100};//工件需要的工作时间
int[]U=newint[]{0,0,0};//各机器加工的工件已用的总时间,含等待时间
int[]R=newint[]{0,0,0};//各机器已运行的时间
int[]N=newint[]{0,0,0};//各机器加工完当前工作需要的时间
for(inti=0;i
/**找到当前机器中最早可用的机器,用m表示机器的代号,x表示机器完成当前工作需要的时间*/
intm=0;
for(intj=1;j
intx=N[m];
//将数组N中每个元素的值减去元素x的值作为其新值;
//将数组R中每个元素的值加上元素x的值为作其新值;
for(intj=0;j
N[j]-=x;
R[j]+=x;
//将元素x(即机器m)值设置为工件要求的加工时间;
N[m]=W[i];
U[m]+=(R[m]+N[m]);
inttotal=0;
for(inti=0;i
System.out.println("总时间等于:"+total);