단순 형법 의 코드 실현

4526 단어 C#
방금 선형 계획 의 부분 을 배 웠 는데 작업 은 스스로 단순 형법 을 실현 하 는 것 이다. 번 거 로 워 보이 지만 사실은 번 거 롭 지 않다. 상세 한 단순 형 내용 은 을 참조 하고 알고리즘 부분 은 을 참조한다.
주: 다음 코드 는 무한 여 부 를 판정 하 는 상황 이 부족 합 니 다. 코드 에 인증 을 추가 하면 됩 니 다.
1 > 기본 벡터 확인, 즉
 //     ,  A,        1  
    private List al = new List();//        
            for (int i = 0; i < A.GetLength(1); i++)
            {
                flag = 0;
                for (int j = 0; j < A.GetLength(0); j++)
                {
                       if(A[j, i]==1) flag += 1;
                       if(A[j, i]==0) flag += 0;
                       if((A[j, i]!=1)&&(A[j, i]!=0)) flag+=2; 
                    }
               if (flag == 1) this.al.Add(i);
            }

2 > cj - zj 확인
 private void get_c_z()   //      
        {          
            for (int i = 0; i < this.c_z.Length; i++)
            {
                this.c_z[i]= this.c[i];
                for (int j = 0; j < this.A.GetLength(0); j++)
                    this.c_z[i] = this.c_z[i] - this.A[j, i] * this.al2[j];
            }
        }

3 > 주 변 원 찾기
private void get_variable()
        { 
        //  c_z   
            int k = 0;
            double temp = this.c_z[0];
            for (int i = 1; i < this.c_z.Length; i++)
            {
                if (this.c_z[i] > temp) { k = i; temp = this.c_z[i]; }
            }
        // k  b/a   
            int n= 0;
            while(this.A[n,k]<=0)
                n++;
            double ratio=this.b[n]/this.A[n,k];
            for (int j = n + 1; j < this.A.GetLength(0); j++)
                if ((this.A[j, k] > 0) && (this.b[j] / this.A[j, k] < ratio)) { n = j; ratio = this.b[j] / this.A[j, k]; }
            
       //      n k ,   
            this.al[n] = k;
            this.al2[n] = this.c[k];

      //    
            pivot(n,k);       
      //      
            get_c_z();
        }

4 > 고 스 소원 실현
 private void pivot(int n,int k)//n k     ,    
        {
        //k   1
            double ratio;
             for (int i = 0; i < this.A.GetLength(0); i++)
             {
                 if ((this.A[i, k] != 0)&&(this.A[i,k]!=1))//  0,1     
                 {
                     ratio = Math.Abs(this.A[i, k]) / 1;
                     for (int j = 0; j < this.A.GetLength(1); j++)
                         this.A[i, j] = this.A[i, j] / ratio;
                     this.b[i] = this.b[i] / ratio;
                 }
             }
         
          //  n    1 ,       n 
             for (int i = 0;i < this.A.GetLength(0); i++)
             {
                 if (i != n)
                 {
                     if (this.A[i, k] != 0)//       
                     {
                         if (this.A[i, k] == 1)
                         {
                             for (int j = 0; j < this.A.GetLength(1); j++)
                                 this.A[i, j] = this.A[i, j] - this.A[n, j];
                             this.b[i] = this.b[i] - this.b[n];
                         }
                         if (this.A[i, k] == -1)
                         {
                             for (int j = 0; j < this.A.GetLength(1); j++)
                                 this.A[i, j] = this.A[i, j] + this.A[n, j];
                             this.b[i] = this.b[i] + this.b[n];
                         }
                     }
                 }
             }
             //       , al        1,this.A[i, this.al[i]]==1
             for (int i = 0; i < this.A.GetLength(0); i++)
             {
                 if (this.A[i, this.al[i]] != 0)
                 {
                     ratio = this.A[i, this.al[i]] / 1;
                     for (int j = 0; j < this.A.GetLength(1); j++)
                         this.A[i, j] = this.A[i, j] / ratio;
                     this.b[i] = this.b[i] / ratio;
                 }
             }
        }

5 > 실행 종료 조건
  while (is_negative() != true) //         ,  
            { 
            //    ,     ,    
                get_variable(); 
            }
 private bool is_negative()
         {
             bool flag = true;
             foreach (int i in this.c_z)
                 if (i > 0)
                 {
                     flag = false; break;
                 }
             return flag;
         }

좋은 웹페이지 즐겨찾기