程序的效率和易读性的矛盾:从cplex编程中的经验

每个约束条件,单独用一个循环添加,不要在一个循环中添加多种约束

否则隔几天看不懂代码了

今天写的这个不错,过很久回来看也应该能看懂

IloNumVar t=solver.numVar(0,Double.MAX_VALUE);//t
        solver.addMinimize(solver.prod(1,t));
        solver.setOut(new FileOutputStream("cplexlog.txt"));
        
        /*(1) sum_j x_ij=1 for all i\ne 0
         *(2) for any k, and i\ne 0,  sum_j f_ijk=sum_j f_jik+[i=k]
         *(3)for any k\ne 0,  sum_j f_j0k=1
         *(4) f_ijk<=x_ij
         *(5)for any i\ne 0,  sum_jk f_ijk- e_i*t/(Rx+Tx)<=Rx/(Rx+Tx)
        */
        
        //constraint (1)
        for(int i=1;i<graph.size();i++) {
            IloLinearNumExpr ex=solver.linearNumExpr();
            DEdge e=graph.get(i).edge;
            while(e!=null) {
                ex.addTerm(1,x[e.num]);
                e=e.next;
            }
            solver.addEq(ex,1);
        }       
        //constraint (2)
        for(int k=1;k<graph.size();k++) {
            for(int i=1;i<graph.size();i++) {
                IloLinearNumExpr ex=solver.linearNumExpr();
                DEdge e=graph.get(i).edge;
                while(e!=null) {
                    ex.addTerm(1,f[e.num][k]);
                    e=e.next;
                }
                for(DEdge d:graph.get(i).inedges) {
                    ex.addTerm(-1,f[d.num][k]);
                }
                solver.addEq(ex,i==k?1:0);
            }
        }       
        
        //constraint (3)
        for(int k=1;k<graph.size();k++) {
            IloLinearNumExpr ex=solver.linearNumExpr();
            for(DEdge e:graph.get(0).inedges) {
                ex.addTerm(1,f[e.num][k]);
            }
            solver.addEq(ex,1);
        }
        
        //constraint (4)
        for(int i=1;i<graph.size();i++) {
            DEdge e=graph.get(i).edge;
            while(e!=null) {
                for(int k=1;k<graph.size();k++)
                    solver.addLe(f[e.num][k], x[e.num]);//
                e=e.next;
            }
        }
        
        //constraint (5)
        for(int i=1;i<graph.size();i++) {
            DEdge e=graph.get(i).edge;
            IloLinearNumExpr ex=solver.linearNumExpr();
            while(e!=null) {
                for(int k=1;k<graph.size();k++) {
                    ex.addTerm(1,f[e.num][k]);
                }
                e=e.next;
            }
            ex.addTerm(-1*graph.get(i).E/(DNode.Rx+DNode.Tx), t);
            solver.addLe(ex,DNode.Rx/(DNode.Rx+DNode.Tx));
        }   
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 传统企业的管理是管理者使用所有权派生出来的行政权来监督和控制劳动者及他们所做的事情,不能让劳动者心悦诚服。 西蒙继...
    德生笔记阅读 149评论 0 0
  • 一遇到感冒发烧就西药治疗,再不反省,中国的下一代就要废了! 导言 西方国家的医生,对抗菌素已经很讨厌了。日本政府规...
    健宜康整骨阅读 4,239评论 2 2
  • 最养生的走路法 1992年,世界卫生组织指出,走路是世界最佳运动之一,既简单易行,强身效果又好,不论男女老少,什么...
    双怡阅读 179评论 0 0
  • 诗之嫲阅读 264评论 0 0