forked from Jaysyn/PRC8
188 lines
7.6 KiB
Java
188 lines
7.6 KiB
Java
|
package prc.utils;
|
||
|
|
||
|
import prc.autodoc.*;
|
||
|
|
||
|
import java.io.BufferedReader;
|
||
|
import java.io.File;
|
||
|
import java.io.FileReader;
|
||
|
import java.util.Random;
|
||
|
|
||
|
public final class NPCEvolve {
|
||
|
private NPCEvolve() {
|
||
|
}
|
||
|
|
||
|
private static final int countAreas = 5;
|
||
|
private static final int countClasses = 11;
|
||
|
private static final int countPackages = 10;
|
||
|
public static Random rng = new Random();
|
||
|
|
||
|
/**
|
||
|
* The main method, as usual.
|
||
|
*
|
||
|
* @param args do I really need to explain this?
|
||
|
* @throws Exception this is a simple tool, just let all failures blow up
|
||
|
*/
|
||
|
public static void main(String[] args) throws Exception {
|
||
|
if (args.length < 3 || args[0].equals("--help") || args[0].equals("-?"))
|
||
|
readMe();
|
||
|
|
||
|
String logFilePath = args[0];
|
||
|
String packageFilePath = args[1];
|
||
|
String outputFilePath = args[2];
|
||
|
|
||
|
//this is the layout of the data string
|
||
|
//## id class0pack1 class0pack2 ... class10pack9 class10pack10 ##
|
||
|
//get the file
|
||
|
File logFile = new File(logFilePath);
|
||
|
BufferedReader reader = new BufferedReader(new FileReader(logFile));
|
||
|
//parse it
|
||
|
String line = reader.readLine();
|
||
|
int[][][] dataset = new int[countAreas][countClasses][countPackages];
|
||
|
int classID = 0;
|
||
|
int packageID = 0;
|
||
|
int areaID = 0;
|
||
|
int score = 0;
|
||
|
int countArea = 0;
|
||
|
while (line != null) {
|
||
|
if (line.matches("## ([0-9]*) [0-9 ]* ##")) {
|
||
|
areaID = new Integer(line.substring(4, 6));
|
||
|
//remove the +1 offset
|
||
|
areaID--;
|
||
|
//store highest area value
|
||
|
if (areaID > countArea)
|
||
|
countArea = areaID;
|
||
|
classID = 0;
|
||
|
packageID = 0;
|
||
|
line = line.substring(7, line.length() - 3);
|
||
|
String[] splitline = line.split(" ");
|
||
|
for (int i = 0; i < splitline.length; i++) {
|
||
|
score = new Integer(splitline[i]);
|
||
|
dataset[areaID][classID][packageID] = new Integer(splitline[i]);
|
||
|
//System.out.println("dataset["+areaID+"]["+classID+"]["+packageID+"] = "+dataset[areaID][classID][packageID]);
|
||
|
//move to next slot
|
||
|
packageID++;
|
||
|
if (packageID >= countPackages) {
|
||
|
packageID -= countPackages;
|
||
|
classID++;
|
||
|
if (classID >= countClasses)
|
||
|
classID -= countClasses;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
line = reader.readLine();
|
||
|
}
|
||
|
//At this point, we have a big dataset with the most recent
|
||
|
//scores for each area for each class/package combination
|
||
|
//First step is to consolidate this to an average
|
||
|
int[][] data = new int[countClasses][countPackages];
|
||
|
for (classID = 0; classID < countClasses; classID++) {
|
||
|
for (packageID = 0; packageID < countPackages; packageID++) {
|
||
|
//reset score to zero
|
||
|
score = 0;
|
||
|
for (areaID = 0; areaID < countArea; areaID++) {
|
||
|
score += dataset[areaID][classID][packageID];
|
||
|
}
|
||
|
data[classID][packageID] = score / countArea;
|
||
|
System.out.println("data[" + classID + "][" + packageID + "] = " + data[classID][packageID]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//now we know what each packageset scored, go through each class and cross the best 2 to
|
||
|
//make the next generation
|
||
|
for (classID = 0; classID < countClasses; classID++) {
|
||
|
int packageMother = 0;
|
||
|
int packageFather = 0;
|
||
|
int scoreMother = 0;
|
||
|
int scoreFather = 0;
|
||
|
for (packageID = 0; packageID < countPackages; packageID++) {
|
||
|
score = data[classID][packageID];
|
||
|
if (score > scoreMother) {
|
||
|
scoreFather = scoreMother;
|
||
|
scoreMother = score;
|
||
|
packageFather = packageMother;
|
||
|
packageMother = packageID;
|
||
|
} else if (score > scoreFather) {
|
||
|
scoreFather = score;
|
||
|
packageFather = packageID;
|
||
|
}
|
||
|
}
|
||
|
//now we have a mother and a father packageset
|
||
|
//remember, these are sets of packages, not the actual packages themselves
|
||
|
//load the 2das
|
||
|
String filename = "";
|
||
|
filename = "evopset_" + classID + "_";
|
||
|
//if(packageMother<10)
|
||
|
// filename += "0";
|
||
|
filename += "" + packageMother;
|
||
|
Data_2da motherpackset2da = Data_2da.load2da(packageFilePath + File.separator + filename + ".2da");
|
||
|
filename = "evopset_" + classID + "_";
|
||
|
//if(packageFather<10)
|
||
|
// filename += "0";
|
||
|
filename += "" + packageFather;
|
||
|
Data_2da fatherpackset2da = Data_2da.load2da(packageFilePath + File.separator + filename + ".2da");
|
||
|
//create the output 2das
|
||
|
for (int i = 0; i < countPackages; i++) {
|
||
|
filename = "evopset_" + classID + "_";
|
||
|
//if(i<10)
|
||
|
// filename += "0";
|
||
|
filename += i;
|
||
|
Data_2da offspringpackset2da = new Data_2da(filename);
|
||
|
offspringpackset2da.addColumn("PackOffset");
|
||
|
int parentToUse = 1;
|
||
|
for (int row = 0; row < 40; row++) {
|
||
|
offspringpackset2da.appendRow();
|
||
|
//1 in 10 chance to flip between parents
|
||
|
if (rng.nextInt(10) == 0) {
|
||
|
if (parentToUse == 1)
|
||
|
parentToUse = 2;
|
||
|
else if (parentToUse == 2)
|
||
|
parentToUse = 1;
|
||
|
}
|
||
|
if (parentToUse == 1) {
|
||
|
//copy from mother
|
||
|
String value = motherpackset2da.getEntry("PackOffset", row);
|
||
|
//mutation chance
|
||
|
if (rng.nextInt(10) == 0) {
|
||
|
value = "" + (rng.nextInt(10) + 1);
|
||
|
}
|
||
|
offspringpackset2da.setEntry("PackOffset", row, value);
|
||
|
} else if (parentToUse == 2) {
|
||
|
//copy from father
|
||
|
String value = fatherpackset2da.getEntry("PackOffset", row);
|
||
|
//mutation chance
|
||
|
if (rng.nextInt(10) == 0) {
|
||
|
value = "" + (rng.nextInt(10) + 1);
|
||
|
}
|
||
|
offspringpackset2da.setEntry("PackOffset", row, value);
|
||
|
}
|
||
|
}
|
||
|
//now write it to the disk
|
||
|
offspringpackset2da.save2da(outputFilePath);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
//pastebin for later ;)
|
||
|
//first thing is load the overall packages.2da file
|
||
|
//Data_2da packages2da = Data_2da.load2da(packageFilePath+File.separator+"packages.2da");
|
||
|
/*
|
||
|
//get the real package IDs
|
||
|
packageMother += (countPackages*classID);
|
||
|
packageFather += (countPackages*classID);
|
||
|
//EvoPSP
|
||
|
//EvoPFTBard01
|
||
|
//EvoPSP*/
|
||
|
|
||
|
private static void readMe() {
|
||
|
System.out.println("Usage:\n" +
|
||
|
"\tjava npcevol logfile packages\n" +
|
||
|
"\n" +
|
||
|
"This application is designed to take a logfile \n" +
|
||
|
"and parse it to extract relevant data.\n" +
|
||
|
"Then it will take some package 2da files\n" +
|
||
|
"and mutate them appropriately"
|
||
|
);
|
||
|
|
||
|
System.exit(0);
|
||
|
}
|
||
|
}
|