数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 2202|回复: 8

本人做的网络单纯型类

[复制链接]
发表于 2004-7-5 23:16:07 | 显示全部楼层 |阅读模式
<>/*
  Name: NetWorkSimplex.h
  Copyright: Knight-Studio
  Author: Ran NI
  Date: 05-07-04 15:19
  Description: The Declaration of the NetWorkSimplex Class
*/</P>
<>#include &lt;vector&gt;
#include &lt;fstream&gt;
#include &lt;math.h&gt;
#include &lt;complex&gt;
#ifndef _NETWORKSIMPLEX_H_
#define _NETWORKSIMPLEX_H_</P>
<>using namespace std;</P>
<P>class NetWorkSimplex
{
  public:
    NetWorkSimplex(vector&lt;double&gt; aa,vector&lt;double&gt; bb,vector&lt;vector&lt;bool&gt; &gt; bbb,vector&lt;vector&lt;double&gt; &gt; cc,vector&lt;vector&lt;double&gt; &gt; uu,vector&lt;vector&lt;double&gt; &gt; ll):a(aa),b(bb),C(cc),U(uu),L(ll),B(bbb),Potential(aa.size()+bb.size()+2,0),DepthFirstSerchSeries(aa.size()+bb.size()+2,0),Pred(aa.size()+bb.size()+2,0),Depth(aa.size()+bb.size()+2,0),Thread(aa.size()+bb.size()+2,0),CostPotential(1)
    {
            if(Cost.size()!=0)
            {
                    Cost.clear();
            }
            if(Connect.size()!=0)
            {
                    Connect.clear();
            }
            if(Bound.size()!=0)
            {
                    Bound.clear();
            }
            if(Length.size()!=0)
            {
                    Length.clear();
            }
            if(SpanningTree.size()!=0)
            {
                    SpanningTree.clear();
            }
            if(x.size()!=0)
            {
                    x.clear();
            }
            for(int i=0;i&lt;(int)(a.size()+b.size()+2);++i)
            {
                    vector&lt;double&gt; zz(a.size()+b.size()+2,0);
                    vector&lt;bool&gt; c(a.size()+b.size()+2,false);
                    Connect.push_back(c);
                    Cost.push_back(zz);
                    x.push_back(zz);
                    Length.push_back(zz);
                    Bound.push_back(zz);
            }
            for(int i=0;i&lt;(int)B.size();++i)
            {
                    for(int j=0;j&lt;(int)B.size();++j)
                    {
                            if(B[j]==true)
                            {
                                    Cost[i+1][j+a.size()+1]=C[j];
                                    Length[i+1][j+a.size()+1]=L[j];
                                    Bound[i+1][j+a.size()+1]=U[j];
                                    Connect[i+1][j+a.size()+1]=true;
                            }
                    }
            }
            for(int i=0;i&lt;(int)a.size()+1;++i)
            {
                    if(i&gt;0)
                    {
                             Connect[0]=true;
                             Bound[0]=a[i-1];
                    }
            }
            for(int i=(int)Connect.size()-1;i&gt;(int)Connect.size()-b.size()-2;--i)
            {
                    if(i&lt;(int)Connect.size()-1)
                    {
                             Connect[Connect.size()-1]=true;
                             Bound[(int)Connect.size()-1]=b[(int)b.size()-((int)Connect.size()-i-1)];
                    }
            }
            Change=0;
    }
    void InitialSpanningTree();
    double LowestCost(int &amp;c);
    vector&lt;int&gt; FindLine(int s,int t);
    int FindLeaf(vector&lt;vector&lt;bool&gt; &gt;);
    void ComputeNodePotential();
    complex&lt;int&gt; LeavingArc(complex&lt;int&gt;);
    bool Judge(int ,int,bool);
    void ComputeArcFlow();
    complex&lt;int&gt; EnteringArc();
    void DepthFirstSearch();
    bool Judge(complex&lt;int&gt; c);
    void ComputePotantial();
    void Update(complex&lt;int&gt;,complex&lt;int&gt;);
    vector&lt;vector&lt;double&gt; &gt; GetOptimalSolution()
    {
              return Solution;
    }
   
  protected:
    vector&lt;double&gt; a;
    vector&lt;double&gt; b;
    vector&lt;vector&lt;bool&gt; &gt; B;
    vector&lt;vector&lt;double&gt; &gt; C;
    vector&lt;vector&lt;double&gt; &gt; U;
    vector&lt;vector&lt;double&gt; &gt; L;
    vector&lt;vector&lt;bool&gt; &gt; Connect;
    vector&lt;vector&lt;double&gt; &gt; Cost;
    vector&lt;vector&lt;double&gt; &gt; Bound;
    vector&lt;vector&lt;double&gt; &gt; Length;
    vector&lt;vector&lt;bool&gt; &gt; SpanningTree;
    vector&lt;double&gt; Potential;
    vector&lt;vector&lt;double&gt; &gt; x;
    vector&lt;vector&lt;double&gt; &gt; Solution;
    vector&lt;int&gt; DepthFirstSerchSeries;
    vector&lt;int&gt; Pred;
    vector&lt;int&gt; Depth;
    vector&lt;int&gt; Thread;
    vector&lt;vector&lt;double&gt; &gt; CostPotential;
    int Change;
};
#endif
    </P>
 楼主| 发表于 2004-7-5 23:18:10 | 显示全部楼层
