Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

[5分]求解一个数等于一组数中的几个数的和?

zch  发表于:2012-07-13 20:21:29  
复制

有一组数。

任意给出一个数,求该数能否是数组中几个数的和。是的话给出答案,如果有几个的话只要一个就行。

 

Top
dbaseIIIer 发表于:2012-08-14 15:10:22

原来是生产!(我还以为是用颗粒extrusion moulding 出来的。)

 

那么,

1. 是否找不到99% 的话,就要拿新的一条来切了?是的话,也让计算快了很多的了!

2. 是否先使用 短的原材料? 越短越优先? 要不要这个优先级? 不理会优先级 就 第3个问题就不用回答了。

3. 当一条长的原材料的损耗 低于  4条短的原材料, 你选 低耗损的方案?还是 先用掉短的方案?

 

不用后备方案的话,那就用你的算法 多算到100个需求就好了!

反正最多也就是多开一条新的原材料! 所有切的都是很省料的,使用率都是99%以上的!



煮江品茶 发表于:2012-08-14 15:10:38
dbaseIIIer 发表于:2012-08-14 15:28:28

品茶兄,那你就配置一下,弄个给大家看看哦!

 

要求不多,先弄个 50个需求数, 供应数字就算他30个吧,算一算给他看!

 

让他看看 Access 的厉害!



dbaseIIIer 发表于:2012-08-17 17:54:14

品茶兄,弄好没有,用怎样的一个数据模型?

 

30 x 50个 数据时候速度如何?

 

送佛送到西吧!不然给个 Access 人家可以自己解决的了!



煮江品茶 发表于:2012-08-18 10:18:35
可以按照损耗率<1%,单根损耗<100m,剩余长度大于1000米的余料做库存管理,这三个规则,然后按照成品10个一组求分组的优化选料方案。

zch 发表于:2012-08-18 12:59:27

谢谢各位。

先回答版主的:根据损耗最小的原则,

1,找不到99的就换新的。当然这个99可以自行定义

2,当然短的优先(这样才能减少库存)。

3,只要匹配到规定的损耗就可以了(这样可以节省时间吧?),就算1根长的比4根短的利用率要高,如果都在规定值内,就都可以。这时根据算法来决定哪个先就取哪个了。

 

对于品茶兄的思路我也考虑过:当成品量大的时候要分组计算,先分若干组(就以10个一组),每组计算后,再统计没有匹配的,如果还超过10个,就继续分成若干组重新计算,到最后没有匹配的少于10个后再计算一次结束。当然如果没有匹配的总是大于10个也要有出口结束。这里要考虑的是分组时的取数问题(到底是10个一组好,还是15个一组好)

 

 



煮江品茶 发表于:2012-08-18 20:06:57

多少个一组与运算效率和精度有关,可经过测试找到一个平衡点即可。一会给你写一个例子参考吧。



煮江品茶 发表于:2012-08-19 09:44:09
zch 发表于:2012-08-20 11:56:38

思路很好,我测试了一下,计算以后原材料的长度会自动改变的,品茶兄再看看



dbaseIIIer 发表于:2012-08-20 12:16:58

我意见是: 

 

第一、10条是没有实在多大用处的,人脑是没有那个能力把20条相约长度怎么分2批计算会得出比较好的方案的; 

 

第二、计算时间也看材料是否值得的,如果跟你原始程序60个变量能15分钟算出用户一天的需求,对用家来说应该也算值得的; 

 

第三、你是根据用家提出要求做程序的人,没有替人想到他会遇到更多的问题的,譬如说一条长的与2条短的损耗差多少选长或者选短的?或者 1条长的能满足4个需求,但是其实其中有两个需求是可以用另外比较短的来满足,那么剩余的余料是一样的情况,应该选2短+半条长的,所以结果一定是多个方案再根据当前情况选择的; 

 

第四、因为你还是听着用户的需求,要使用率99%的!表面上像简化了问题,但事实上很大的机会是用家的错误观点。没有99%就开新料,有多对?     

 

 

最后还是谢谢品茶兄几天就弄个免费的做个雏形版本出来的!。。。

 

一星期前,我做了4个晚上了,就只能4.32秒为30需求30供应的数据模型生成了12万多个不同但有效组合出来(象棋树杈评估方式),优化2次了,还是余数一样的方案特多,应该要优化再省略掉多一点已知道的结果才能面世。虽然结果都可以按照不同损耗率、损耗量、先短后长排序的,我的还是觉得有点笨。



