wayne 发表于 2010-8-21 15:10:14

25# mathe

呵呵,太简洁了,比前面lingo代码强了不知多少倍!

wayne 发表于 2010-8-21 15:20:55

mathe的代码还可以继续省掉9行代码!#include <cstdio>
#include <algorithm>
using namespace std;
#define NUM(x1,x2,x3,x4,x5,x6) ((a)*100000+(a)*10000+(a)*1000+(a)*100+(a)*10+(a))
enum {C,L,O,V,E,R,U,S,I,T};
int a={0,1,2,3,4,5,6,7,8,9};
int main()
{
    do{
         int x=NUM(C,L,O,V,E,R);
         int y=NUM(C,R,O,C,U,S);
         int z=NUM(V,I,O,L,E,T);
         if(x+y==z){
            printf(" %d\n+%d\n-------\n %d\n",x,y,z);
         }
    }while(next_permutation(a,a+10));
    return 0;
}真没想到用C++ 总共不到20行,即可近乎完美的解决该题!

mathematica 发表于 2010-8-21 21:07:29

我刚刚安装了Microsoft Visual C++ V6.0 简体中文企业版,但是发现不能运行楼上的程序,好像是不能发现# #include 文件,不知道是怎么回事

mathematica 发表于 2010-8-21 21:22:12

好了,终于好了,不过c++和lingo的出发道路不同,一个使用穷举排列的办法,一个是使用整数规划的办法,要是c++使用整数规划的办法的话,那代码的长度肯定要远远超过lingo。

wayne 发表于 2010-8-22 10:40:07

34# mathematica

我想再次说一下,你的lingo代码只能找出一个解,不能找出所有的可能解

mathematica 发表于 2010-8-22 10:59:06

34# mathematica

我想再次说一下,你的lingo代码只能找出一个解,不能找出所有的可能解
wayne 发表于 2010-8-22 10:40 http://bbs.emath.ac.cn/images/common/back.gif
可以给出所有解的,只要你以第二个数字先为最大值为目标函数,然后再以最小值为目标函数,就可以确定第二个数字(在这题里面,应该是相等的)。然后再次基础上以类似的手段,可以求出所有的解,这就是我的思路。
有个软件叫做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

wayne 发表于 2010-8-22 11:37:37


可以给出所有解的,只要你以第二个数字先为最大值为目标函数,然后再以最小值为目标函数,就可以确定第二个数字(在这题里面,应该是相等的)。然后再次基础上以类似的手段,可以求出所有的解,这就是我的思路。
...
mathematica 发表于 2010-8-22 10:59 http://bbs.emath.ac.cn/images/common/back.gif
:) ,我不是说lingo永远都不能给出所有解,程序是灵活的,我们总可以多写点代码去实现嘛。
我是说lingo这个软件本身只关注目标函数的最优值,而忽视达到最优条件时未知参数的所有可能情况,据我的经验,好像只给出一组解的。

另外,你的代码没好像也没有实现给出所有可能的解这个功能。

wayne 发表于 2010-8-22 11:40:55

你的代码跟mathe的代码区别在 你是试图找出 是否存在这样的解,有就给出一个就可以了。
而mathe是找出所有的解。真费劲

wayne 发表于 2010-8-22 11:49:17

俺有一个主意,:)
你用你lingo 算算,把紫罗兰换(VIOLET)成”李先生“(SIRLEE),试试,把所有的解都给我们看吧

mathematica 发表于 2010-8-22 14:24:17

俺有一个主意,:)
你用你lingo 算算,把紫罗兰换(VIOLET)成”李先生“(SIRLEE),试试,把所有的解都给我们看吧
wayne 发表于 2010-8-22 11:49 http://bbs.emath.ac.cn/images/common/back.gifmodel:
sets:
lie/1..10/:shuzi;!行标题是10个数字,按行排放在表的上侧;
hang/C,L,O,V,E,R,U,S,I,T/:zimu;!列标题10个字母,按列排放在表的左侧;
links(hang,lie):bianliang;!形成100个变量;
endsets
data:
shuzi=1,2,3,4,5,6,7,8,9,0;
enddata
!表的每行变量的求和都是1,用来使得每个字母只被分到一个数字去;
@for(hang(i):@sum(lie(j):bianliang(i,j))=1);
!表的每列变量的求和都是1,用来保证使得每个数字只接收一个字母;
@for(lie(j):@sum(hang(i):bianliang(i,j))=1);
!每行字母所得到的数字;
@for(hang(i):@sum(lie(j):bianliang(i,j)*shuzi(j))=zimu(i));
!每个变量都是0/1变量;
@for(links(i,j):@bin(bianliang(i,j)));
!形成第一个数字;
num01=10^5*zimu(1)+10^4*zimu(2)+10^3*zimu(3)+100*zimu(4)+10*zimu(5)+zimu(6);
!形成第二个数字;
num02=10^5*zimu(1)+10^4*zimu(6)+10^3*zimu(3)+100*zimu(1)+10*zimu(7)+zimu(8);
!形成第三个数字;
num03=10^5*zimu(8)+10^4*zimu(9)+10^3*zimu(6)+100*zimu(2)+10*zimu(5)+zimu(5);
num01+num02-num03=0;
!num01>012;
min=num01;
end应用上面的代码求出最小的第一个整数解,
解是
                     Variable         Value      Reduced Cost
                        NUM01      158496.0            0.000000
                        NUM02      168103.0            0.000000
                        NUM03      326599.0            0.000000
页: 1 2 3 [4] 5 6 7
查看完整版本: 紫罗兰算式(数学代数方面的)