私は現在、遺伝的アルゴリズムを作成しようとしています。解決したい問題の解決策を探しています。私は乱数生成を使用して複雑な配列を作成しました。この配列は、配列を正規化する関数に渡します。コードは次のようになります。複雑な配列を関数に渡して、間違った答えを返す
PROGRAM genetic_algorithm
IMPLICIT NONE
INTEGER:: a, b
INTEGER :: i,j
REAL :: d,e
INTEGER, DIMENSION(8) :: seed
COMPLEX,DIMENSION(:,:), ALLOCATABLE :: pop_mat, norm_mat
COMPLEX :: c, norm
WRITE(*,*) "Input Seed values - 8"
READ(*,*) seed
WRITE(*,*) "Input state vector number"
READ(*,*) b
WRITE(*,*) "Input population number"
READ(*,*) a
ALLOCATE(pop_mat(a,b))
ALLOCATE(norm_mat(a,b))
OPEN(1,FILE='Candidate_solutions.txt')
CALL RANDOM_SEED(PUT=seed)
DO i = 1,a
DO j = 1,b
CALL RANDOM_NUMBER(d)
CALL RANDOM_NUMBER(e)
d = (2*d) -1
e = (2*e) - 1
c = CMPLX(d,e)
pop_mat(i,j)=c
WRITE(1,'(2F9.5)',advance='no') pop_mat(i,j)
END DO
WRITE(1,*) ''
END DO
CLOSE(1)
norm_mat=norm(pop_mat,a,b)
WRITE(*,*) norm_mat(:,:)
END PROGRAM genetic_algorithm
出力をテストするための最終的な書き込みコマンドがあります。私norm
関数は次のようになります。
COMPLEX FUNCTION norm(x,y,z)
IMPLICIT NONE
COMPLEX, DIMENSION(y,z), INTENT(INOUT) :: x
INTEGER, INTENT (IN) :: y, z
REAL :: norm_val
REAL, DIMENSION(y) :: state_sum
INTEGER :: i, j
OPEN(2,FILE='norm_mat.txt')
DO i = 1, y
DO j =1, z
norm_val = CONJG(x(i,j))*x(i,j)
state_sum(i) = state_sum(i) + norm_val
END DO
END DO
DO i = 1, y
DO j =1, z
x(i,j) = (1/SQRT(state_sum(i)))*x(i,j)
WRITE(2,'(2F9.5)',advance='no') x(i,j)
END DO
WRITE(2,*) ''
END DO
CLOSE(2)
WRITE(*,*) x(:,:)
WRITE(*,*) ''
END FUNCTION
FUNCTION norm
、それはnorm_mat.txt
に正しい値を出力しますが、メインプログラムに至るまで戻って渡されたとき、私は(2.34180515E-38, 0.0000000 )
に等しいすべての行列要素を取得します。私は割り振りを混乱させて、マトリックスを通過してからsize(a,1) size(a,2)
で割り振りましたが、その方法を使ってstate_sum
のサイズを割り振ることができませんでした。
正しい値が返されない理由を理解できません。
'norm'はスカラー関数の結果を持っています。これはあなたの期待ですか?おそらく、あなたはその価値を定義しておらず、それを配列への代入の右辺として持っているかもしれません。 – francescalus
機能について理解していないものがなければなりません。私は関数が私の行列pop_matを取り、それを正規化して、メインプログラムに同じ次元の配列を返すようにしたいので、他の関数に正規化された関数を使うことができます。 – johnahh
あなたのコンパイラは戻り値が決して設定されていないと不平を言っていませんか? – agentp