煮江品茶 发表于:2012-08-20 14:56:49
zchdbaseIIIer两同志:

  dbaseIIIer同志没有仔细研究我的示例,所以提出的问题有些无的放矢。dbaseIIIer同志所提出的问题都是这个运用实例中最简单,最容易想到的问题,这些问题当然已经在本示例中良好的解决了,而且这种解决是综合性的平衡了各种优选目标。

  zch同志关于出现一部分原材料长度发生变化的情况,正是本示例的处理问题的一个巧妙之处。其道理在于只通过极为少量的计算得到一些成品组合,这些组合在库存材料中能找到小于额定损耗率和额定损耗额的匹配关系。那么这些组合中的成品和匹配的材料就首先选中,我将这一过程命名为:初选。

  初选过后,会存在没有找到匹配关系的成品,这些成品我们不再进一步做组合的匹配运算,而是简单的找到剩余各成品其长度加上一定的值(这个值为确保余料可用,同时考虑当前库存中的长度分布)后,所对应的最短材料。这样一来,就可以在材料开料后,余料收回继续在以后使用,而在本次开料中将其损耗视为0。于是材料的编号和长度需要拆分,也就是将一个材料拆分为两个材料,本次使用的是原编号,长度计算为对应成品的长度;余料编号为原编号尾缀一个(1),余料长度计算为原长度减去对应成品的长度。我将这一过程命名为:终选。

  为什么要采用这样一种方法,这样一种方法是否能得到需要的合理开料方案?这种方法在哪些环节上还有其他处理方法?不同的处理方法在效率与精度上是什么关系?以及这样一种方法的利弊是什么?关于这些问题留给你们两位同志继续思考,相信从思考中你们能得到有益的东西。



zch 发表于:2012-08-21 10:54:06

谢谢品茶兄的解答。对于没有匹配的成品,我的设想是取最长的一根原材料把没有匹配的都在这里切完。你的方法也行更巧妙。我觉得也各有利弊。看来软件技术在生产过程中的应用,没有最好,只有更好。怎么样将所学知识应用到生产过程当中去,怎么样集思广益,需要我辈更加努力。

 

再次谢谢两位的解答



煮江品茶 发表于:2012-08-21 19:17:30
示例有更新,可重新下载。

dbaseIIIer 发表于:2012-08-22 00:38:32

如果用户在计算前指定了 99% 75M 为额定合格损耗, 1000M作为余料最小长度 的话,

 

1. 显然在你的初选就筛掉了,99%以下,或者75M以上的损耗了;

 

2. 满足一个额定长度就不作为损耗,而是作为余料,损耗为0,也是非常正确的做法!

 

值得赞赏的!

 

当然你是在用户的要求下绝对没有错误,也符合用户提出“最优”开料原则的!

 

 

而我在 http://www.accessoft.com/article-show.asp?id=7367 中的论调,就是说明只有一个答案是不够人性化的设计而已!

 

用户也许不知道 98.8 就可以多利用多几根短小的原材料;

也许也不知道995M作为余料的话,也可以满足另外一个目标更接近呢;

 

我只是建议 煮茶兄考虑多答案的展示,让用户可以不是“死”跟着规则走,是活活的从多目标里选方案出来,

既然你有一套超级高速的算法的话,多点意见给用户不是更好么?

 

用户可以看到 99%以下, 75M以上 和 1000M以下,的各5个方案就好了!



zch 发表于:2012-08-22 09:44:32

   看了dbaseIIIer的文章,我也觉得让用户参与过多的决策不是一个好的选择。编程的目的是什么:就是减轻用户的工作,避免过程失误。中间环节越多,结果就越不可控。我觉得一个好的程序就是要让用户一键搞定。不然你换了一个用户怎么办,又要无休止的培训。这也是现在一些专业软件的弊病,没几个月的培训就做不下来。

   对于煮江品茶 的解题思路我觉得比较有意思,在一开始提出尽量多的参数,让用户开始应用的时候可以调试,尽量做出让各方面都满意的结果,然后固化下来,在应用的时候就一键搞定了。

   对于软件来说,我认为界面就是越简单越好,用户单击次数越少越好,就象工业化生产一样,机械的点击就能完成工作。复杂操作不是一个好的程序的标准。一个好的软件来就应该是简单给别人,麻烦留给自己。



煮江品茶 发表于:2012-08-22 11:50:05
zch、dbaseIIIer两同志:

  就此问题还需要与二位进一步交流一下。这次交流我主要想谈两个方面的内容,其一叫做前提与结果,其二叫做策略选择。

