forked from s425077/PotatoPlan
fixing
This commit is contained in:
parent
49182f0fd0
commit
34233f92d2
@ -248,7 +248,7 @@ class Crops
|
|||||||
overhead = 0.0f;
|
overhead = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = (1.0f - productionRate) * 2;
|
r = (1.0f - productionRate) * 4;
|
||||||
g = 0.0f + productionRate;
|
g = 0.0f + productionRate;
|
||||||
b = 0.0f + (float)Math.Pow((double)overhead * 10, 2);
|
b = 0.0f + (float)Math.Pow((double)overhead * 10, 2);
|
||||||
a = 255;
|
a = 255;
|
||||||
@ -277,6 +277,11 @@ class Crops
|
|||||||
return ProductionRate;
|
return ProductionRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public float getProductionRate()
|
||||||
|
{
|
||||||
|
return ProductionRate;
|
||||||
|
}
|
||||||
|
|
||||||
public float compareToDatset(float i, float j)
|
public float compareToDatset(float i, float j)
|
||||||
{
|
{
|
||||||
if (i < j)
|
if (i < j)
|
||||||
|
@ -12,6 +12,7 @@ class Farm
|
|||||||
private Random r;
|
private Random r;
|
||||||
private CropTypesHolder PresetCrops = new CropTypesHolder();
|
private CropTypesHolder PresetCrops = new CropTypesHolder();
|
||||||
private int Update;
|
private int Update;
|
||||||
|
private Astar astar = new Astar();
|
||||||
|
|
||||||
|
|
||||||
//initializes the crops
|
//initializes the crops
|
||||||
@ -41,6 +42,24 @@ class Farm
|
|||||||
crops[i, j].init();
|
crops[i, j].init();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
int dirtCount = 0;
|
||||||
|
for (int i = 0; i < 99; i++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < 99; j++)
|
||||||
|
{
|
||||||
|
if (crops[i, j].getStatus() == 2)
|
||||||
|
{
|
||||||
|
dirtCount++;
|
||||||
|
if (!astar.isReachable(crops, new Vector2((int)i, (int)j), housepos))
|
||||||
|
{
|
||||||
|
crops[i, j].setStatus(1);
|
||||||
|
dirtCount--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (dirtCount == 0)
|
||||||
|
init(Size, housepos);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateFarm(Vector2 Size)
|
public void updateFarm(Vector2 Size)
|
||||||
|
@ -11,12 +11,12 @@ using Microsoft.ML.Trainers.LightGbm;
|
|||||||
class MLModel
|
class MLModel
|
||||||
{
|
{
|
||||||
private static MLContext mlContext = new MLContext(seed: 1);
|
private static MLContext mlContext = new MLContext(seed: 1);
|
||||||
private static string path = "C:/Users/Joel/source/repos/Oskars Repo/Game1/Content/ML/Fertilizer_Prediction.csv";
|
private static string path = "C:/Users/Oskar/source/repos/PotatoPlanFinal/Game1/Content/ML/Fertilizer_Prediction.csv";
|
||||||
private static string modelpath = "C:/Users/Joel/source/repos/Oskars Repo/Game1/Content/ML/MLmodel";
|
private static string modelpath = "C:/Users/Oskar/source/repos/PotatoPlanFinal/Game1/Content/ML/MLmodel";
|
||||||
private static string report = "C:/Users/Joel/source/repos/Oskars Repo/Game1/Content/ML/report";
|
private static string report = "C:/Users/Oskar/source/repos/PotatoPlanFinal/Game1/Content/ML/report";
|
||||||
private static string pathBig = "C:/Users/Joel/source/repos/Oskars Repo/Game1/Content/ML/BigFertPredict.csv";
|
private static string pathBig = "C:/Users/Oskar/source/repos/PotatoPlanFinal/Game1/Content/ML/BigFertPredict.csv";
|
||||||
private static string modelpathBig = "C:/Users/Joel/source/repos/Oskars Repo/Game1/Content/ML/MLmodelBig";
|
private static string modelpathBig = "C:/Users/Oskar/source/repos/PotatoPlanFinal/Game1/Content/ML/MLmodelBig";
|
||||||
private static string reportBig = "C:/Users/Joel/source/repos/Oskars Repo/Game1/Content/ML/report_BigModel";
|
private static string reportBig = "C:/Users/Oskar/source/repos/PotatoPlanFinal/Game1/Content/ML/report_BigModel";
|
||||||
|
|
||||||
// Loading data, creatin and saving ML model for smaller dataset (100)
|
// Loading data, creatin and saving ML model for smaller dataset (100)
|
||||||
public static void CreateModel()
|
public static void CreateModel()
|
||||||
|
@ -42,9 +42,9 @@ class Astar
|
|||||||
var adjacentNodes = new List<Nodes>()
|
var adjacentNodes = new List<Nodes>()
|
||||||
|
|
||||||
{
|
{
|
||||||
new Nodes(new Vector2(currentPos.X, currentPos.Y+1), 0),
|
new Nodes(new Vector2(currentPos.X, currentPos.Y - 1), 0),
|
||||||
new Nodes(new Vector2(currentPos.X + 1, currentPos.Y), 1),
|
new Nodes(new Vector2(currentPos.X + 1, currentPos.Y), 1),
|
||||||
new Nodes(new Vector2(currentPos.X, currentPos.Y - 1), 2),
|
new Nodes(new Vector2(currentPos.X, currentPos.Y + 1), 2),
|
||||||
new Nodes(new Vector2(currentPos.X - 1, currentPos.Y), -1),
|
new Nodes(new Vector2(currentPos.X - 1, currentPos.Y), -1),
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -163,4 +163,65 @@ class Astar
|
|||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool isReachable(Crops[,] crops, Vector2 targetPos, Vector2 start)
|
||||||
|
{
|
||||||
|
Rotation = 0;
|
||||||
|
int g = 0;
|
||||||
|
int direction = ConvertRotation();
|
||||||
|
Path path = new Path();
|
||||||
|
MinHeap openList = new MinHeap();
|
||||||
|
MinHeap closedList = new MinHeap();
|
||||||
|
Nodes target = new Nodes(targetPos);
|
||||||
|
Nodes startPos = new Nodes(tractorPos, direction);
|
||||||
|
Nodes current = null;
|
||||||
|
|
||||||
|
openList.Insert(startPos);
|
||||||
|
|
||||||
|
while (openList.GetSize() > 0)
|
||||||
|
{
|
||||||
|
current = openList.getMin();
|
||||||
|
closedList.Insert(current);
|
||||||
|
openList.removeMin();
|
||||||
|
direction = current.getDirection();
|
||||||
|
|
||||||
|
if (current.getCords() == target.getCords())
|
||||||
|
break;
|
||||||
|
|
||||||
|
var adjacentNodes = GetAdjacentNodes(current.getCords());
|
||||||
|
foreach (var adjacentNode in adjacentNodes)
|
||||||
|
{
|
||||||
|
if (closedList.Exists(adjacentNode.getCords())) // check if adjacent node is on closed list, if it is, skip it
|
||||||
|
continue;
|
||||||
|
g = current.getG() + crops[(int)adjacentNode.getCords().X, (int)adjacentNode.getCords().Y].getCostOnMovement() + CalculateRotationCost(direction, adjacentNode.getDirection()); // calculate g - cost from start point
|
||||||
|
if (!(openList.Exists(adjacentNode.getCords()))) // if adjacent node is not on open list, add it
|
||||||
|
{
|
||||||
|
adjacentNode.setG(g);
|
||||||
|
adjacentNode.setH(ComputeHScore(adjacentNode.getCords(), target.getCords()));
|
||||||
|
adjacentNode.calculateF();
|
||||||
|
adjacentNode.setParent(current);
|
||||||
|
openList.Insert(adjacentNode);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (g + adjacentNode.getH() < adjacentNode.getF()) // check if adjacent node is a better path than the current one
|
||||||
|
{
|
||||||
|
adjacentNode.setG(g);
|
||||||
|
adjacentNode.calculateF();
|
||||||
|
adjacentNode.setParent(current);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
openList.deleteHeap();
|
||||||
|
closedList.deleteHeap();
|
||||||
|
|
||||||
|
if (current.getCords() != targetPos)
|
||||||
|
return false;
|
||||||
|
else
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
@ -54,10 +54,12 @@ class AI
|
|||||||
int testsize = 2;
|
int testsize = 2;
|
||||||
Path newTarget;
|
Path newTarget;
|
||||||
Nodes nodes;
|
Nodes nodes;
|
||||||
|
|
||||||
if (astar.GetAdjacentNodes(tractorPos).Count == 0)
|
if (astar.GetAdjacentNodes(tractorPos).Count == 0)
|
||||||
nodes = new Nodes(housePos);
|
nodes = new Nodes(housePos);
|
||||||
else
|
else
|
||||||
nodes = astar.GetAdjacentNodes(tractorPos)[0];
|
nodes = astar.GetAdjacentNodes(tractorPos)[0];
|
||||||
|
|
||||||
if (tractorPos != housePos)
|
if (tractorPos != housePos)
|
||||||
if (inventory.getWeight() == inventory.getMaxWeight() || inventory.isMissingFertilizer())
|
if (inventory.getWeight() == inventory.getMaxWeight() || inventory.isMissingFertilizer())
|
||||||
{
|
{
|
||||||
@ -71,9 +73,9 @@ class AI
|
|||||||
{
|
{
|
||||||
if (farm.getCrop(x, y).getStatus() >= 2 && tractorPos != new Vector2(x, y))
|
if (farm.getCrop(x, y).getStatus() >= 2 && tractorPos != new Vector2(x, y))
|
||||||
{
|
{
|
||||||
if (farm.getCrop(x, y).getStatus() != 2 && (farm.getCrop(x, y).isSaturated(5) || !farm.getCrop(x, y).belowCapacity()))
|
if (farm.getCrop(x, y).getStatus() != 2 && (farm.getCrop(x, y).getProductionRate() > 0.99f || !farm.getCrop(x, y).belowCapacity()))
|
||||||
{
|
{
|
||||||
//do nothing
|
//skip growing fields with high production rate
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -84,22 +86,16 @@ class AI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (count > 0)
|
|
||||||
break;
|
break;
|
||||||
else if (queue.getCount() == 0)
|
|
||||||
{
|
|
||||||
astar.update(farm.getCrops(), Size, tractorPos, housePos, nodes.getCords(), Rotation);
|
|
||||||
return newTarget = astar.FindPath(true);
|
|
||||||
}
|
|
||||||
else //if (tractorPos != housePos)
|
|
||||||
return newTarget = GetMaxFNode(Math.Min(queue.getCount(), testsize), queue);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (queue.getCount() == 0)
|
if (queue.getCount() == 0)
|
||||||
{
|
{
|
||||||
astar.update(farm.getCrops(), Size, tractorPos, housePos, nodes.getCords(), Rotation);
|
astar.update(farm.getCrops(), Size, tractorPos, housePos, nodes.getCords(), Rotation);
|
||||||
return newTarget = astar.FindPath(true);
|
return newTarget = astar.FindPath(true);
|
||||||
}
|
}
|
||||||
newTarget = GetMinFNode(Math.Min(testsize, count), queue);
|
|
||||||
|
newTarget = GetMinFNode(Math.Min(testsize, queue.getCount()), queue);
|
||||||
queue = null;
|
queue = null;
|
||||||
|
|
||||||
return newTarget;
|
return newTarget;
|
||||||
@ -115,12 +111,11 @@ class AI
|
|||||||
if (farm.getCrop(x, y).getStatus() >= 2)
|
if (farm.getCrop(x, y).getStatus() >= 2)
|
||||||
{
|
{
|
||||||
fertilizer = fertilizerHolder.GetFertilizer(Engine.PredictFertilizer(farm.getCrop(x, y), farm.getPresetCropTypes(farm.getCrop(x, y).getCropType())));
|
fertilizer = fertilizerHolder.GetFertilizer(Engine.PredictFertilizer(farm.getCrop(x, y), farm.getPresetCropTypes(farm.getCrop(x, y).getCropType())));
|
||||||
while (!(farm.getCrop(x, y).isSaturated()) && farm.getCrop(x, y).belowCapacity() && inventory.useItem(fertilizerHolder.GetFertilizerID(fertilizer.Name), 0))
|
while (!(farm.getCrop(x, y).isSaturated(-1)) && farm.getCrop(x, y).belowCapacity() && inventory.useItem(fertilizerHolder.GetFertilizerID(fertilizer.Name), 0))
|
||||||
{
|
{
|
||||||
farm.getCrop(x, y).Fertilize(fertilizer);
|
farm.getCrop(x, y).Fertilize(fertilizer);
|
||||||
fertilizer = fertilizerHolder.GetFertilizer(Engine.PredictFertilizer(farm.getCrop(x, y), farm.getPresetCropTypes(farm.getCrop(x, y).getCropType())));
|
fertilizer = fertilizerHolder.GetFertilizer(Engine.PredictFertilizer(farm.getCrop(x, y), farm.getPresetCropTypes(farm.getCrop(x, y).getCropType())));
|
||||||
WaitTwoFrames = true;
|
WaitTwoFrames = true;
|
||||||
//System.Threading.Thread.Sleep(5);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (farm.getCrop(x, y).getCropTimer() == 1)
|
if (farm.getCrop(x, y).getCropTimer() == 1)
|
||||||
@ -142,32 +137,29 @@ class AI
|
|||||||
|
|
||||||
private int calculateSoilScore(int x, int y)
|
private int calculateSoilScore(int x, int y)
|
||||||
{
|
{
|
||||||
int score = 0;
|
int score = 1;
|
||||||
int statusScore = 0;
|
int statusScore = 1;
|
||||||
int timerScore = 0;
|
int timerScore = 1;
|
||||||
int saturationScore = 0;
|
int saturationScore = 1;
|
||||||
|
int productionRateScore = 1;
|
||||||
int aproxDistance = (int)(Math.Abs(x - tractorPos.X) + Math.Abs(y - tractorPos.Y));
|
int aproxDistance = (int)(Math.Abs(x - tractorPos.X) + Math.Abs(y - tractorPos.Y));
|
||||||
CropTypesHolder holder = new CropTypesHolder();
|
|
||||||
holder.init();
|
|
||||||
|
|
||||||
Crops crop = farm.getCrop(x, y);
|
Crops crop = farm.getCrop(x, y);
|
||||||
SoilProperties soilP = crop.getSoilProperties();
|
|
||||||
int cropType = crop.getCropType();
|
int cropType = crop.getCropType();
|
||||||
CropTypes avgHold = holder.getPresetCropTypes(cropType);
|
|
||||||
|
|
||||||
if (crop.getStatus() == 2)
|
|
||||||
statusScore = 50;
|
|
||||||
else if (crop.getStatus() == 3)
|
|
||||||
statusScore = -100;
|
|
||||||
else
|
|
||||||
statusScore = 1;
|
|
||||||
|
|
||||||
if (crop.getCropTimer() == 1)
|
if (crop.getCropTimer() == 1)
|
||||||
timerScore = 100;
|
timerScore = 100;
|
||||||
else
|
|
||||||
statusScore = 0;
|
|
||||||
|
|
||||||
score = (int)(crop.getProductionRate(avgHold) * 10);
|
productionRateScore = (int)(crop.getProductionRate() * 25);
|
||||||
|
score = (int)(crop.getProductionRate() * -50);
|
||||||
|
|
||||||
|
if (crop.getStatus() == 2)
|
||||||
|
{
|
||||||
|
statusScore = 50;
|
||||||
|
productionRateScore = 0;
|
||||||
|
}
|
||||||
|
else if (crop.getStatus() == 3)
|
||||||
|
statusScore = -100;
|
||||||
|
|
||||||
if (!crop.isSaturated(2))
|
if (!crop.isSaturated(2))
|
||||||
saturationScore = 5;
|
saturationScore = 5;
|
||||||
|
Loading…
Reference in New Issue
Block a user