欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    lingo解决线性规划问题的程序(经典)(37页).doc

    • 资源ID:34800957       资源大小:112.50KB        全文页数:37页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    lingo解决线性规划问题的程序(经典)(37页).doc

    -Lingo12软件培训教案Lingo主要用于求解线性规划,整数规划,非线性规划,V10以上版本可编程。例1 一个简单的线性规划问题!exam_1.lg4 源程序max = 2*x+3*y; st_1 x+y<350;st_2 x<100; 2*x+y<600; !决策变量黙认为非负; <相当于<=; 大小写不区分 当规划问题的规模很大时,需要定义数组(或称为矩阵),以及下标集(set)下面定义下标集和对应数组的三种方法,效果相同::r1 = r2 = r3, a = b = c.sets: r1/1.3/:a; r2 : b;r3 : c;link2(r1,r2): x;link3(r1,r2,r3): y;endsetsdata: ALPHA = 0.7; a=11 12 13 ; r2 = 1.3; b = 11 12 13; c = 11 12 13; enddata例2 运输问题计算6 个发点8 个收点的最小费用运输问题。产销单位运价如下表。 B1B2B3B4B5B6B7B8产量A16267425960A24953858255A35219743351A47673927143A52395726541A65522814352销量3537223241324338解: 设决策变量 = 第i个发点到第j个售点的运货量,i=1,2,m; j=1,2,n; 记为 =第i个发点到第j个售点的运输单价,i =1,2,m; j=1,2,n记 =第i个发点的产量, i=1,2,m; 记 =第j个售点的需求量, j=1,2,n. 其中,m = 6; n = 8.设目标函数为总成本,约束条件为(1)产量约束;(2)需求约束。于是形成如下规划问题:把上述程序翻译成LINGO语言,编制程序如下: !exam_2.lg4 源程序model: !6发点8收点运输问题;sets: rows/1.6/: s; !发点的产量限制; cols/1.8/: d; !售点的需求限制; links(rows,cols): c, x; !运输单价,决策运输量;endsets !-; data: s = 60,55,51,43,41,52; d = 35 37 22 32 41 32 43 38; c = 6 2 6 7 4 2 9 5 4 9 5 3 8 5 8 2 5 2 1 9 7 4 3 3 7 6 7 3 9 2 7 1 2 3 9 5 7 2 6 5 5 5 2 2 8 1 4 3; enddata!-;min = sum(links: c*x); !目标函数=运输总成本; for(rows(i): sum(cols(j): x(i,j)<=s(i) ); ! 产量约束;for(cols(j):sum(rows(i): x(i,j)=d(j) ); !需求约束;end例3 把上述程序进行改进,引进运行子模块和打印运算结果的语句:!exam_3.lg4 源程序model: !6发点8收点运输问题;sets: rows/1.6/: s; !发点的产量限制; cols/1.8/: d; !售点的需求限制; links(rows,cols): c, x; !运输单价,决策运输量;endsets!=;data: s = 60,55,51,43,41,52; d = 35 37 22 32 41 32 43 38; c = 6 2 6 7 4 2 9 5 4 9 5 3 8 5 8 2 5 2 1 9 7 4 3 3 7 6 7 3 9 2 7 1 2 3 9 5 7 2 6 5 5 5 2 2 8 1 4 3; enddata!=;submodel transfer:min = cost; ! 目标函数极小化;cost = sum(links: c*x); !目标函数:运输总成本; for(rows(i): sum(cols(j): x(i,j) < s(i) ); ! 产量约束;for(cols(j):sum(rows(i): x(i,j) > d(j) ); !需求约束;endsubmodel!=;calc: solve(transfer); !运行子模块(解线性规划); divert('transfer_out.txt');!向.txt文件按自定格式输出数据; write('最小运输成本=',cost,newline(1),'最优运输方案x='); for(rows(i): write(newline(1);writefor(cols(j): ' ',format(x(i,j),'3.0f') ) ); divert(); !关闭输出文件; endcalc end 打开transfer_out.txt文件,内容为:最小运输成本=664最优运输方案x= 0 19 0 0 41 0 0 0 1 0 0 32 0 0 0 0 0 11 0 0 0 0 40 0 0 0 0 0 0 5 0 38 34 7 0 0 0 0 0 0 0 0 22 0 0 27 3 0例4 data段的编写技巧(1):从txt文件中读取原始数据 !exam_3.lg4 源程序中的data也可以写为:data: s = file('transfer_data.txt'); d = file('transfer_data.txt'); c = file('transfer_data.txt'); enddata其中,transfer_data.txt的内容为:!transfer.lg4程序的数据;!产量约束s= ;60,55,51,43,41,52 !需求约束d= ;35 37 22 32 41 32 43 38 !运输单价c= ;6 2 6 7 4 2 9 5 4 9 5 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3 !注:字符是数据分割符,若无此符,视所有数据为一个数据块,只赋给一个变量;例5 lingo程序的的3种输入和3种输出方法;!exam_5.lg4的源程序;sets: rows/1.3/: ; cols/1.4/: ; link(rows,cols): a, b, mat1, mat2;endsetsdata: b = 1,2,3,45,6,7,89,10,11,12; !程序内输入;a = file('a.txt'); !外部txt文件输入; mat1 = ole('d:lingo12data.xls',mat1); !EXcel文件输入;enddatacalc: text('a_out.txt') = a; !列向量形式输出数据; for(link: mat2 = 2*mat1); ole('d:lingo12data.xls') = mat2 ;!把mat2输出到xls文件中的同名数据块; !向.txt文件按自定格式输出数据(参照前例);Endcalc例6 程序段中的循环和选择结构举例!exam_6.lg4的源程序;sets: rows/1.5/:; cols/1.3/:; links(rows,cols):d;endsetsdata: d=0 2 3 4 3 2 1 3 2 4 7 2 2 1 6;enddatacalc: i=1; while(i#le#5: a = d(i,1);b = d(i,2); c = d(i,3); ifc(a#eq#0: write('infeasible!',newline(1); else delta = b2-4*a*c; sqrt = sqrt(if(delta#ge#0, delta,-delta); ifc(delta#ge#0: write('x1=',(-b+sqrt)/2/a,' x2=',(-b-sqrt)/2/a,newline(1); else write('x1=',-b/2/a,'+',sqrt/2/a,'i', 'x2=',-b/2/a,'-',sqrt/2/a,'i',newline(1); ); ); i=i+1; );endcalc本程序中的循环结构也可以用for(rows(i): 程序体);进行计算。例7 指派问题 (n人n任务费用最小)B1B2B3B4B5B6A1626742A2495385A3521974A4767392A5239572A6552281解: 设决策变量=1或0, 表示第i个人是否完成第j项任务,i,j=1,2,n; 记 =第i个人完成第j项任务的费用,i,j =1,2,n; n = 6.设目标函数为总费用,约束条件为(1)每人只完成一项任务;(2)每项任务只由一人完成。于是形成如下规划问题:!exam_7.lg4的源程序;model: !6人6任务指派问题;sets: rows/1.6/: ; !6人6任务; links(rows,rows): c, x; !费用和决策变量;endsets !-; data: c = 6 2 6 7 4 2 4 9 5 3 8 5 5 2 1 9 7 4 7 6 7 3 9 2 2 3 9 5 7 2 5 5 2 2 8 1; enddata!=;submodel appointment:min = cost; ! 目标函数极小化;cost = sum(links: c*x); !目标函数:总费用; for(rows(i): sum(rows(j): x(i,j) = 1 ); !每人完成一项 ;for(rows(j):sum(rows(i): x(i,j)= 1 ); !每项由一人完成; for(links: bin(x); !0-1变量约束;endsubmodelsubmodel binVar:for(links: bin(x); !0-1变量约束;endsubmodel!=;calc: solve(appointment,binVar); !运行子模块(解线性规划); divert('appointment_out.txt');!向.txt文件按自定格式输出数据; write('最小指派费用=',cost,newline(1),'分配方案x='); for(rows(i): write(newline(1); writefor(rows(j): ' ',format(x(i,j),'3.0f') ) ); divert(); !关闭输出文件; endcalc end例8 多目标规划转化为单目标规划问题举例把上述运输问题稍加修改,考虑到运输量可以要取整数,就变成整数规划问题,而且运输问题除了成本最小一个目标以外,有时也要考虑各发点的运输量尽量均衡作为另一个目标。本程序处理的方法一是两目标加权平均,方法二是只选一个目标,另一个目标转化为约束,从而把多目标改为单目标。!exam_8.lg4 源程序;model: !6发点8收点运输问题;sets: rows/1.6/: s; !发点的产量限制; cols/1.8/: d; !售点的需求限制; links(rows,cols): c, x; !运输单价,决策运输量;endsets!=;data: s = 60,55,51,43,41,52; d = 35 37 22 32 41 32 43 38; c = 6 2 6 7 4 2 9 5 4 9 5 3 8 5 8 2 5 2 1 9 7 4 3 3 7 6 7 3 9 2 7 1 2 3 9 5 7 2 6 5 5 5 2 2 8 1 4 3; enddata!=;submodel obj_1:min = minCost; ! 目标函数极小化;minCost = sum(links: c*x); !目标函数:运输总成本; endsubmodelsubmodel obj_2:min = objValue; objValue = 0.4*obj1+0.6*obj2; ! 二目标加权平均;obj1 = sum(links: c*x); !目标函数1:运输总成本; obj2 = max1-min1; !目标函数2:发点运输量极差; for(links(i,j): sum(cols(j): x(i,j) < max1 ; sum(cols(j): x(i,j) > min1 ; );endsubmodelsubmodel obj_3:min = obj2; obj2 = max1-min1; !目标函数:发点运输量极差;for(links(i,j): sum(cols(j): x(i,j) < max1 ; sum(cols(j): x(i,j) > min1 ; ); cost1 = sum(links: c*x); !运输总成本; cost1 < 1.05*minCost; !运输总成本约束; endsubmodelsubmodel subject_to_1:for(rows(i): sum(cols(j): x(i,j) < s(i) ); ! 产量约束;for(cols(j):sum(rows(i): x(i,j) > d(j) ); !需求约束;endsubmodelsubmodel subject_to_2: for(links: gin(x); !整数约束;endsubmodel!=;calc:solve(obj_1, subject_to_1, subject_to_2); !运行子模块(解线性整数规划);divert('intModel_out.txt');write(newline(2),'整数规划的最小运输成本=',minCost,newline(1),'最优运输方案x=');for(rows(i): write(newline(1);writefor(cols(j): ' ', format(x(i,j), '3.0f') ) );divert(); pause(); solve(obj_2, subject_to_1, subject_to_2); !运行子模块(解线性整数规划); divert('intModel_out.txt', 'a');!向.txt文件追加输出数据; write(newline(2),'二目标加权平均最小值=',objValue,newline(1),'最优运输方案x=');for(rows(i): write(newline(1);writefor(cols(j): ' ', format(x(i,j), '3.0f') ) );divert(); pause(); solve(obj_3, subject_to_1, subject_to_2); !运行子模块(解线性整数规划); divert('intModel_out.txt', 'a');!向.txt文件追加输出数据; write(newline(2),'成本约束时极差最小值=',obj2,newline(1),'成本约束时运输量最平均方案x=');for(rows(i): write(newline(1);writefor(cols(j): ' ', format(x(i,j), '3.0f') ) );divert();endcalc end本例中的运输量均衡指标,可以用方差表示,但变成非线性规划问题,只能求出局部最优解,而线性规划的最优解是全局最优解。例9 杂例1model: !费波那契数列; !exam_9.lg4 源程序;sets: II/1.100/: Fi; !费波那契数列; endsets!=;submodel myProc: Fi(1) = 1; Fi(2) = 1;for(II(i)|(i#ge#3)#and#(i#le#n):Fi(i)=Fi(i-1)+Fi(i-2) );endsubmodel!=;calc: n = 10; solve(myProc); divert('Fibo_out.txt'); writefor(II(k)|k#le#n: 'Fi(',format(k, '2.0f'),')=', format(Fi(k), '3.0f'),newline(1) ); divert(); endcalc end例10 杂例2sets: II/1.3/:; links(II,II):a,x;endsetsdata: a = 1,2,3 2,1,4 3,2,2;enddatasubmodel fMin: !求函数的极值,极小值点; min = z2+4*z+3; free(z);endsubmodelsubmodel fzero: !解方程,求函数的零点; cos(y) = y; bnd(0,y,5);endsubmodelsubmodel get_invMat: !解矩阵方程,求逆阵; for(II(i): for(II(j): sum(II(k):a(i,k)*x(k,j) = if(i#eq#j,1,0); for(links:free(x);endsubmodelcalc:solve(fMin);solve(fzero);solve(get_invMat);endcalcLingo编程语言参考:LINGO 有9 种类型的函数: 1 基本运算符:包括算术运算符、逻辑运算符和关系运算符 2 数学函数:三角函数和常规的数学函数 3 金融函数:LINGO提供的两种金融函数 4 概率函数:LINGO提供了大量概率相关的函数 5 变量界定函数:这类函数用来定义变量的取值范围 6 集操作函数:这类函数为对集的操作提供帮助 7 集循环函数:遍历集的元素,执行一定的操作的函数 8 数据输入输出函数:允许模型和外部数据源相联系,进行数据输入输出 9 辅助函数:各种杂类函数1. 基本运算符 1.1 算术运算符 、 、 、 、1.2 逻辑运算符: #not# 否定该操作数的逻辑值,not是一个一元运算符 #eq# 若两个运算数相等,则为true;否则为flase #ne# 若两个运算符不相等,则为true;否则为flase #gt# 若左边的运算符严格大于右边的运算符,则为true;否则为flase #ge# 若左边的运算符大于或等于右边的运算符,则为true;否则为flase #lt# 若左边的运算符严格小于右边的运算符,则为true;否则为flase #le# 若左边的运算符小于或等于右边的运算符,则为true;否则为flase #and# 仅当两个参数都为true 时,结果为true;否则为flase #or# 仅当两个参数都为false 时,结果为false;否则为true 1.3 关系运算符 “=”、“<=”和“>=”, LINGO 中还能用“<”表示小于等于关系, 2.2 数学函数 三角函数 sin(x),sinh(x), asin(x), asinh(x),cos(x),cosh(x), acos(x), acosh(x), tan(x),tanh(x), atan(x), atanh(x), atan2(x)abs(x) 返回x 的绝对值 exp(x) 返回常数e 的x 次方 floor(x) 返回去掉小数部分后的整数 log(x) 返回x 的自然对数 log10(x) 返回x 的以10为底的对数 lgm(x) 返回x的gamma 函数的自然对数 mod(m,n) 返回用n整除m的余数.,如mod(5,3)返回2;pi() 返回圆周率pow(x,y) 返回x的y次幂sign(x) 如果x<0 返回-1;否则,返回1smax(x1,x2,xn) 返回x1,x2,xn 中的最大值 smin(x1,x2,xn) 返回x1,x2,xn 中的最小值 sqr(x) 返回x的平方.sqrt(x) 返回x的平方根.2. 3 金融函数 fpa(I,n) 返回如下情形的净现值:单位时段利率为I, 连续n个时段支付,每个时段支付单位费用。若每个时段支付x单位的费用,则净现值可用x乘以 fpa(I,n)算得。fpl(I,n) 返回如下情形的净现值:单位时段利率为I,第n 个时段支付单位费用。 2.4 概率函数norminv(p,mu,sigma) N(mu,sigma2)分布函数的反函数norminv(p,mu,sigma) N(0,1)分布函数的反函数pbn(p,n,x) 二项分布的累积分布函数。当n和(或)x不是整数时,用线性插值法进行计算。 pcx(n,x) 自由度为n的2分布的累积分布函数。 peb(a,x) 当到达负荷为a,服务系统有x个服务器且允许无穷排队时的Erlang 繁忙概率。 pel(a,x) 当到达负荷为a,服务系统有x个服务器且不允许排队时的Erlang 繁忙概率。 pfd(n,d,x) 自由度为n和d 的F 分布的累积分布函数。pfs(a,x,c) 当负荷上限为a,顾客数为c,平行服务器数量为x时,有限源的Poisson 服务系统的等待或返修顾客数的期望值。a是顾客数乘以平均服务时间,再除以平均返修时间。(或)x不是整数时,采用线性插值进行计算。 phg(pop,g,n,x) 超几何(Hypergeometric)分布的累积分布函数。pop表示产品总数,g是正品数。从所有产品中任意取出n(npop)件。pop,g,n和x都可以是非整数,这时采用线性插值进行计算。 ppl(a,x) Poisson 分布的线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z服从均值为a的Poisson 分布。 pps(a,x) 均值为a的Poisson 分布的累积分布函数。当x不是整数时,采用线性插值进行计算。psl(x) 单位正态线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z 服从标准正态分布。 psn(x) 标准正态分布的累积分布函数。 ptd(n,x) 自由度为n的t 分布的累积分布函数。 qrand(seed) 产生服从(0,1)区间的拟随机数。 rand(seed) 返回0 和1 间的伪随机数, 2.5 变量界定函数 变量界定函数实现对变量取值范围的附加限制,共4 种:bin(x) 限制x 为0 或1 bnd(L,x,U) 限制LxU free(x) 取消对变量x 的默认下界为0 的限制,即x 可以取任意实数 gin(x) 限制x 为整数 在默认情况下,LINGO 规定变量是非负的,也就是说下界为0, 上界为+。free 取消了默认的下界为0 的限制,使变量也可以取负值。bnd 用于设定一个变量的上下界,它也可以取消默认下界为0 的约束。 semic(L,x,U), 半连续约束。约束x或者取0或者取L,U内数据。2. 6 集操作函数 in(set_name,primitive_index_1 ,primitive_index_2,) 如果元素在指定集中,返回1;否则返回0。 index(set_name, primitive_set_element) 该函数返回在集set_name 中原始集成员primitive_set_element 的索引。如果set_name被忽略,那么LINGO 将返回与primitive_set_element 匹配的第一个原始集成员的索引。如果找不到,则产生一个错误。 wrap(index,limit) 该函数返回j=index-k*limit,其中k 是一个整数,取适当值保证j 落在区间1,limit 内。该函数相当于index 模limit 再加1 。该函数在循环、多阶段计划编制中特别有用。 size(set_name) 该函数返回集set_name 的成员个数。在模型中明确给出集大小时最好使用该函数。它的使用使模型更加数据中立,集大小改变时也更易维护。 2.7 集循环函数 集循环函数遍历整个集进行操作。其语法为 function(setname(set_index_list)|conditional_qualifier:expression_list); function 相应于下面罗列的五个集循环函数之一;setname 是要遍历的集;set_index_list 是集索引列表;conditional_qualifier 是用来限制集循环函数的范围,当集循环函数遍历集的每个成员时,LINGO 都要对conditional_qualifier进行评价,若结果为真, 则对该成员执行function操作,否则跳过,继续执行下一次循环。expression_list 是被应用到每个集成员的表达式列表,当用的是for函数时,expression_list 可以包含多个表达式,其间用逗号隔开。这些表达式将被作为约束加到模型中。当使用其余的三个集循环函数时,expression_list 只能有一个表达式。如果省略set_index_lis t,那么在expression_list 中引用的所有属性的类型都是setname 集。for 该函数用来产生对集成员的约束。基于建模语言的标量需要显式输入每个约束,不过for 函数允许只输入一个约束,然后LINGO 自动产生每个集成员的约束。 sum 该函数返回遍历指定的集成员的一个表达式的和。 prod 该函数返回遍历指定的集成员的一个表达式的积。 min 和max 返回指定的集成员的一个表达式的最小值或最大值。 2.8 输入和输出函数 file 函数 该函数用从外部文件中输入数据,可以放在模型中任何地方。该函数的语法格式为file(filename)。这里filename 是文件名,可以采用相对路径和绝对路径两种表示方式。file 函数对同一文件的两种表示方式的处理和对两个不同的文件处理是一样的,这一点必须注意。 text 函数 该函数被用在数据部分用来把解输出至文本文件中。它可以输出集成员和集属性值。其语法为 text(filename) 这里filename 是文件名,可以采用相对路径和绝对路径两种表示方式。如果忽略filename,那么数据就被输出到标准输出设备(大多数情形都是屏幕)。text函数仅能出现在模型数据部分的一条语句的左边,右边是集名(用来输出该集的所有成员名)或集属性名(用来输出该集属性的值)。 ole 函数 OLE 是从EXCEL 中引入或输出数据的接口函数,它是基于传输的OLE 技术。OLE 传输直接在内存中传输数据,并不借助于中间文件。当使用OLE时,LINGO 先装载EXCEL, 再通知EXCEL 装载指定的电子数据表,最后从电子数据表中获得Ranges。为了使用OLE 函数, 必须有EXCEL5 及其以上版本。OLE函数可在数据部分和初始部分引入数据。 OLE 可以同时读集成员和集属性,集成员最好用文本格式,集属性最好用数值格式。原始集每个集成员需要一个单元(cell),而对于n元的派生集每个集成员需要n个单元,这里第一行的n个单元对应派生集的第一个集成员,第二行的n个单元对应派生集的第二个集成员,依此类推。 OLE 只能读一维或二维的Ranges( 在单个的EXCEL 工作表(sheet)中),但不能读间断的或三维的Ranges。Ranges是自左而右、自上而下来读。ranged(variable_or_row_name) 为了保持最优基不变,变量的费用系数或约束行的右端项允许减少的量。 rangeu(variable_or_row_name) 为了保持最优基不变,变量的费用系数或约束行的右端项允许增加的量。 status() dual(variable_or_row_na me)返回变量的判别数(检验数)或约束行的对偶(影子)价格(dual prices)。 2.9 辅助函数 if(logical_condition,true_result,false_result)if 函数将评价一个逻辑表达式logical_condit ion,如果为真,返回true_ result,否则返回false_result。warn(text,logical_condition) 如果逻辑条件logical_condition 为真,则产生一个内容为text的信息框。3. 敏感性分析(略)第 37 页-

    注意事项

    本文(lingo解决线性规划问题的程序(经典)(37页).doc)为本站会员(1595****071)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开