转载数学建模吧的一道题
mathcad吧
全部回复
仅看楼主
level 13
LNSZDZG 楼主
转载数学建模吧的一道题
https://tieba.baidu.com/p/3423333561
2014年11月27日 02点11分 1
level 13
LNSZDZG 楼主
2014年11月27日 02点11分 2
level 12
这是1stOpt教程里的一个例题,涉及到了运筹规划,是1stOpt的强项。原来我也想过用MC实现1stOpt的功能,至少实现一大部分——尽管软件的计算内核不同,1stOpt的计算完全是底层语言的操作,非常快,所有的算式都是机械代码直译,能够与之相提并论的计算软件恐怕只有Julia了;而MC是解释语言,会慢很多,但至少能证明MC是有能力解决运筹学问题的——可一直没时间细搞。用MC暴力解决某一个问题还可以,但若要系统的有效的解决这一类问题,周边散碎的小问题不少,很有搞头。
支撑程序往往就是比主线程序要多很多,而且也只有支撑程序能够得到重复利用,是搞建模的人的真正财富。
PTC论坛里Ochkov先生针对TSP问题给出过一系列卓越的MC解法,其他的例子我还没有在国外论坛上见过。
慢慢来,既然运筹规划是MC编程上的空白领域,咱们如果能弄出个系统解法来,咱们确实也就是掌握世界领先技术了。 :)
2014年11月27日 13点11分 3
level 12
这道题就是在考察下面的这个矩阵,列举出最少数的列的集合,这些列相加后的变量迭代积不等于0。
这道题如果用组合的方法给出所有列的组合,然后再进行判断,那么计算量就非常大了。
最方便的办法是直接观察,但这又与数学建模没什么关系了哈。如何编一个程序,可以模拟直接观察的过程,是比较巧妙解决这个问题的一个办法。
2014年12月03日 13点12分 4
可以把这个矩阵进行行相加,看哪一行的数最大,就次要考虑这一行(对应区域编号),后面怎么弄,想不到。朱老能把这个矩阵发给我吗?让我也玩玩
2014年12月04日 02点12分
level 12
这题用MC做确实很有意思,建模过程中每一步都可以探讨,有一种教电脑按照自己的意图的快感,至少没有像1stOpt那么枯燥了。
2014年12月03日 14点12分 5
level 6
我对这题挺感兴趣的
天天来这个贴吧看,学到不少东西,搞得我都不想学老师教的东西了。。
2014年12月03日 14点12分 6
level 12
欢呼,我觉得你先试着从LNS给的表格信息,通过编程,建立出这个矩阵,然后再说怎么往深了玩儿。这个矩阵不是手工输入的,而是通过编程做出来的,手工输入太麻烦了。你也试试看,这一段的思路比较基础,也没用到什么技巧。
昨晚我试了几个思路,问题可以解决,但和遍历计算相比,都会遗漏掉一些特殊情况。而且我不希望到了第二问非要用到minimize()函数,或者说非要重新编程不可。
思路总是比实际操作更重要。
2014年12月04日 03点12分 7
level 12
第一问怎么弄都可以实现,最简单的办法是列列相加,用while遍历,当发现第一个所有元素都不是0的向量时,跳出循环,返回引用的列序号即可。
第二问麻烦,因为可能要循环好几次才能找到成本最低的组合,关键是那个“好几次”不知道是多少次。我晚上试试看用成本矩阵代替这个01矩阵,说不定能有些进展。
2014年12月04日 03点12分 8
level 6
MC15不太会用……用惯了MP2.0了,搞了好久把这个矩阵搞出来了,不知道怎么把A这个矩阵导出到表格里……
下面的过程可以玩了,好开心
2014年12月04日 05点12分 9
感觉编程的时间都够我把这些数给输进去了……还是不太熟练啊……
2014年12月04日 05点12分
level 12
哈哈!做得好,欢呼!MP的表格是独立的插件,和矩阵的表示已经没有关系了好像。
嗯,继续进击哈!玩儿Mathcad就得这么抻练,总是在基础小应用上打转转是很难观赏到MC的堂奥的。
今晚我看漫画来着……还是等看你的进展吧。:)
不管成不成功,想到了什么,做了什么,就在这里回帖,没问题的。不要等到所有的都做好了,都做对了,再发表,在MC吧没这个必要,因为对于Mathcad建模来说,思路总是比实际操作更重要。你把自己的思路一点点的记录下来,哪怕是走错了走歪了,你也会看到很奇妙的风景的。这是解释语言的独特的魅力,是其他编译语言数学软件永远也不会有的美妙的魅力。
2014年12月04日 18点12分 10
level 6
实在想不出其他办法,想用矩阵+函数求解不过没有突破口,感觉用矩阵+函数翻过来倒过去最终还是和这种遍历法没有任何区别
我试了从6个变量到3个变量,发现到3个变量时无解(一直循环,可以看成是无解吧?也试了try函数,也是一直循环)
上面图片显示的只是其中一个解,至于如何显示全部解我就没办法了
2014年12月05日 14点12分 11
经检验这个1、7、10、14的情况是错误的哈。具体为什么等我仔细看看。。
2014年12月05日 16点12分
level 6
哈哈!经过一段时间的努力,遍历所有情况都出来了!
这样的话下一问就更好做了!
2014年12月05日 15点12分 12
level 6
OK,用遍历法把第一问解出来了,感觉这样做的确很省事又粗暴,不过这是学校的数学建模题,不是编程题,
这样做的话能拿奖吗??
第二题的话,如果沿用第一题的做法,先算出只留下4个店铺的经营费用最少的最优解,再遍历一下留下5个店铺的所有情况,解出5个店铺经营费用最少的最优解,比较一下,估计就不用算留下6个店铺的最优解了吧?
2014年12月05日 15点12分 13
level 13
LNSZDZG 楼主
不错,不错。很好!不过这样叙述起来比较费劲。我给出几个装逼的定义,可能会使叙述更好一些
定义1 设a是一个n维向量,若a的分量全部由1和0构成,即任意的i(1<=i<=n)都有ai=1或ai=0,则称向量a是0,1向量;
定义2 设a是一个0,1向量,向量的所有分量的和称为向量的容量;
——这样问题就转化为 求容量为n的0,1向量的 “和” 的问题——装逼了吧?下面定义0,1向量的和
定义3 设a,b是两个0,1向量,c是a与b的和是指
0 如果ai=0且bi=0
ci=
1 其他
好了,至此,问题转化为——在A中求几个0,1向量的和c,使得c的容量为n
这样的叙述可能会更加装逼啊!!!
2014年12月06日 02点12分 14
如果按你这种思路的话在mc里该用什么函数?或者大致是怎么样的编程方法?我对这个矩阵还不太熟悉,我想亲自实践一下。
2014年12月08日 14点12分
回复 欢呼欢 :你按“$”、“#”或者“ctrl+4”这几个运算符。
2014年12月08日 15点12分
level 12
欢呼的暴力破解挺好,在你这个过程的基础上再进行程序优化,条条大路通罗马。
把你的程序再修改修改,你能得到更多的关于MC编程的经验。在游泳中学会游泳哈。
我没再接着做这道题,呵呵,一个是赶活儿呢,一个是这两天还是在追漫画……[黑线]边试边玩儿,程序零零散散的,也没有加注释,所以就不贴出来了。
主要是我感觉又要用到递归了,尽管原来尝试过几次感觉自己还做得来,但心里的阴影总是挥之不去。
LNS的思路跟我的差不多,而且我也感到MC在进行向量的计算上,运算速度是很快的——貌似PTC论坛里原来总结过怎么算才快的经验。
希望“欢呼”能够坚持下去哈,好论坛是咱们的好网友们一块儿创造出来的——至少MC吧是这样的,吧主就会发广告或者开小差。
2014年12月07日 14点12分 15
level 12
这道题的计算量可能没有我一开始想得那么大,因为如果4个商店能够满足所有居民区的购买量,那么它的成本就肯定会比4+1个商店来的要少,这样可以通过排除法,先找到4个商店的组合,然后把这些组合排除掉,再找5个商店的组合,再排除掉,而这个组合数是有上限的,这就可以在有限的几次循环中把所有可能的组合都列举出来,然后比拼成本——还是暴力破解的思路哈。
如果用成本来给每个1来加权,计算量就会更小了。
2014年12月09日 13点12分 16
level 12
欢呼,我用穷举法得到了32个4元素组合。
还有根据题意,不管你的22个元素组合,还是我的32个元素组合,都是最优的方案,因为都是保留了4个直销店,而且都满足“使每一个“稳定顾客”至少还能够光顾一个他们经常光顾的直销店”这个条件。你这里用max()来确定最优解没有道理呀。
2014年12月09日 15点12分 17
你得出了32个??怎么和我的不一样? 我用max确定最优解是目的是为了让顾客能去的店的总和最大,也就是平均每个顾客的选择范围更大。
2014年12月10日 10点12分
level 12
把第一问解决了,32个满足项的,程序比@欢呼欢 的要复杂的多,看来要论智商,我可能是咱们MC吧里最笨的……
2014年12月09日 18点12分 18
等我把第二问解决了,我再给这个程序加注释吧。有些地方有些绕人,到时候我会解释的。
2014年12月09日 18点12分
回复 朱老剑客 :嗯,尽管程序行很多,而且进行了大面积的遍历,过程中出现了非常大的临时矩阵,但运行速度非常快,整个运算时间是0.145s,还算是让人满意哈。
2014年12月09日 18点12分
回复 朱老剑客 :说明PTC总结的MC列运算速度超级快的经验名不虚传!
2014年12月09日 18点12分
回复 朱老剑客 :说实话你这个编程我真的看不懂……[惊讶]好多函数没用过,真的学习了![真棒]
2014年12月10日 10点12分
level 12
再往后的计算量非常大,4个元素的组合是32个,5个元素的组合是549个,6个元素的组合是2809个,,7个元素的组合是6177个,8个元素的组合是6333个,9个元素的组合是3040个,10个元素的组合是588个,然后就没有了。
也就是说这道题中如果保留最多(而不是最少的)的直销店,且要“使每一个“稳定顾客”至少还能够光顾一个他们经常光顾的直销店”,需要保留10个,有588种方案。
以上各数相加,一共有19528种保留直销店的方案。
呵呵,这个算是彻底暴力解决这个问题了吧。
2014年12月10日 15点12分 19
嗯,我上面的程序有错误。欢呼欢算出来的是对的。
2014年12月10日 16点12分
level 12
我上面贴的程序里有错误:
一是出现了重复项,比如说0、1、2、3和0、2、1、3这两个我都算进去了,实际上组合是一样的,只是排列不同,所以添加了一个排除重复项的程序……显得更冗长了 :(
二是使用计算的过程值代替了初始的赋值,结果得到的是对过程值的判断,实际上在初始值上不一定满足给出的条件,造成了混乱,所以又在程序中调用初始值进行计算,显的更他妈冗长了!非常失败!
嗯,修改后的程序得到的结果比较靠谱:
4个元素组合共有22项
5个元素组合共有271项
6个元素组合共有992项
7个元素组合共有1635项
8个元素组合共有1424项
9个元素组合共有600项
10个元素组合共有90项
总共的计算量是5034项,也不小。
第二问的最优值在5个元素组合里,(1 4 6 13 15),此时成本为32.5万元。
因为程序编的非常失败,肯定可以简化,有很多很多程序是重复的,非常浪费。而且到后来的运算速度也降低了。
http://1000eb.com/10v7w
我觉得暴力破解尽管也能拿出答案,但肯定不是正解,所以我这次仍没有拿到用MC解决运筹学问题应有的办法,等有时间我得学习一些运筹学的基础知识。
2014年12月10日 18点12分 20
1 2 尾页