<>/*
  Name: NetWorkSimplex.cpp
  Copyright: Knight-Studio
  Author: Ran NI
  Date: 05-07-04 15:19
  Description: The Definition of the NetWorkSimplex Class
*/</P><>#include &lt;vector&gt;
#include &lt;iostream&gt;
#include &lt;complex&gt;
#include &lt;fstream&gt;
#include &lt;stack&gt;
#include &lt;algorithm&gt;
#include &lt;math.h&gt;
#include "FordFulkerson.h"
#include "NetWorkSimplex.h"</P><>using namespace std;</P><P>void NetWorkSimplex::InitialSpanningTree()
{
         FordFulkerson initiall(Bound,Connect);
         vector&lt;vector&lt;double&gt; &gt; initial=initiall.Calculate();
         SpanningTree=Connect;
         x=initial;
         for(int i=0;i&lt;(int)x.size();++i)
         for(int j=0;j&lt;(int)x.size();++j)
         {
                 if((x[j]&gt;0)&amp;&amp;(x[j]&lt;Bound[j])&amp;&amp;(Connect[j]==true))
                 {
                         SpanningTree[j]=true;
                         SpanningTree[j]=true;
                 }
                 else if(((x[j]==0)||(x[j]==Bound[j]))&amp;&amp;(Connect[j]==true))
                 {
                         SpanningTree[j]=false;
                         SpanningTree[j]=false;
                 }
         }
         SpanningTree[0][1]=true;
         SpanningTree[1][0]=true;
         SpanningTree[SpanningTree.size()-1][SpanningTree.size()-2]=true;
         SpanningTree[SpanningTree.size()-2][SpanningTree.size()-1]=true;
         vector&lt;int&gt; close;
         close.push_back(0);
         bool tt=false;
         while(close.size()!=SpanningTree.size())
         {
                 do
                 {
                         tt=false;
                         int j=0;
                         while((j&lt;(int)close.size())&amp;&amp;(tt==false))
                         {
                                 int i=0;
                                 while((i&lt;(int)SpanningTree.size())&amp;&amp;(tt==false))
                                 {
                                          if((SpanningTree[close[j]]==true)&amp;&amp;((SpanningTree[close[j]]==true)))
                                          {
                                                   if(find(close.begin(),close.end(),i)==close.end())
                                                   {
                                                           tt=true;
                                                           close.push_back(i);
                                                   }
                                          }
                                          ++i;
                                 }
                                 ++j;
                         }
                 }while(tt==true);
                 int i=0;
                 bool jud=false;
                 while((i&lt;(int)SpanningTree.size())&amp;&amp;(jud==false))
                 {
                         if(find(close.begin(),close.end(),i)==close.end())
                         {
                                 int j=0;
                                 jud=false;
                                 while((!jud)&amp;&amp;(j&lt;(int)close.size()))
                                 {
                                         if(((Connect[close[j]]==true)||(Connect[close[j]]==true))&amp;&amp;((SpanningTree[close[j]]==false)&amp;&amp;(SpanningTree[close[j]]==false)))
                                         {
                                                  jud=true;
                                                  SpanningTree[close[j]]=true;
                                                  SpanningTree[close[j]]=true;
                                                  close.push_back(i);
                                         }
                                         ++j;
                                 }
                         }
                         ++i;
                 }
         }
}</P><P>void NetWorkSimplex:epthFirstSearch()
{
         stack&lt;int&gt; ss;
         ss.push(0);
         vector&lt;int&gt; contain;
         contain.push_back(0);
         for(int i=0;i&lt;(int)Pred.size();++i)
         {
                 Pred=-1;
         }
         while(!ss.empty())
         {
                 int i=ss.top();
                 bool tag=false;
                 int j=0;
                 while((j&lt;(int)SpanningTree.size())&amp;&amp;(tag==false))
                 {
                         if((SpanningTree[j]==true)||(SpanningTree[j]==true))
                         {
                                 if(find(contain.begin(),contain.end(),j)==contain.end())
                                 {
                                          tag=true;
                                          ss.push(j);
                                          Pred[j]=i;
                                          contain.push_back(j);
                                 }
                         }
                         ++j;
                 }
                 if(tag==false)
                 {
                         ss.pop();
                 }
         }
         for(int i=0;i&lt;(int)contain.size();++i)
         {
                 vector&lt;int&gt; :: iterator it=find(contain.begin(),contain.end(),i);
                 if(it!=(contain.end()-1))
                 {
                         Thread=(*(it+1));
                 }
                 else
                 {
                         Thread[contain[contain.size()-1]]=contain[0];
                 }
         }
         for(int i=0;i&lt;(int)SpanningTree.size();++i)
         {
                 int j=Pred;
                 int nn=0;
                 while(j!=-1)
                 {
                         j=Pred[j];
                         ++nn;
                 }
                 Depth=nn;
         }
}</P><P>void NetWorkSimplex::ComputeNodePotential()
{
         Potential[0]=0;
         int j=Thread[0];
         while(j!=0)
         {
                 int i=Pred[j];
                 if(Connect[j]==true)
                 {
                         Potential[j]=Potential-Cost[j];
                 }
                 else if(Connect[j]==true)
                 {
                         Potential[j]=Potential+Cost[j];
                 }
                 j=Thread[j];
         }
         CostPotential=Cost;
         for(int i=0;i&lt;(int)Cost.size();++i)
         for(int j=0;j&lt;(int)Cost.size();++j)
         {
                 if(Connect[j]==true)
                 {
                         CostPotential[j]=Cost[j]-Potential+Potential[j];
                 }
         }
}</P><P>int NetWorkSimplex::FindLeaf(vector&lt;vector&lt;bool&gt; &gt; ss)
{
         bool tag=false;
         int i=ss.size()-1;
         while((tag==false)&amp;&amp;(i&gt;=0))
         {
                 int k=0;
                 for(int j=0;j&lt;(int)ss.size();++j)
                 {
                          if((ss[j]==true)||(ss[j]==true))
                          {
                                   ++k;
                          }
                 }
                 if(k==1)
                 {
                          tag=true;
                 }
                 else
                 {
                          tag=false;
                          --i;
                 }
         }
         if(i&lt;0)
         {
                 return -1;
         }
         else
         {
                 return i;
         }
}</P><P>complex&lt;int&gt; NetWorkSimplex::EnteringArc()
{
         vector&lt;complex&lt;int&gt; &gt; Candidate;
         for(int i=0;i&lt;(int)Connect.size();++i)
         for(int j=0;j&lt;(int)Connect.size();++j)
         {
                 if((Connect[j]==true)&amp;&amp;(SpanningTree[j]==false))
                 {
                          if(x[j]==0)
                          {
                                   if(CostPotential[j]&lt;0)
                                   {
                                            complex&lt;int&gt; dd(i,j);
                                            Candidate.push_back(dd);
                                   }
                          }else if(x[j]==Bound[j])
                          {
                                   if(CostPotential[j]&gt;0)
                                   {
                                            complex&lt;int&gt; dd(i,j);
                                            Candidate.push_back(dd);
                                   }
                          }
                 }
         }
         double temp=0;
         int kk(-1);
         if(Candidate.size()&gt;0)
         {
                 for(int i=0;i&lt;(int)Candidate.size();++i)
                 {
                          if(fabs(CostPotential[Candidate.real()][Candidate.imag()])&gt;temp)
                          {
                                   kk=i;
                                   temp=fabs(CostPotential[Candidate.real()][Candidate.imag()]);
                          }
                 }
                 return Candidate[kk];                 
         }
         else
         {
                 complex&lt;int&gt; ff(-1,-1);
                 return ff;
         }
}</P><P>bool NetWorkSimplex::Judge(int s,int t,bool tag)
{
         bool result=false;
         if(tag==true)
         {
                 if(Connect[t]==true)
                 {
                         if((x[t]==Bound[t]))
                         {
                                  result=true;
                         }
                 }else if(Connect[t]==true)
                 {
                         if((x[t]==0))
                         {
                                  result=true;
                         }
                 }
         }
         else
         {
                 if(Connect[t]==true)
                 {
                         if((x[t]==0))
                         {
                                  result=true;
                         }
                 }else if(Connect[t]==true)
                 {
                         if((x[t]==Bound[t]))
                         {
                                  result=true;
                         }
                 }
         }
         return result;
}</P><P>vector&lt;int&gt; NetWorkSimplex::FindLine(int s,int t)
{
        vector&lt;int&gt; contain1;
        contain1.push_back(s);
        vector&lt;int&gt; order(Connect.size(),-1);
        int num=1;
        do
        {
                for(int i=0;i&lt;(int)contain1.size();++i)
                {
                        for(int j=0;j&lt;(int)Connect.size();++j)
                        {
                                 if((SpanningTree[contain1][j]==true)&amp;&amp;(find(contain1.begin(),contain1.end(),j)==contain1.end()))
                                 {
                                          contain1.push_back(j);
                                          order[j]=contain1;
                                 }
                                 else if((SpanningTree[j][contain1]==true)&amp;&amp;(find(contain1.begin(),contain1.end(),j)==contain1.end()))
                                 {
                                          contain1.push_back(j);
                                          order[j]=contain1;
                                 }
                        }
                }
                ++num;
        }while(num&gt;Connect.size());
        vector&lt;int&gt; line;        
        if(find(contain1.begin(),contain1.end(),t)==contain1.end())
        {
                return line;
        }
        else
        {
                line.push_back(t);
                int kk=t;
                while(order[kk]!=-1)
                {
                        kk=order[kk];
                        line.push_back(kk);
                }
                return line;
        }
}</P><P>void NetWorkSimplex::ComputePotantial()
{
         for(int i=0;i&lt;(int)Cost.size();++i)
         for(int j=0;j&lt;(int)Cost.size();++j)
         {
                 if(Connect[j]==true)
                 {
                         CostPotential[j]=Cost[j]-Potential+Potential[j];
                 }
         }
}</P>
 楼主| 发表于 2004-7-5 23:20:02 | 显示全部楼层
