网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月20日漏签0天
mathcad吧 关注:5,366贴子:28,178
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 19回复贴,共1页
<<返回mathcad吧
>0< 加载中...

【思考题】四摞饼问题

  • 只看楼主
  • 收藏

  • 回复
  • 朱老剑客
  • 主顾
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
今天和同事聊数学建模的事儿,他提出了一个数模题(跟我们实际工作有些关系),可能是和组合有些关系(希望@月城公寓寓公 别挠头哈),我初步试了试,感觉这个题有点儿意思,简单的编程竟然做不到。
题面:(具体为什么要这么做,涉及专业知识,我就不解释了,总之,我在这里已经把这个实际问题抽象为一个数学问题了。)
有一个方箱,假设它的高是2m,上方开口,俯视图如下:

分成4个区,如“田”字形。现在向里面放“饼”,饼的直径与田字格中每个小格子的边长是相等的,也就是说上图中4个区域中,各能够放一摞饼。填充完毕后的俯视图如下:

每个饼的厚度不一样,最小约为20cm,最大约为40cm,而且在这个范围内不是正态分布的,可近似看成均匀分布的。
现在我们有一个大转盘,大转盘分批提供这些饼,每一批提供8个。这里分批的意思是:将8个完全放置于桶中后,转盘再提供8个新的饼。
限制条件:
  (1)使用饼以上图的方式填充箱子,填充完毕后,最高的一摞饼的高度不能超出箱子的上沿,也即不能大于2m。
  (2)因为在实际中你不知道下一次转盘会提供8个什么样的饼,所以在此程序中禁止使用一次生成24或32个饼之后,再统一进行排布计算。必须一次生成8个,填充完毕后,再生成8个!
如此填充完之后,到最上一层,各摞饼的高度肯定是不一样的,有的高一些,有的低一些。
问:如何编写一个程序,能够满足以上要求,并使填充后各摞饼之间的高差最小,即Max(饼层)-Min(饼层)的值最小。
提示:一次转盘提供的饼的数量请使用runif(8,0.2,0.4)生成,产生的随机数精确到mm,也就是0.001即可。
这道题最后需要给出的结果是这种形式的:

其中的0..7为转盘上的8个饼的序号,子矩阵中的每1列对应着题面中田字格的4个象限。这个向量的总行数(元素数)对应着在桶中摆放多少层,比如上面给出的这例子中,就是摆放了4层,每一层中的每个象限中分别摆放了2个饼。
当然,也可以出现以下的情况,也就一个象限中摆放1个厚饼,另有一个象限中摆放3个薄饼,那么就如下图的方法表示,矩阵中空白的地方使用NaN填充。

因为这道题我还没有找到最终解,也就是最灵活可靠的计算程序,所以有可能会分为几种情况考虑,不知道呢,如果各位感觉需要分为几种情况考虑的话,请把所有可能的情况的程序都给出来吧。
这题有些难度,各位做好心理准备。


  • 朱老剑客
  • 主顾
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我倒是想出了一个好法子,但不知道怎么证明它是最优的……


2025-08-20 13:40:33
广告
不感兴趣
开通SVIP免广告
  • 月城翁
  • 东家
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼


  • 月城翁
  • 东家
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
每次生成8个随机数,逆序排列。
四个小方格每次按各小方格的已有饼子的高度升序排列,把生成的饼子顺序放入每个放一个,共四个。然后依高度升序排列,再放入八个中的后四个。
如此循环,直到找到极限位置。
用虚数记住小方格的编号,无论如何排序,方格编号不会乱。


  • 朱老剑客
  • 主顾
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
嗯,您的思路真的挺巧妙的,等我把我的思路实现了之后,再说哈! :)


  • 月城翁
  • 东家
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
改正了逻辑判断的位置,增加了每次放饼子的尺寸。


  • 月城翁
  • 东家
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼



  • 月城翁
  • 东家
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼


2025-08-20 13:34:33
广告
不感兴趣
开通SVIP免广告
  • 月城翁
  • 东家
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼




  • 朱老剑客
  • 主顾
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
您的这种使用复数记录饼后和序号的方法非常实用!这个应该推广。谢谢您哈! :)


  • 朱老剑客
  • 主顾
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
@月城公寓寓公 ,您贴的最后的一个程序中的计算结果中ERRmax和Hmax分别代表什么呢?
如果ERRmax代表最大高差的话,0.225这个高差有点儿太大了吧?
我自己出的题,至少应该拿出自己的答案哈,所以我还是按照我的思路给了一个,没有使用月城的复数存储结构,还是用的传统的矩阵。
我先解释一下:
我的这个程序是半自动的,这样与实际工况比较相符,实际工况中,是一次给出8个饼,等在箱子里码放好了之后,再次给出8个饼,而不是一次给出随机的32个或者更多的饼。如果把round(runif(8,0.2,0.4),3)这个放进程序的循环里,这个从数学上说是没什么问题的,但是咱们这个是给一个工序做数学模型,需要能够使所得到的模型能够在实际中应用。而因为实际上是先有了8个饼,之后的饼到底如何并不知道,所以在测试程序的时候,只能使用半自动的方法。
我的思路如下:
我用的思路是第1次来饼,就先放在第一象限
多出来的放在第二象限,等等,一直到把四个
象限都填满,能填多少填多少。
这和把第1次来饼放在4个象限里,让它的高差尽量小,第2次、第3次等等都是如此计算,与此相比,只有一个好处,就是节省程序的计算量,而且避免了每一层都有高差,最后形成比较大的累积高差。
每次计算所有饼的总高,加上该象限中已有的层高,得到一个数Δ——Δ不一定会比H高,当所有的饼都是0.2m的时候,总高为1.6m。
计算Δ-H,就是总高与目标高之间多出来或者少了多少,计为δ。分为两种情况计算:
(1)当δ<0的时候,自然就是把所有的饼都放进去了。
(2)当δ>0的时候,对饼进行全组合的加和计算,得到一系列的饼高。当饼高≤δ的时候,码放完肯定高出H,所以只能取饼高>δ的部分,并且我们需要它尽量接近箱子的上沿,所以移走的饼高要在满足饼高>δ的前提下,尽量小。
我的程序如下:



嗯,在验算的过程中,还是发现有个bug,不过大概就是这样的吧。
希望MC吧里有更多的朋友来拿出自己的方法。


  • 朱老剑客
  • 主顾
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我的那个bug是这样的,当h=1.995的时候,本就一个饼也放不下了,那就不放呗,但是我没有告诉MC这一点,所以它bug了。
修改后的结果是:

当w为空时,返回(NaN)。


  • vv_0147
  • 老爷们儿
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
使用1stopt试用版的就 不用试了,这个必须要使用正版。


  • 朱老剑客
  • 主顾
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这本书是程先云先生验证1stOpt的作品集,里面确实有不少功能MC是做不到的,我觉得花两万块钱搞一个这个软件还是很值得的。
你说的这个题给我印象很深,我原来很想过用MC实现这个编程(这个程序用MC是可以实现的,只是运算量有些大)也是一直没有时间哈。
如果MC的用户也可以出这么一套作品集,MC的今天就不会这么糟糕了。可惜没有,国内国外都没有人做过这件事情。


2025-08-20 13:28:33
广告
不感兴趣
开通SVIP免广告
  • 朱老剑客
  • 主顾
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
嗯,这就是为什么我在上面说的:咱们MC吧要有个门槛儿了。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 19回复贴,共1页
<<返回mathcad吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示