소스 검색

[programming challenge, SSN] neural network's code seems to be more or less complete; not tested though

mateuszb 13 년 전
부모
커밋
cc9823bd73
1개의 변경된 파일72개의 추가작업 그리고 46개의 파일을 삭제
  1. 72 46
      Odpalarka/main.cpp

+ 72 - 46
Odpalarka/main.cpp

@@ -91,7 +91,7 @@ double cmpArtSets(DuelParameters dp, TArtSet setL, TArtSet setR)
 	return battleOutcome;
 }
 
-std::vector<CArtifactInstance*> genArts()
+std::vector<CArtifactInstance*> genArts(const std::vector<Bonus> & bonusesToGive)
 {
 	std::vector<CArtifactInstance*> ret;
 
@@ -101,31 +101,41 @@ std::vector<CArtifactInstance*> genArts()
 	nowy->constituentOf = nowy->constituents = NULL;
 	nowy->possibleSlots.push_back(Arts::LEFT_HAND);
 
-	CArtifactInstance *artinst = new CArtifactInstance(nowy);
-	auto &arts = VLC->arth->artifacts;
-	CArtifactInstance *inny = new CArtifactInstance(VLC->arth->artifacts[15]);
 
-	artinst->addNewBonus(new Bonus(Bonus::PERMANENT, Bonus::PRIMARY_SKILL, Bonus::ARTIFACT_INSTANCE, +25, nowy->id, PrimarySkill::ATTACK));
-	artinst->addNewBonus(new Bonus(Bonus::PERMANENT, Bonus::PRIMARY_SKILL, Bonus::ARTIFACT_INSTANCE, +25, nowy->id, PrimarySkill::DEFENSE));
-
-	auto bonuses = artinst->getBonuses([](const Bonus *){ return true; });
-	BOOST_FOREACH(Bonus *b, *bonuses) 
+	BOOST_FOREACH(auto b, bonusesToGive)
 	{
-		std::cout << format("%s (%d) value:%d, description: %s\n") % bonusTypeToString(b->type) % b->subtype % b->val % b->Description();
+		CArtifactInstance *artinst = new CArtifactInstance(nowy);
+		auto &arts = VLC->arth->artifacts;
+		artinst->addNewBonus(new Bonus(b));
+		ret.push_back(artinst);
 	}
 
+// 	auto bonuses = artinst->getBonuses([](const Bonus *){ return true; });
+// 	BOOST_FOREACH(Bonus *b, *bonuses) 
+// 	{
+// 		std::cout << format("%s (%d) value:%d, description: %s\n") % bonusTypeToString(b->type) % b->subtype % b->val % b->Description();
+// 	}
+
 	return ret;
 }
 
 //returns how good the artifact is for the neural network
-double runSSN(FANN::neural_net & net, CArtifactInstance * inst)
+double runSSN(FANN::neural_net & net, const DuelParameters dp, CArtifactInstance * inst)
 {
+	TArtSet setL, setR;
+	setL[inst->artType->possibleSlots[0]] = inst;
 
-	return 0.0;
+	double resultLR = cmpArtSets(dp, setL, setR),
+		resultRL = cmpArtSets(dp, setR, setL),
+		resultsBase = cmpArtSets(dp, TArtSet(), TArtSet());
+
+	double LRgain = resultLR - resultsBase,
+		RLgain = resultRL - resultsBase;
+	return LRgain+RLgain;
 }
 
 
-const unsigned int num_input = 2;
+const unsigned int num_input = 16;
 
 double * genSSNinput(const DuelParameters & dp, CArtifactInstance * art)
 {
@@ -170,15 +180,31 @@ double * genSSNinput(const DuelParameters & dp, CArtifactInstance * art)
 	}
 
 	//bonus description
+	auto & blist = art->getBonusList();
+	
+	*(cur++) = art->Attack();
+	*(cur++) = art->Defense();
+	*(cur++) = blist.valOfBonuses(Selector::type(Bonus::STACKS_SPEED));
+	*(cur++) = blist.valOfBonuses(Selector::type(Bonus::STACK_HEALTH));
 
 	return ret;
 }
 