一、关于前提与结果的讨论

  什么是前提?前提是我们解决问题前的假设或者公理。任何学科都建立在一种假设的前提之下,任何问题也都有建立在假设和前提之下。没有假设和前提学科本身就不能成立,问题本身就不成立。就此问题来看,也是有假设和前提的,只是假设和前提有些是显性的有些是隐形的,有些是定量的有些是定性的。那么这个开料问题到底有哪些前提和假设呢?我想可以这样归纳一下:

  1、额定损耗率、额定损耗额和可回收余料的长度在每次开料前是确定的,这种确定是基于需求方(施工委托方或者公司内部的技术部门等)的要求。只是不同批次的开料,这组数据可能会不一样。特别注意,不同批次的开料时要求的数据不一样,并不等同于当次开料的参数不确定,这是两个完全不同的概念。由此确立了一个前提,那就是额定损耗率、额定损耗额和可回收余料的长度每次开料计算前具有确定性。

  2、仓库管理人员偏好多发出短料,以减少保管的根数;施工人员偏好多领用长料,以降低消耗和减少开料次数。但开料的计算一般由仓库管理人员进行,因此在领发过程中,仓库管理人员决策权较大。因此也就确立了开料方案以尽量满足仓库管理人员的偏好为前提。

  3、光缆的使用上具有不可熔接和一次开料不导致剩余材料报废的特性,以及较长周期内所有施工方案中存在统计学意义上的最短截取长度。因此存在递延损耗的前提,也即可将能利用的余料不视为损耗,而递延到最后一次开料小于最短截取长度时再计算损耗。

  4、材料长度和成品长度的均不定长,不符合线性规划或其他已知规划求解的模型要求。因此确立了需要建立新的计算模型才能进行优化求解的前提。

  什么是结果?结果是在一定的前提下,通过一种计算模型得到的解或者解集。对于复杂的问题,结果是分阶段得到的。得到分阶段的结果,需要用到不同的前提和假设,需要输入不同的参数。从一个阶段到另为一个阶段,需要根据前提和假设采取不同的策略,使得最小的输入得到最需要的结果。

二、关于策略选择的问题

 什么是策略?策略是一种规则,一种确定的方法。多数管理问题在不同阶段都会存在多种可选的策略和可选的方法。这样说有些抽象,我们来看实例中两个最重要运算阶段的策略问题。第一个阶段是形成组合方案的阶段;第二个阶段是可选开料组合的进一步优化阶段。

  第一个阶段存在两种策略。第一是按照所有成品来计算组合;第二种是按照一定的分组标准来计算分组后的组合;第一种策略能精确的得到全部的组合结果,并由此得到所有的开料方案,但当成品数量较大时,组合结果集巨大到不可计算;第二种策略不能得到所有的组合结果,但计算量可控制在允许的范围内。那么第一种计算的策略一定是不可行的。问题只在于判断第二种计算策略是否在获取需要的数据上是否成立。结论是成立的,判断的过程已经阐述过,在此不赘述。我们观察到这个阶段只存在两种策略,而且是非此即彼的互斥关系,在两种策略中选择并不困难。问题是这是普遍面临的策略选择情形吗?答案是否定的。否定的原因我们来看第二中策略的问题。

  第一个阶段结束后,我们能得到数量庞大的开料组合,这些组合中一定存在更优的选择。那么选择的标准或者说规则或者说方法,就是一种策略。把庞大的开料组合的选择看成是遵循策略的选择,与直接在这些组合中凭肉眼的选择完全不同。这种不同不仅表现为选择数量上的巨大差异,而且表现为思维逻辑上的巨大差异。就实例来讲,实际只存在15种不同的选择策略,其中三种基本策略(损耗率最小、损耗额最小和消耗库存根数最多),并有此三种基本策略组合出12种复合策略。是不是这15种策略都有意义和价值呢?当然不是!我们可以前提和假设,以及策略之间形成结果的差异性作出判断。实际上只有两种策略是有价值的,其一是消耗库存根数最多前提下损耗率最小;其二是消耗库存根数最多前提下损耗额最小。由此以来,我们既不必在所有记录中凭肉眼去选择成百上千条记录,也不必在15种优选方案前茫然不知所措。而只需按照偏好做二选一的判断。更有甚者,可以忽略两种选择之间的差异,而确定下一种策略,从而剥夺用户的选择权利,让他们留出时间来吸烟喝茶好了。

  上述的分析,就不难看出dbaseIIIer同志在阐述问题的时候,是没有分清楚什么是前提什么是结果,什么是输入什么是输出了。也没有搞明白该怎么样向用户呈现数据,以及如何将用户的判断与程序人员的判断区分开来。将胡子眉毛抓在了一起,也就造成了剪不断理还乱状况。呵呵。

  

  



总记录:36篇  页次:2/2 9 7 1 2 :