找回密码
 欢迎注册
楼主: mathematica

[提问] 紫罗兰算式(数学代数方面的)

[复制链接]
发表于 2010-8-21 15:10:14 | 显示全部楼层
25# mathe

呵呵,太简洁了,比前面lingo代码强了不知多少倍!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-8-21 15:20:55 | 显示全部楼层
mathe的代码还可以继续省掉9行代码!
  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;
  4. #define NUM(x1,x2,x3,x4,x5,x6) ((a[x1])*100000+(a[x2])*10000+(a[x3])*1000+(a[x4])*100+(a[x5])*10+(a[x6]))
  5. enum {C,L,O,V,E,R,U,S,I,T};
  6. int a[10]={0,1,2,3,4,5,6,7,8,9};
  7. int main()
  8. {
  9.     do{
  10.          int x=NUM(C,L,O,V,E,R);
  11.          int y=NUM(C,R,O,C,U,S);
  12.          int z=NUM(V,I,O,L,E,T);
  13.          if(x+y==z){
  14.             printf(" %d\n+%d\n-------\n %d\n",x,y,z);
  15.          }
  16.     }while(next_permutation(a,a+10));
  17.     return 0;
  18. }
复制代码
真没想到用C++ 总共不到20行,即可近乎完美的解决该题!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-21 21:07:29 | 显示全部楼层
我刚刚安装了Microsoft Visual C++ V6.0 简体中文企业版,但是发现不能运行楼上的程序,好像是不能发现# #include 文件,不知道是怎么回事
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-21 21:22:12 | 显示全部楼层
好了,终于好了,不过c++和lingo的出发道路不同,一个使用穷举排列的办法,一个是使用整数规划的办法,要是c++使用整数规划的办法的话,那代码的长度肯定要远远超过lingo。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-8-22 10:40:07 | 显示全部楼层
34# mathematica

我想再次说一下,你的lingo代码只能找出一个解,不能找出所有的可能解
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-22 10:59:06 | 显示全部楼层
34# mathematica

我想再次说一下,你的lingo代码只能找出一个解,不能找出所有的可能解
wayne 发表于 2010-8-22 10:40

可以给出所有解的,只要你以第二个数字先为最大值为目标函数,然后再以最小值为目标函数,就可以确定第二个数字(在这题里面,应该是相等的)。然后再次基础上以类似的手段,可以求出所有的解,这就是我的思路。
有个软件叫做Risk Solver Platform for Excel 10.0,它是以excel为基础的最优化求解软件,求解速度比lingo11.0要快,只要10秒左右,由于我没有lingo12.0的破解版,所以不知道Risk Solver Platform for Excel 10.0是否比lingo12.0快。没注册的lingo软件只提供小规模的最优化求解,目的是为了看下你对这个软件是否满意,其实lingo软件是很优秀的,我最近在研究这个软件,很有这样的感觉,在最优化方面,非lingo莫属。至于Risk Solver Platform for Excel也是很优秀的,但是我更喜欢lingo
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-8-22 11:37:37 | 显示全部楼层
可以给出所有解的,只要你以第二个数字先为最大值为目标函数,然后再以最小值为目标函数,就可以确定第二个数字(在这题里面,应该是相等的)。然后再次基础上以类似的手段,可以求出所有的解,这就是我的思路。
...
mathematica 发表于 2010-8-22 10:59

,我不是说lingo永远都不能给出所有解,程序是灵活的,我们总可以多写点代码去实现嘛。
我是说lingo这个软件本身只关注目标函数的最优值,而忽视达到最优条件时未知参数的所有可能情况,据我的经验,好像只给出一组解的。

另外,你的代码没好像也没有实现给出  所有可能的解这个功能。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-8-22 11:40:55 | 显示全部楼层
你的代码跟mathe的代码区别在 你是试图找出 是否存在这样的解,有就给出一个就可以了。
而mathe是找出所有的解。真费劲
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-8-22 11:49:17 | 显示全部楼层
俺有一个主意,
你用你lingo 算算,把紫罗兰换(VIOLET)成”李先生“(SIRLEE),试试,把所有的解都给我们看吧
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-22 14:24:17 | 显示全部楼层
俺有一个主意,
你用你lingo 算算,把紫罗兰换(VIOLET)成”李先生“(SIRLEE),试试,把所有的解都给我们看吧
wayne 发表于 2010-8-22 11:49
  1. model:
  2. sets:
  3. lie/1..10/:shuzi;!行标题是10个数字,按行排放在表的上侧;
  4. hang/C,L,O,V,E,R,U,S,I,T/:zimu;!列标题10个字母,按列排放在表的左侧;
  5. links(hang,lie):bianliang;!形成100个变量;
  6. endsets
  7. data:
  8. shuzi=1,2,3,4,5,6,7,8,9,0;
  9. enddata
  10. !表的每行变量的求和都是1,用来使得每个字母只被分到一个数字去;
  11. @for(hang(i):@sum(lie(j):bianliang(i,j))=1);
  12. !表的每列变量的求和都是1,用来保证使得每个数字只接收一个字母;
  13. @for(lie(j):@sum(hang(i):bianliang(i,j))=1);
  14. !每行字母所得到的数字;
  15. @for(hang(i):@sum(lie(j):bianliang(i,j)*shuzi(j))=zimu(i));
  16. !每个变量都是0/1变量;
  17. @for(links(i,j):@bin(bianliang(i,j)));
  18. !形成第一个数字;
  19. num01=10^5*zimu(1)+10^4*zimu(2)+10^3*zimu(3)+100*zimu(4)+10*zimu(5)+zimu(6);
  20. !形成第二个数字;
  21. num02=10^5*zimu(1)+10^4*zimu(6)+10^3*zimu(3)+100*zimu(1)+10*zimu(7)+zimu(8);
  22. !形成第三个数字;
  23. num03=10^5*zimu(8)+10^4*zimu(9)+10^3*zimu(6)+100*zimu(2)+10*zimu(5)+zimu(5);
  24. num01+num02-num03=0;
  25. !num01>012;
  26. min=num01;
  27. end
复制代码
应用上面的代码求出最小的第一个整数解,
解是
                       Variable           Value        Reduced Cost
                          NUM01        158496.0            0.000000
                          NUM02        168103.0            0.000000
                          NUM03        326599.0            0.000000
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-19 14:34 , Processed in 0.050359 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表