-void learnSSN(FANN::neural_net & net, const DuelParameters & dp, CArtifactInstance * art, double desiredVal)
+void learnSSN(FANN::neural_net & net, const std::vector<std::pair<DuelParameters, CArtifactInstance *> > & input)
 {
-	double * input = genSSNinput(dp, art);
-	net.train(input, &desiredVal);
-	delete input;
+	FANN::training_data td;
+
+	double ** inputs = new double *[input.size()];
+	double ** outputs = new double *[input.size()];
+	for(int i=0; i<input.size(); ++i)
+	{
+		inputs[i] = genSSNinput(input[i].first, input[i].second);
+		outputs[i] = new double;
+		*(outputs[i]) = runSSN(net, input[i].first, input[i].second);
+	}
+	td.set_train_data(input.size(), num_input, inputs, 1, outputs);
+	
+	net.train_epoch(td);
 }
 
 void initNet(FANN::neural_net & ret)
@@ -206,7 +232,6 @@ void initNet(FANN::neural_net & ret)
 
 void SSNRun()
 {
-	auto availableArts = genArts();
 	std::vector<std::pair<CArtifactInstance *, double> > artNotes;
 
 	TArtSet setL, setR;
@@ -214,27 +239,27 @@ void SSNRun()
 	FANN::neural_net network;
 	initNet(network);
 
-	for(int i=0; i<availableArts.size(); ++i)
-	{
-		artNotes.push_back(std::make_pair(availableArts[i], runSSN(network, availableArts[i])));
-	}
-	boost::range::sort(artNotes,
-		[](const std::pair<CArtifactInstance *, double> & a1, const std::pair<CArtifactInstance *, double> & a2)
-		{return a1.second > a2.second;});
-
-	//pick best arts into setL
-	BOOST_FOREACH(auto & ap, artNotes)
-	{
-		auto art = ap.first;
-		BOOST_FOREACH(auto slot, art->artType->possibleSlots)
-		{
-			if(setL.find(slot) != setL.end())
-			{
-				setL[slot] = art;
-				break;
-			}
-		}
-	}
+// 	for(int i=0; i<availableArts.size(); ++i)
+// 	{
+// 		artNotes.push_back(std::make_pair(availableArts[i], runSSN(network, availableArts[i])));
+// 	}
+// 	boost::range::sort(artNotes,
+// 		[](const std::pair<CArtifactInstance *, double> & a1, const std::pair<CArtifactInstance *, double> & a2)
+// 		{return a1.second > a2.second;});
+// 
+// 	//pick best arts into setL
+// 	BOOST_FOREACH(auto & ap, artNotes)
+// 	{
+// 		auto art = ap.first;
+// 		BOOST_FOREACH(auto slot, art->artType->possibleSlots)
+// 		{
+// 			if(setL.find(slot) != setL.end())
+// 			{
+// 				setL[slot] = art;
+// 				break;
+// 			}
+// 		}
+// 	}
 
 
 	//duels to test on
@@ -274,17 +299,18 @@ void SSNRun()
 
 	}
 
+	auto arts = genArts(btt);
+
 	//evaluate
+	std::vector<std::pair<DuelParameters, CArtifactInstance *> > setups;
 	for(int i=0; i<dps.size(); ++i)
 	{
-		auto & dp = dps[i];
-		double resultLR = cmpArtSets(dp, setL, setR),
-			resultRL = cmpArtSets(dp, setR, setL),
-			resultsBase = cmpArtSets(dp, TArtSet(), TArtSet());
-
-		double LRgain = resultLR - resultsBase,
-			RLgain = resultRL - resultsBase;
+		for(int j=0; j<arts.size(); ++j)
+		{
+			setups.push_back(std::make_pair(dps[i], arts[j]));
+		}
 	}
+	learnSSN(network, setups);
 }
 
 int main(int argc, char **argv)