<>complex&lt;int&gt; NetWorkSimplex:eavingArc(complex&lt;int&gt; enter)
{
         int i=enter.real();
         int j=enter.imag();         
         double delta=0;
         complex&lt;int&gt; result;
         if(x[j]&lt;Bound[j])
         {
                 delta=Bound[j]-x[j];
         }
         else
         {
                 delta=x[j];
         }
         vector&lt;complex&lt;int&gt; &gt; con1;
         vector&lt;complex&lt;int&gt; &gt; con2;
         while(i!=j)
         {
                 if(Depth&gt;Depth[j])
                 {
                         int k=Pred;
                         complex&lt;int&gt; dd(k,i);
                         con1.push_back(dd);
                         i=k;
                 }
                 else if(Depth&lt;Depth[j])
                 {
                         int  k=Pred[j];
                         complex&lt;int&gt; dd(j,k);
                         con2.push_back(dd);
                         j=k;
                 }
                 else
                 {
                         int k=Pred;
                         complex&lt;int&gt; dd(k,i);
                         con1.push_back(dd);
                         i=k;
                         k=Pred[j];
                         complex&lt;int&gt; ddd(j,k);
                         con2.push_back(ddd);
                         j=k;
                 }
         }
         if(x[enter.real()][enter.imag()]&lt;Bound[enter.real()][enter.imag()])
         {
                 for(int ii=0;ii&lt;(int)con1.size();++ii)
                 {
                         if(Connect[con1[ii].real()][con1[ii].imag()]==true)
                         {
                                  if(delta&gt;(Bound[con1[ii].real()][con1[ii].imag()]-x[con1[ii].real()][con1[ii].imag()]))
                                  {
                                           delta=(Bound[con1[ii].real()][con1[ii].imag()]-x[con1[ii].real()][con1[ii].imag()]);
                                  }
                         }else if(Connect[con1[ii].imag()][con1[ii].real()]==true)
                         {
                                  if(x[con1[ii].imag()][con1[ii].real()]&lt;delta)
                                  {
                                           delta=x[con1[ii].imag()][con1[ii].real()];
                                  }
                         }
                 }
                 for(int ii=0;ii&lt;(int)con2.size();++ii)
                 {
                         if(Connect[con2[ii].real()][con2[ii].imag()]==true)
                         {
                                  if(delta&gt;(Bound[con2[ii].real()][con2[ii].imag()]-x[con2[ii].real()][con2[ii].imag()]))
                                  {
                                          delta=(Bound[con2[ii].real()][con2[ii].imag()]-x[con2[ii].real()][con2[ii].imag()]);
                                  }
                         }else if(Connect[con2[ii].imag()][con2[ii].real()]==true)
                         {
                                  if(x[con2[ii].imag()][con2[ii].real()]&lt;delta)
                                  {
                                          delta=x[con2[ii].imag()][con2[ii].real()];
                                  }
                         }
                 }
                 {
                         for(int ii=0;ii&lt;(int)con1.size();++ii)
                         {
                                  if(Connect[con1[ii].real()][con1[ii].imag()]==true)
                                  {
                                          x[con1[ii].real()][con1[ii].imag()]+=delta;
                                  }
                                  else
                                  {
                                          x[con1[ii].imag()][con1[ii].real()]-=delta;
                                  }
                         }
                         for(int ii=0;ii&lt;(int)con2.size();++ii)
                         {
                                  if(Connect[con2[ii].real()][con2[ii].imag()]==true)
                                  {
                                          x[con2[ii].real()][con2[ii].imag()]+=delta;
                                  }
                                  else
                                  {
                                          x[con2[ii].imag()][con2[ii].real()]-=delta;
                                  }
                         }
                         x[enter.real()][enter.imag()]+=delta;
                         int n=-1;
                         int m=0;
                         bool jg=false;
                         for(int i=0;(i&lt;(int)con1.size())&amp;&amp;(jg==false);++i)
                         {
                                  if(Judge(con1.real(),con1.imag(),true))
                                  {
                                          jg=true;
                                          m=i;
                                  }
                         }
                         if(jg==true)
                         {
                                  n=m;
                         }
                         int kn=-1;
                         m=0;
                         jg=false;
                         for(int i=(int)con2.size()-1;(i&gt;=0)&amp;&amp;(jg==false);--i)
                         {
                                  if(Judge(con2.real(),con2.imag(),true))
                                  {
                                           jg=true;
                                           m=i;
                                  }
                         }
                         if(jg==true)
                         {
                                  kn=m;
                         }
                         if(n!=-1)
                         {
                                  if(kn&gt;=0)
                                  {
                                           if(Connect[con2[kn].real()][con2[kn].imag()]==true)
                                           {
                                                    result=con2[kn];
                                           }
                                           else
                                           {
                                                    complex&lt;int&gt; dd(con2[kn].imag(),con2[kn].real());
                                                    result=dd;
                                           }
                                  }
                                  else if(!Judge(enter.real(),enter.imag(),true))
                                  {
                                           if(Connect[con1[n].real()][con1[n].imag()]==true)
                                           {
                                                   result=con1[n];
                                           }
                                           else
                                           {
                                                   complex&lt;int&gt; dd(con1[n].imag(),con1[n].real());
                                                   result=dd;
                                           }
                                  }
                                  else
                                  {
                                           result=enter;
                                  }
                         }
                         else if(n==-1)
                         {
                                  if(kn&gt;=0)
                                  {
                                           if(Connect[con2[kn].real()][con2[kn].imag()]==true)
                                           {
                                                    result=con2[kn];
                                           }
                                           else
                                           {
                                                    complex&lt;int&gt; dd(con2[kn].imag(),con2[kn].real());
                                                    result=dd;
                                           }
                                  }
                                  else if(Judge(enter.real(),enter.imag(),true))
                                  {
                                           result=enter;
                                  }
                         }
                         SpanningTree[result.real()][result.imag()]=false;
                         SpanningTree[result.imag()][result.real()]=false;
                 }
         }</P>
 楼主| 发表于 2004-7-5 23:20:32 | 显示全部楼层
else
         {
                 for(int ii=0;ii&lt;(int)con1.size();++ii)
                 {
                         if(Connect[con1[ii].imag()][con1[ii].real()]==true)
                         {
                                  if(delta&gt;(Bound[con1[ii].imag()][con1[ii].real()]-x[con1[ii].imag()][con1[ii].real()]))
                                  {
                                           delta=(Bound[con1[ii].imag()][con1[ii].real()]-x[con1[ii].imag()][con1[ii].real()]);
                                  }
                         }else if(Connect[con1[ii].real()][con1[ii].imag()]==true)
                         {
                                  if(x[con1[ii].real()][con1[ii].imag()]&lt;delta)
                                  {
                                           delta=x[con1[ii].real()][con1[ii].imag()];
                                  }
                         }
                 }
                 for(int ii=0;ii&lt;(int)con2.size();++ii)
                 {
                         if(Connect[con2[ii].imag()][con2[ii].real()]==true)
                         {
                                  if(delta&gt;(Bound[con2[ii].imag()][con2[ii].real()]-x[con2[ii].imag()][con2[ii].real()]))
                                  {
                                           delta=(Bound[con2[ii].imag()][con2[ii].real()]-x[con2[ii].imag()][con2[ii].real()]);
                                           //cout&lt;&lt;delta&lt;&lt;"\t";
                                  }
                         }else if(Connect[con2[ii].real()][con2[ii].imag()]==true)
                         {
                                  if(x[con2[ii].real()][con2[ii].imag()]&lt;delta)
                                  {
                                           delta=x[con2[ii].real()][con2[ii].imag()];
                                           //cout&lt;&lt;delta&lt;&lt;"\t";
                                  }
                         }
                 }
                 {
                         for(int ii=0;ii&lt;(int)con1.size();++ii)
                         {
                                  if(Connect[con1[ii].imag()][con1[ii].real()]==true)
                                  {
                                           x[con1[ii].imag()][con1[ii].real()]+=delta;
                                  }
                                  else
                                  {
                                           x[con1[ii].real()][con1[ii].imag()]-=delta;
                                  }
                         }
                         for(int ii=0;ii&lt;(int)con2.size();++ii)
                         {
                                  if(Connect[con2[ii].imag()][con2[ii].real()]==true)
                                  {
                                           x[con2[ii].imag()][con2[ii].real()]+=delta;
                                  }
                                  else
                                  {
                                           x[con2[ii].imag()][con2[ii].real()]-=delta;
                                  }
                         }
                         x[enter.real()][enter.imag()]-=delta;
                         int n=-1;
                         int m=0;
                         bool jg=false;
                         for(int i=0;(i&lt;(int)con2.size())&amp;&amp;(jg==false);++i)
                         {
                                  if(Judge(con2.real(),con2.imag(),false))
                                  {
                                          jg=true;
                                          m=i;
                                  }
                         }
                         if(jg==true)
                         {
                                  n=m;
                         }
                         int kn=-1;
                         m=0;
                         jg=false;
                         for(int i=(int)con1.size()-1;(i&gt;=0)&amp;&amp;(jg==false);--i)
                         {
                                  if(Judge(con1.real(),con1.imag(),false))
                                  {
                                           jg=true;
                                           m=i;
                                  }
                         }
                         if(jg==true)
                         {
                                  kn=m;
                         }
                         if(n!=-1)
                         {
                                  if(kn&gt;=0)
                                  {
                                           if(Connect[con1[kn].real()][con1[kn].imag()]==true)
                                           {
                                                     result=con1[kn];
                                           }
                                           else
                                           {
                                                     complex&lt;int&gt; dd(con1[kn].imag(),con1[kn].real());
                                                     result=dd;
                                           }
                                  }
                                  else if(!Judge(enter.real(),enter.imag(),false))
                                  {
                                           if(Connect[con2[n].real()][con2[n].imag()]==true)
                                           {
                                                    result=con2[n];
                                           }
                                           else
                                           {
                                                    complex&lt;int&gt; dd(con2[n].imag(),con2[n].real());
                                                    result=dd;
                                           }
                                  }
                                  else
                                  {
                                           result=enter;
                                  }
                         }
                         else if(n==-1)
                         {
                                  if(kn&gt;=0)
                                  {
                                           if(Connect[con1[kn].real()][con1[kn].imag()]==true)
                                           {
                                                  result=con1[kn];
                                           }
                                           else
                                           {
                                                  complex&lt;int&gt; dd(con1[kn].imag(),con1[kn].real());
                                                  result=dd;
                                           }
                                  }
                                  else if(Judge(enter.real(),enter.imag(),false))
                                  {
                                           result=enter;
                                  }
                         }
                         SpanningTree[result.real()][result.imag()]=false;
                         SpanningTree[result.imag()][result.real()]=false;
                 }
         }
         return result;
}
 楼主| 发表于 2004-7-5 23:20:58 | 显示全部楼层
