最近学校建模,要上程序,硬着头皮用刚学的perl写出来了。大脑不好使,本来学的不好,好多东西又忘光了。边看书边写,花好多功夫实现了主要功能,同时对perl有了进一步学习。 程序写的很乱很乱,算是为了凑结果,为了赶时间就这样吧。希望再接再厉! 本次建模使用环境和工具有 : linux 、perl、dia、gnuplot 、word(最终排版)。 #!/usr/bin/perl #################################################################### # 本程序可依据依次输入设备参数对设备维修顺序进行二元排序从而求得总损失最小的维修次序解 # 使用方法:$perl comput.pl # 根据提示输入设备参数,输入“over“结束输入并返回结果 #################################################################### # 初始化参数,$i保存设备号,$n保存维修次数 $i=1; $n=1; # 参数输入,用数组哈希依次保存设备号、维修时间、单位损失。 # 参数对应如下: # $local[$i] <===> 第i次维修的设备 # $local[$i]->{"dev"} <===> 第i次维修设备的设备号 # $local[$i]->{"time"} <===> 第i次维修设备所需要的时间 # $local[$i]->{"cost"} <===> 第i次维修设备单位损失 INPUT:while (1) { printf "请输入第$i 台设备的的维修时间(小时)或输入\"OVER\"结束输入\ntime$i="; $local[$i]->{"dev"} = $i; chomp($local[$i]->{"time"} = <STDIN>); $local[$i]->{"time"} = lc($local[$i]->{"time"}); last INPUT if $local[$i]->{"time"} == "over"; printf "请输入第$i 台设备的损失(万元/小时)\ncost$i="; chomp($local[$i]->{"cost"} = <STDIN>); $i++; } printf "=" x 60; printf "\n输入结束,共输入 %d 台设备\n", $i-1; printf "\n是否显示输入详情?(y/n)\n"; chomp($ask = <STDIN>); $ask = lc($ask); if ($ask eq "y") { for ($s=1; $s<$i; $s++) { printf "第 $s 台设备维修所用时间为:%2.2f\n", $local[$s]->{"time"} ; printf "第 $s 台设备损失单价为:%2.2f(万元/小时)\n", $local[$s]->{"cost"} ; } } print "\n"; print "="x60; print "\n"; print "|--->排序步骤:\n"; for ($j=1; $j<$i+1; $j++) { for ($k = $i; $k>$j; $k--) { ################################################################################## #求任意两台设备顺序不同代价差 #公式为:decide = t[j] * c[j] + (t[j] + t[k]) * c[k] - t[k] * c[k] - (t[j] + t[k]) * c[j] ################################################################################## $decide = ($local[$j]->{"cost"}*$local[$j]->{"time"} + ($local[$j]->{"cost"}+$local[$k]->{"cost"})*$local[$k]->{"time"} - $local[$k]->{"time"}*$local[$k]->{"cost"} - ($local[$j]->{"cost"}+$local[$k]->{"cost"})*$local[$j]->{"time"}); if ($decide < 0) { printf "第 $n 步,将第 $j 台设备与第$k 台设备维修次序对调\n"; my $temp = $local[$j]; $local[$j] = $local[$k]; $local[$k] = $temp; $n++; } } } print "="x60; print "\n"; printf "{zh1}排序结果为:\n"; for ($j=0; $j<$i; $j++) { printf $local[$j]->{"dev"}; } printf "\n"; 程序运行效果如下: 另附建模流程图和数据分析图: |