1. 程式人生 > >【轉】MATLAB實現構造Euler環遊圖的演算法——數學建模

【轉】MATLAB實現構造Euler環遊圖的演算法——數學建模

   我們專業課(數學建模)講的東西由七橋堡問題而來的Euler環遊。

   如下圖,要將其變為Euler環遊圖。

%首先給出一個矩陣(相鄰表示1,不相鄰表示0),用來表示圖1。

v =

     0     1     0     0     0     0     0     1
     1     0     1     0     0     0     1     0
     0     1     0     1     0     1     0     0
     0     0     1     0     1     0     0     0
     0     0     0     1     0     1     0     0
     0     0     1     0     1     0     1     0
     0     1     0     0     0     1     0     1
     1     0     0     0     0     0     1     0


Euler1(v)%呼叫寫好的函式

Euler1函式如下:

function f=Euler1(v)
%定義陣列用來存放該行是否為奇數。如果為1則表示奇數
count=size(v);
rows=zero(1,count(1));
%第一步是找出奇數行,然後找遍歷為1的座標,準備為該座標加1
%在此之前先判斷該座標的列標所對應的行是否為奇數,如果是則加1
%如果不是再判斷下一個,如果直到完成也沒有結果,輸出提示。
%說明該圖不能變成Euler圖。如果可以直到的最後得到結果將結果輸出。
   
%遍歷所有行,找出和為奇數的行
    for i=1:6
       if rem(sum(v(i,:)),2 )~=0    %不等於0
           %找到奇數行標記
           rows(i)=1;
       end
    end
    %按照原先的標記開始變為Euler圖。
    for i=1:6
       if rows(i)==1
          for j=1:6
              if v(i,j)==1
                 if rows(j)==1
                    v(i,j)=2; 
                    rows(i)=0;  %再次賦值為0
                    break
                 end
              end
          end
          continue
       end
    end
    
    v%輸出結果

最後得到的圖為:

這個是沒有考慮到權重的,如果要考慮權重的話,就要稍微複雜點了。