<>
void NetWorkSimplex::ComputeArcFlow()
{
         vector&lt;double&gt; bb(Connect.size(),0);
         for(int i=0;i&lt;(int)a.size();++i)
         {
                 bb[0]+=a;
         }
         bb[bb.size()-1]=-bb[0];
         for(int i=0;i&lt;(int)Connect.size();++i)
         {
                 for(int j=0;j&lt;(int)Connect.size();++j)
                 {
                          if((Connect[j]==true)&amp;&amp;(SpanningTree[j]==false))
                          {
                                   if(x[j]==Bound[j])
                                   {
                                            bb-=Bound[j];
                                            bb[j]+=Bound[j];
                                   }
                          }
                 }
         }
         vector&lt;vector&lt;bool&gt; &gt; sp(SpanningTree);
         int n=(int)sp.size();
         while(n&gt;1)
         {
                 int j=FindLeaf(sp);
                 int i=Pred[j];
                 if((Connect[j]==true))
                 {
                          x[j]=0-bb[j];
                 }
                 else
                 {
                          x[j]=bb[j];
                 }
                 bb+=bb[j];
                 sp[j]=false;
                 sp[j]=false;
                 --n;
         }
}</P><>
void NetWorkSimplex::Update(complex&lt;int&gt; enter,complex&lt;int&gt; left)
{
         int y;
         vector&lt;int&gt; line(this-&gt;FindLine(0,left.imag()));
         if(line.size()==0)
         {
                  y=left.imag();
         }
         else
         {
                  y=left.real();
         }
         double change;
         line=this-&gt;FindLine(0,enter.real());
         if(line.size()!=0)
         {
                  change=-(CostPotential[enter.real()][enter.imag()]);
         }
         else
         {
                  change=CostPotential[enter.real()][enter.imag()];
         }
         Potential[y]+=change;
         int z=Thread[y];
         while(Depth[z]&gt;Depth[y])
         {
                  Potential[z]+=change;
                  z=Thread[z];
         }
         SpanningTree[enter.real()][enter.imag()]=true;
         SpanningTree[enter.imag()][enter.real()]=true;         
}</P><>bool NetWorkSimplex::Judge(complex&lt;int&gt; c)
{
         bool f=true;
         if((c.real()==(-1))&amp;&amp;(c.imag()==(-1)))
         {
                 f=false;
         }
         return f;
}</P><P>double NetWorkSimplex:owestCost(int &amp;c)
{
         this-&gt;InitialSpanningTree();
         this-&gt;DepthFirstSearch();
         this-&gt;ComputeNodePotential();
         complex&lt;int&gt; enter=this-&gt;EnteringArc();
         double tem=0;
         for(int i=0;i&lt;(int)x.size();++i)
         {
                  for(int j=0;j&lt;(int)x.size();++j)
                  {
                           tem+=x[j]*Cost[j];
                  }
         }
         Change=0;
         while(Judge(enter))
         {
                  complex&lt;int&gt; left=LeavingArc(enter);
                  cout&lt;&lt;"EnterArc is\t"&lt;&lt;enter.real()&lt;&lt;"\t"&lt;&lt;enter.imag()&lt;&lt;endl;
                  cout&lt;&lt;"LeavingArc is\t"&lt;&lt;left.real()&lt;&lt;"\t"&lt;&lt;left.imag()&lt;&lt;endl&lt;&lt;endl;
                  Update(enter,left);
                  ++Change;
                  ComputePotantial();
                  this-&gt;DepthFirstSearch();
                  //ComputeArcFlow();
                  enter=this-&gt;EnteringArc();
         }
         c=Change;
         double result(0);
         for(int i=0;i&lt;(int)x.size();++i)
         for(int j=0;j&lt;(int)x.size();++j)
         {
                  result+=x[j]*Cost[j];
         }
         Solution.clear();
         for(int i=0;i&lt;(int)a.size();++i)
         {
                 vector&lt;double&gt; ss(b.size(),0);
                 Solution.push_back(ss);
         }
         for(int i=0;i&lt;(int)a.size();++i)
         {
                 for(int j=0;j&lt;(int)b.size();++j)
                 {
                         Solution[j]=x[i+1][1+a.size()+j];
                 }
         }
         return result;
}</P>
 楼主| 发表于 2004-7-5 23:21:28 | 显示全部楼层
