質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

3367閲覧

式には pointer-to-object 型が必要です

mishima36

総合スコア7

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/12/14 03:29

①、②、③のF[i]のところでエラーが起こっています。どなたか何が間違っているか解説と修正をお願いいたします。

###発生している問題・エラーメッセージ
エラーメッセージ
式には pointer-to-object 型が必要です

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define M 30 /粒子数 M = 30/
#define D 2 /解の次元 D = 2/

int main() {
int t, i, dim;
double r1, r2;
double F = 0;
const double Inf = 10000000000;
double c = 1.494;
double w = 0.729;
int Tmax = 1000; /最大繰り返し回数/
double Cr = 0.00001; /終了条件/
double Xmin = -5, Xmax = 5; /範囲/

double X[M][D]; /*M個×D次元の配列*/ double V[M][D]; /*M個×D次元の配列*/ double F[M]; /*M個分の評価関数値を格納*/ double Fp[M], Xp[M][D]; /*M個分のpbest*/ double Fg, Xg[D]; /*gbest*/ srand(time(NULL)); /*乱数の初期化*/ for (i = 0;i < M;i++) { for (dim = 1;dim <= D;dim++) { X[i][dim] = (double)rand() / 32767.0; X[i][dim] = (Xmax - Xmin) * X[i][i] + Xmin; V[i][dim] = 0; } } for (i = 0;i < M;i++) { /*Fp[M]の初期化    */ Fp[i] = Inf; } Fg = Inf; /*Fg初期化*/ for (t = 0;t < Tmax - 1;t++) { for (i = 0;i < M;i++) {

① F[i] = 0;
for (dim = 0;dim < D;dim++) {
Fp[i] += X[i][dim] * X[i][dim];
}
② if (F[i] < Fp[i]) {
③ F[i] = Fp[i];
for (dim = 0;dim < D;dim++) {
Xp[i][dim] = X[i][dim];
}
if (Fp[i] < Fg) {
Fg = Fp[i];
for (dim = 0;dim < D; dim++) {
Xg[dim] = Xp[i][dim];
}
}

} } if (Fg < Cr) { break; } for (i = 0;i < M;i++) { for (dim = 0;dim < D;dim++) { r1 = (double)rand() / 32767.0; r1 = (Xmax - Xmin) * X[i][dim] + Xmin; r2 = (double)rand() / 32767.0; r2 = (Xmax - Xmin) * X[i][dim] + Xmin; V[i][dim] = w * V[i][dim] + c * r1 * (Xp[i][dim]) + c * r2 * (Xg[dim] - X[i][dim]); X[i][dim] = X[i][dim] + V[i][dim]; printf("%f ", X[i][dim]); } } } printf("終了時刻t = %d\n", t); printf("解の目的関数値Fg = %f\n", Fg); printf("解Xg =["); for (dim = 0;dim < D;dim++) { printf("%f", Xg[dim]); } printf("]\n"); system("pause");

}
###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
C++(visual studio)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

別の間違いとしてはCとC++のrand関数は使うべきではありません。最大値が比較的小さく、使い方によっては一様な値になりません(偏りが出ます)。
C++ならばrandomヘッダが使えると思うので、メルセンヌツイスタとかの乱数生成器を用いるべきです。

投稿2017/12/14 04:43

m_yoko

総合スコア156

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mishima36

2017/12/14 05:42

どうもありがとうごさいます!C++に適した乱数作成をもう少し調べてみようと思います。
episteme

2017/12/14 05:50

"C++に適した"じゃない。 "問題領域に相応しい"だ。
guest

0

ベストアンサー

double F = 0;
double F[M];

main()の中にふたつのFがありますょ?

投稿2017/12/14 03:41

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mishima36

2017/12/14 05:38

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問