大谷紀子さん著書の人工蜂コロニー(ABCアルゴリズム)の項目のソースコードを書き写しコンパイルしているのですがエラーが大量に出ています.誤字脱字は直しました
発生している問題・エラーメッセージ
g++ -o bee sample04.cpp sample04.cpp:10:25: warning: conversion from string literal to 'char *' is deprecated [-Wc++11-compat-deprecated-writable-strings] fSet = new FlowerSet("sampledata.csv"); ^ sample04.cpp:16:17: warning: illegal character encoding in string literal [-Winvalid-source-encoding] printf("%d<89><F1><96>ځF<8D>ŗǕ]<89><BF><92>l%f\n", i, fSet->bestValue); ^~~~~~~~~~~~ ~~~~ ~~~~~~~~~~~~ sample04.cpp:16:7: error: use of undeclared identifier 'printf' printf("%d<89><F1><96>ځF<8D>ŗǕ]<89><BF><92>l%f\n", i, fSet->bestValue); ^ 2 warnings and 1 error generated.
該当のソースコード
FlowerSet
1#include "FlowerSet.h" 2#pragma once 3#define filename data.txt 4//コントラスタ 5// filename: データセットのファイル名 6FlowerSet::Flower(char *filename){ 7 int i,best; 8 9 dataset=new Dataset(filename); 10 flower=new Flower* [EBEE_NUM]; 11 best=0; 12 13 for(i=0;i<EBEE_NUM;i++){ 14 flower[i]=new Flower(this); 15 if(flower[best]->value>flower[i]->value){ 16 best=i; 17 } 18 } 19 bestPos=new double[dataset->exVarNum]; 20 for(i=0;i<dataset->exVarNum;i++){ 21 bestPos[i]=flower[best]->pos[i]; 22 } 23 bestValue=flower[best]->value; 24 newFlower=new Flower(this); 25 trValue=new double[EBEE_NUM]; 26} 27 28//デストラクタ 29FlowerSet::~FlowerSet(){ 30 int i; 31 32 for(i=0;i<EBEE_NUM;i++){ 33 delete flower[i]; 34 } 35 delete [] flower; 36 delete [] bestPos; 37 delete newFlower; 38 delete [] trValue; 39 delete dataset; 40 41 //収穫蜂フェーズを実行する 42 void FlowerSet::employedBeePhase() 43 { 44 int i; 45 Flower *tmp; 46 47 for(i=0;i<EBEE_NUM;i++){ 48 newFlower->change(i); 49 if(flower[i]-> value > newFlower -> value){ 50 tmp=newFlower; 51 newFlower=flower[i]; 52 flower[i]=tmp; 53 } 54 flower[i]->visitNum++; 55 } 56 } 57 //追従蜂フェーズを実行する 58 void FlowerSet::onlookerBeePhase() 59 { 60 int i,j; 61 Flower *tmp; 62 double max,min,denom,prob,r; 63 64 for(j=0;j<OBEE_NUM;j++){ 65 //評価値を変換する 66 max=DBL_MIN; 67 min=DBL_MAX; 68 for(i=0;i<EBEE_NUM;i++){ 69 if(max<flower[i]->value){ 70 max=flower[i]->value; 71 } 72 if(min<flower[i]->value){ 73 min=flower[i]->value; 74 } 75 } 76 denom=0.0; 77 for(i=0;i<EBEE_NUM;i++){ 78 trValue[i]=(max-flower[i]->value)/(max-min); 79 denom+=trValue[i]; 80 } 81 82 //収穫蜂を選択する 83 r=RAND_01; 84 for(i=0;i<EBEE_NUM-1;i++){ 85 prob=trValue[i]/denom; 86 if(r<=prob){ 87 break; 88 } 89 r -=prob; 90 } 91 92 //収穫蜂フェーズと同様に処理する 93 newFlower->change(i); 94 if(flower[i]->value>newFlower->value){ 95 tmp=newFlower; 96 newFlower=flower[i]; 97 flower[i]=tmp; 98 } 99 flower[i]->visitNum++; 100 } 101 } 102 103 //偵察蜂フェーズを実行する 104 void FlowerSet::scoutBeePhase() 105 { 106 int i; 107 for (i=0;i<EBEE_NUM;i++){ 108 if(VISIT_MAX<=flower[i]->visitNum){ 109 flower[i]->renew(); 110 } 111 } 112 } 113 114 //最良食糧源を記録する 115 void FlowerSet::saveBestPos() 116 { 117 int i,best; 118 119 best= -1; 120 for(i=0;i<EBEE_NUM;i++){ 121 if(bestValue>flower[i]->value){ 122 best=i; 123 } 124 } 125 if(best!=-1){ 126 for(i=0;i<dataset->exVarNum;i++){ 127 bestPos[i]=flower[best]->value; 128 } 129 bestValue=flower[best]->value; 130 } 131 } 132 //結果を表示する 133 void FlowerSet::printResult() 134 { 135 dataset->setCoef(bestPos); 136 dataset->printEquation(); 137 } 138 139 140
Flower
1//Flower.h 2#ifndef INCLUDED_FLOWER 3#define INCLUDED_FLOWER 4#include "DataSet.h" 5#include "FlowerSet.h" 6#pragma once 7class FlowerSet; 8 9//定数の定義 10#define REPEAT_NUM 1000 //繰り返し数 11#define EBEE_NUM 100 //収穫蜂の数 12#define OBEE_NUM 10 //追従蜂の数 13#define VISIT_MAX 10 //蜜の採取可能回数 14#define COEF_MIN -1 //標準偏回帰係数の最小値 15#define COEF_MAX 1 //標準偏回帰係数の最大値 16 17//0以上1以下の実数乱数 18#define RAND_01 ((double)rand() / RAND_MAX) 19 20class Flower{ 21public: 22 Flower(FlowerSet *argFSet); 23 ~Flower(); 24 void change(int base); //近くの食糧源に変更する 25 void renew();//新しい食糧源に変更する. 26 27 FlowerSet *fSet; //属している食糧源集合 28 double *pos; //位置 29 double value;//評価値 30 int visitNum;//蜜の採取回数 31 32private: 33 void evaluate();//評価値を算出する 34}; 35#endif
Flower
1//Flower.cpp 2#include "Flower.h" 3#pragma once 4 5//コントラスた 6//argFSet:属している食糧源集合 7 8Flower::Flower(FlowerSet *argFSet){ 9 int i; 10 11 fSet=argFSet; 12 pos=new double[fSet->dataset->exVarNum]; 13 for(i=0;i<fSet->dataset->exVarNum;i++){ 14 pos[i]=COEF_MIN+(COEF_MAX-COEF_MIN)*RAND_01; 15 } 16 visitNum=0; 17 evaluate(); 18} 19 20//デストラクタ 21Flower::~Flower(){ 22 delete[]pos; 23} 24//baseの近くの食糧源に変更する 25//base:元にする食糧源の添字 26void Flower::change(int base){ 27 int i,j; 28 29 for(i=0;i<fSet->dataset->exVarNum;i++){ 30 pos[i]=fSet->flower[base]->pos[i]; 31 } 32 i=rand() % fSet->dataset->exVarNum; 33 j=(base+(rand() % (EBEE_NUM-1)+1)) % EBEE_NUM; 34 pos[i]=pos[i]+(rand() / (RAND_MAX/2.0)-1)*(pos[i]-fSet->flower[j]->pos[i]); 35 visitNum=0; 36 evaluate(); 37} 38 39//新しい食糧源に変更する 40void Flower::renew(){ 41 int i; 42 for(i=0;i<fSet->dataset->exVarNum;i++){ 43 pos[i]=COEF_MIN+(COEF_MAX - COEF_MIN)*RAND_01; 44 } 45 visitNum=0; 46 evaluate(); 47} 48 49//評価値を算出する 50void Flower::evaluate(){ 51 int i,j; 52 double diff; 53 54 value=0.0; 55 for(i=0;i<fSet->dataset->dataNum;i++){ 56 diff=fSet->dataset->resSData[i]; 57 for(j=0;j<fSet->dataset->exSData[i][j];j++){ 58 diff -= pos[j]*fSet->dataset->exSData[i][j]; 59 } 60 value += pow(diff,2.0); 61 } 62} 63
FlowerSet
1//FlowerSet.h 2#ifndef INCLUDED_FLOWERSET 3#define INCLUDE_FLOWERSET 4#include "Flower.h" 5#pragma once 6class Flower; 7 8class FlowerSet 9{ 10public: 11 FlowerSet(char *filename); 12 ~FlowerSet(); 13 void employedBeePhase(); //収穫蜂フェーズを実行する 14 void onlockerBeePhase();//追従蜂フェーズを実行する 15 void scoutBeePhase();//偵察蜂フェーズを実行する. 16 void saveBestPos();//最良食糧源を記録する. 17 void printResult();//結果を表示する. 18 19 Dataset *dataset;//データセット 20 Flower **flower;//食糧源の集合のメンバ 21 double *bestPos;//最良食糧源の位置 22 double bestValue;//最良食糧源の評価値 23 24private: 25 Flower *newFlower; //新しい食糧源 26 double *trValue; //格食糧源の変換後の評価値 27}; 28 29#endif 30 31
試したこと
著書には載っていませんでしたがインクルードガードなどは行いました
補足情報(FW/ツールのバージョンなど)
環境は
macbook pro macOS BigSur ver.11.4
コンパイラ環境はEmacsです
回答3件
あなたの回答
tips
プレビュー