<>/*
  Name: FordFulkerson.h
  Copyright: Knight-Studio
  Author: Ran NI
  Date: 05-07-04 15:20
  Description: The Declaration of the FordFulkerson Class
*/</P><>#include &lt;vector&gt;
#include &lt;complex&gt;
#ifndef _FORDFULKERSON_H_
#define _FORDFULKERSON_H_</P><>using namespace std;</P><P>class FordFulkerson
{
  public:
    FordFulkerson(vector&lt;vector&lt;double&gt; &gt; d,vector&lt;vector&lt;bool&gt; &gt; b):data(d),B(b)
    {
             X.clear();
             for(int i=0;i&lt;(int)data.size();++i)
             {
                      vector&lt;double&gt; z(data.size(),0);
                      X.push_back(z);
             }
    }
    vector&lt;vector&lt;double&gt; &gt; Calculate();
    vector&lt;int&gt; FindLine();
    void Augment(vector&lt;int&gt;);
   
  protected:
    vector&lt;vector&lt;double&gt; &gt; data;
    vector&lt;vector&lt;bool&gt; &gt; B;
    vector&lt;vector&lt;double&gt; &gt; X;
};
#endif</P>
 楼主| 发表于 2004-7-5 23:22:03 | 显示全部楼层
<>/*
  Name: FordFulkerson.cpp
  Copyright: Knight-Studio
  Author: Ran NI
  Date: 05-07-04 15:20
  Description: The Definition of the FordFulkerson Class
*/</P><>#include &lt;vector&gt;
#include &lt;iostream&gt;
#include &lt;complex&gt;
#include &lt;algorithm&gt;
#include &lt;math.h&gt;
#include "FordFulkerson.h"</P><>using namespace std;</P><P>void FordFulkerson::Augment(vector&lt;int&gt; line)
{
        double delta;
        if(B[line[1]][line[0]]==true)
        {
                delta=data[line[1]][line[0]]-X[line[1]][line[0]];
        }else if(B[line[0]][line[1]]==true)
        {
                delta=X[line[0]][line[1]];
        }      
        for(int i=0;i&lt;(int)line.size()-1;++i)
        {
                if(B[line[i+1]][line]==true)
                {
                         double dd=data[line[i+1]][line]-X[line[i+1]][line];
                         if(dd&lt;delta)
                         {
                                  delta=dd;
                         }
                }
                else if(B[line][line[i+1]]==true)
                {
                         double dd=X[line][line[i+1]];
                         if(dd&lt;delta)
                         {
                                 delta=dd;
                         }
                }
        }
        for(int i=0;i&lt;(int)line.size()-1;++i)
        {
                if(B[line[i+1]][line]==true)
                {
                         X[line[i+1]][line]+=delta;
                }
                else if(B[line][line[i+1]]==true)
                {
                         X[line][line[i+1]]-=delta;
                }
        }        
}</P><P>vector&lt;int&gt; FordFulkerson::FindLine()
{
        vector&lt;int&gt; contain1;
        contain1.push_back(0);
        vector&lt;int&gt; contain11;
        vector&lt;int&gt; order(data.size(),-1);
        do
        {
                contain11=contain1;
                for(int i=0;i&lt;(int)contain1.size();++i)
                {
                        for(int j=0;j&lt;(int)data.size();++j)
                        {
                                 if((B[contain1][j]==true)&amp;&amp;(find(contain1.begin(),contain1.end(),j)==contain1.end()))
                                 {
                                          if(X[contain1][j]&lt;data[contain1][j])
                                          {
                                                   contain1.push_back(j);
                                                   order[j]=contain1;
                                          }
                                 }
                                 else if((B[j][contain1]==true)&amp;&amp;(find(contain1.begin(),contain1.end(),j)==contain1.end()))
                                 {
                                          if(X[j][contain1]&gt;0)
                                          {
                                                   contain1.push_back(j);
                                                   order[j]=contain1;
                                          }
                                 }
                        }
                }
        }while(contain11.size()!=contain1.size());
        vector&lt;int&gt; line;
        if(find(contain1.begin(),contain1.end(),data.size()-1)==contain1.end())
        {
                return line;
        }
        else
        {
                line.push_back(data.size()-1);
                int kk=data.size()-1;
                while(order[kk]!=-1)
                {
                       kk=order[kk];
                       line.push_back(kk);
                }
                return line;
        }
}</P><P>vector&lt;vector&lt;double&gt; &gt; FordFulkerson::Calculate()
{
        vector&lt;int&gt; line=this-&gt;FindLine();
        while(line.size()!=0)
        {
                this-&gt;Augment(line);
                line=this-&gt;FindLine();
        }
        return X;
}</P>
发表于 2004-8-4 03:24:44 | 显示全部楼层
<>版主: 你好</P><>这些程序都是同一页的吗?</P>
 楼主| 发表于 2004-8-4 09:36:08 | 显示全部楼层
不是,根据注释头上的文件名,是多个文件,需放在同一个工程里,用比较新的编译器(比如Vc.net2003或者C++Builder6等支持新规范的编译器)。我是按顺序贴的,只要按这个顺序把程序放在相应的文件里就可以了。
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-11-30 19:48 , Processed in 0.066631 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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