1
0
forked from s425077/PotatoPlan

updating dev branch

This commit is contained in:
BOTLester 2020-05-11 00:29:09 +02:00
commit 8c976c4beb
50 changed files with 5213 additions and 744 deletions

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,100 @@
Temparature,Humidity ,Moisture,Soil Type,Crop Type,Nitrogen,Potassium,Phosphorous,Fertilizer Name
26,52,38,Sandy,Maize,37,0,0,Urea
29,52,45,Loamy,Sugarcane,12,0,36,DAP
34,65,62,Black,Cotton,7,9,30,14-35-14
32,62,34,Red,Tobacco,22,0,20,28-28
28,54,46,Clayey,Paddy,35,0,0,Urea
26,52,35,Sandy,Barley,12,10,13,17-17-17
25,50,64,Red,Cotton,9,0,10,20-20
33,64,50,Loamy,Wheat,41,0,0,Urea
30,60,42,Sandy,Millets,21,0,18,28-28
29,58,33,Black,Oil seeds,9,7,30,14-35-14
27,54,28,Clayey,Pulses,13,0,40,DAP
31,62,48,Sandy,Maize,14,15,12,17-17-17
25,50,65,Loamy,Cotton,36,0,0,Urea
32,62,41,Clayey,Paddy,24,0,22,28-28
26,52,31,Red,Ground Nuts,14,0,41,DAP
31,62,49,Black,Sugarcane,10,13,14,17-17-17
33,64,34,Clayey,Pulses,38,0,0,Urea
25,50,39,Sandy,Barley,21,0,19,28-28
28,54,65,Black,Cotton,39,0,0,Urea
29,58,52,Loamy,Wheat,13,0,36,DAP
30,60,44,Sandy,Millets,10,0,9,20-20
34,65,53,Loamy,Sugarcane,12,14,12,17-17-17
35,68,33,Red,Tobacco,11,0,37,DAP
28,54,37,Black,Millets,36,0,0,Urea
33,64,39,Clayey,Paddy,13,0,10,20-20
26,52,44,Sandy,Maize,23,0,20,28-28
30,60,63,Red,Cotton,9,9,29,14-35-14
32,62,30,Loamy,Sugarcane,38,0,0,Urea
37,70,32,Black,Oil seeds,12,0,39,DAP
26,52,36,Clayey,Pulses,14,0,13,20-20
29,58,40,Red,Ground Nuts,24,0,23,28-28
30,60,27,Loamy,Sugarcane,12,0,40,DAP
34,65,38,Clayey,Paddy,39,0,0,Urea
36,68,38,Sandy,Barley,7,9,30,14-35-14
26,52,48,Loamy,Wheat,23,0,19,28-28
28,54,35,Black,Millets,41,0,0,Urea
30,60,61,Loamy,Cotton,8,10,31,14-35-14
37,70,37,Clayey,Paddy,12,0,41,DAP
25,50,26,Red,Ground Nuts,15,14,11,17-17-17
29,58,34,Sandy,Millets,15,0,37,DAP
27,54,30,Clayey,Pulses,13,0,13,20-20
30,60,58,Loamy,Sugarcane,10,7,32,14-35-14
32,62,34,Red,Tobacco,22,0,24,28-28
34,65,60,Black,Sugarcane,35,0,0,Urea
35,67,42,Sandy,Barley,10,0,35,DAP
38,70,48,Loamy,Wheat,8,8,28,14-35-14
26,52,32,Black,Oil seeds,12,0,8,20-20
29,58,43,Clayey,Paddy,24,0,18,28-28
30,60,29,Red,Ground Nuts,41,0,0,Urea
33,64,51,Sandy,Maize,5,9,29,14-35-14
34,65,31,Red,Tobacco,23,0,21,28-28
36,68,33,Black,Oil seeds,13,0,14,20-20
28,54,38,Clayey,Pulses,40,0,0,Urea
30,60,47,Sandy,Barley,12,0,42,DAP
31,62,63,Red,Cotton,11,12,15,17-17-17
27,53,43,Black,Millets,23,0,24,28-28
34,65,54,Loamy,Wheat,38,0,0,Urea
29,58,37,Sandy,Millets,8,0,15,20-20
25,50,56,Loamy,Sugarcane,11,13,15,17-17-17
32,62,34,Red,Ground Nuts,15,0,37,DAP
28,54,41,Clayey,Paddy,36,0,0,Urea
30,60,49,Loamy,Wheat,13,0,9,20-20
34,65,64,Black,Cotton,24,0,20,28-28
28,54,47,Sandy,Barley,5,18,15,10-26-26
27,53,35,Black,Oil seeds,37,0,0,Urea
36,68,62,Red,Cotton,15,0,40,DAP
34,65,57,Black,Sugarcane,9,0,13,20-20
29,58,55,Loamy,Sugarcane,8,8,33,14-35-14
25,50,40,Clayey,Pulses,6,19,16,10-26-26
30,60,38,Sandy,Millets,10,0,14,20-20
26,52,39,Clayey,Pulses,21,0,23,28-28
31,62,32,Red,Tobacco,39,0,0,Urea
34,65,48,Loamy,Wheat,23,0,19,28-28
27,53,34,Black,Oil seeds,42,0,0,Urea
33,64,31,Red,Ground Nuts,13,0,39,DAP
29,58,42,Clayey,Paddy,9,10,22,14-35-14
30,60,47,Sandy,Maize,22,0,21,28-28
27,53,59,Loamy,Sugarcane,10,0,15,20-20
26,52,36,Clayey,Pulses,7,16,20,10-26-26
34,65,63,Red,Cotton,14,0,38,DAP
28,54,43,Clayey,Paddy,10,8,29,14-35-14
30,60,40,Sandy,Millets,41,0,0,Urea
29,58,65,Black,Cotton,14,0,35,DAP
26,52,59,Loamy,Sugarcane,11,0,9,20-20
31,62,44,Sandy,Barley,21,0,28,28-28
35,67,28,Clayey,Pulses,8,7,31,14-35-14
29,58,30,Red,Tobacco,13,17,16,10-26-26
27,53,30,Black,Millets,35,0,0,Urea
36,68,50,Loamy,Wheat,12,18,19,10-26-26
29,58,61,Loamy,Cotton,11,0,38,DAP
30,60,26,Black,Oil seeds,8,9,30,14-35-14
34,65,45,Clayey,Paddy,6,19,21,10-26-26
36,68,41,Red,Ground Nuts,41,0,0,Urea
28,54,25,Sandy,Maize,9,10,30,14-35-14
25,50,32,Clayey,Pulses,24,0,19,28-28
30,60,27,Red,Tobacco,4,17,17,10-26-26
38,72,51,Loamy,Wheat,39,0,0,Urea
36,60,43,Sandy,Millets,15,0,41,DAP
29,58,57,Black,Sugarcane,12,0,10,20-20
1 Temparature Humidity Moisture Soil Type Crop Type Nitrogen Potassium Phosphorous Fertilizer Name
2 26 52 38 Sandy Maize 37 0 0 Urea
3 29 52 45 Loamy Sugarcane 12 0 36 DAP
4 34 65 62 Black Cotton 7 9 30 14-35-14
5 32 62 34 Red Tobacco 22 0 20 28-28
6 28 54 46 Clayey Paddy 35 0 0 Urea
7 26 52 35 Sandy Barley 12 10 13 17-17-17
8 25 50 64 Red Cotton 9 0 10 20-20
9 33 64 50 Loamy Wheat 41 0 0 Urea
10 30 60 42 Sandy Millets 21 0 18 28-28
11 29 58 33 Black Oil seeds 9 7 30 14-35-14
12 27 54 28 Clayey Pulses 13 0 40 DAP
13 31 62 48 Sandy Maize 14 15 12 17-17-17
14 25 50 65 Loamy Cotton 36 0 0 Urea
15 32 62 41 Clayey Paddy 24 0 22 28-28
16 26 52 31 Red Ground Nuts 14 0 41 DAP
17 31 62 49 Black Sugarcane 10 13 14 17-17-17
18 33 64 34 Clayey Pulses 38 0 0 Urea
19 25 50 39 Sandy Barley 21 0 19 28-28
20 28 54 65 Black Cotton 39 0 0 Urea
21 29 58 52 Loamy Wheat 13 0 36 DAP
22 30 60 44 Sandy Millets 10 0 9 20-20
23 34 65 53 Loamy Sugarcane 12 14 12 17-17-17
24 35 68 33 Red Tobacco 11 0 37 DAP
25 28 54 37 Black Millets 36 0 0 Urea
26 33 64 39 Clayey Paddy 13 0 10 20-20
27 26 52 44 Sandy Maize 23 0 20 28-28
28 30 60 63 Red Cotton 9 9 29 14-35-14
29 32 62 30 Loamy Sugarcane 38 0 0 Urea
30 37 70 32 Black Oil seeds 12 0 39 DAP
31 26 52 36 Clayey Pulses 14 0 13 20-20
32 29 58 40 Red Ground Nuts 24 0 23 28-28
33 30 60 27 Loamy Sugarcane 12 0 40 DAP
34 34 65 38 Clayey Paddy 39 0 0 Urea
35 36 68 38 Sandy Barley 7 9 30 14-35-14
36 26 52 48 Loamy Wheat 23 0 19 28-28
37 28 54 35 Black Millets 41 0 0 Urea
38 30 60 61 Loamy Cotton 8 10 31 14-35-14
39 37 70 37 Clayey Paddy 12 0 41 DAP
40 25 50 26 Red Ground Nuts 15 14 11 17-17-17
41 29 58 34 Sandy Millets 15 0 37 DAP
42 27 54 30 Clayey Pulses 13 0 13 20-20
43 30 60 58 Loamy Sugarcane 10 7 32 14-35-14
44 32 62 34 Red Tobacco 22 0 24 28-28
45 34 65 60 Black Sugarcane 35 0 0 Urea
46 35 67 42 Sandy Barley 10 0 35 DAP
47 38 70 48 Loamy Wheat 8 8 28 14-35-14
48 26 52 32 Black Oil seeds 12 0 8 20-20
49 29 58 43 Clayey Paddy 24 0 18 28-28
50 30 60 29 Red Ground Nuts 41 0 0 Urea
51 33 64 51 Sandy Maize 5 9 29 14-35-14
52 34 65 31 Red Tobacco 23 0 21 28-28
53 36 68 33 Black Oil seeds 13 0 14 20-20
54 28 54 38 Clayey Pulses 40 0 0 Urea
55 30 60 47 Sandy Barley 12 0 42 DAP
56 31 62 63 Red Cotton 11 12 15 17-17-17
57 27 53 43 Black Millets 23 0 24 28-28
58 34 65 54 Loamy Wheat 38 0 0 Urea
59 29 58 37 Sandy Millets 8 0 15 20-20
60 25 50 56 Loamy Sugarcane 11 13 15 17-17-17
61 32 62 34 Red Ground Nuts 15 0 37 DAP
62 28 54 41 Clayey Paddy 36 0 0 Urea
63 30 60 49 Loamy Wheat 13 0 9 20-20
64 34 65 64 Black Cotton 24 0 20 28-28
65 28 54 47 Sandy Barley 5 18 15 10-26-26
66 27 53 35 Black Oil seeds 37 0 0 Urea
67 36 68 62 Red Cotton 15 0 40 DAP
68 34 65 57 Black Sugarcane 9 0 13 20-20
69 29 58 55 Loamy Sugarcane 8 8 33 14-35-14
70 25 50 40 Clayey Pulses 6 19 16 10-26-26
71 30 60 38 Sandy Millets 10 0 14 20-20
72 26 52 39 Clayey Pulses 21 0 23 28-28
73 31 62 32 Red Tobacco 39 0 0 Urea
74 34 65 48 Loamy Wheat 23 0 19 28-28
75 27 53 34 Black Oil seeds 42 0 0 Urea
76 33 64 31 Red Ground Nuts 13 0 39 DAP
77 29 58 42 Clayey Paddy 9 10 22 14-35-14
78 30 60 47 Sandy Maize 22 0 21 28-28
79 27 53 59 Loamy Sugarcane 10 0 15 20-20
80 26 52 36 Clayey Pulses 7 16 20 10-26-26
81 34 65 63 Red Cotton 14 0 38 DAP
82 28 54 43 Clayey Paddy 10 8 29 14-35-14
83 30 60 40 Sandy Millets 41 0 0 Urea
84 29 58 65 Black Cotton 14 0 35 DAP
85 26 52 59 Loamy Sugarcane 11 0 9 20-20
86 31 62 44 Sandy Barley 21 0 28 28-28
87 35 67 28 Clayey Pulses 8 7 31 14-35-14
88 29 58 30 Red Tobacco 13 17 16 10-26-26
89 27 53 30 Black Millets 35 0 0 Urea
90 36 68 50 Loamy Wheat 12 18 19 10-26-26
91 29 58 61 Loamy Cotton 11 0 38 DAP
92 30 60 26 Black Oil seeds 8 9 30 14-35-14
93 34 65 45 Clayey Paddy 6 19 21 10-26-26
94 36 68 41 Red Ground Nuts 41 0 0 Urea
95 28 54 25 Sandy Maize 9 10 30 14-35-14
96 25 50 32 Clayey Pulses 24 0 19 28-28
97 30 60 27 Red Tobacco 4 17 17 10-26-26
98 38 72 51 Loamy Wheat 39 0 0 Urea
99 36 60 43 Sandy Millets 15 0 41 DAP
100 29 58 57 Black Sugarcane 12 0 10 20-20

BIN
Game1/Content/ML/MLmodel Normal file

Binary file not shown.

BIN
Game1/Content/ML/MLmodelBig Normal file

Binary file not shown.

3
Game1/Content/ML/report Normal file
View File

@ -0,0 +1,3 @@
Micro Accuracy: 0.95829
LogLoss Average: 0.100171
LogLoss Reduction: 0.933795

View File

@ -0,0 +1,3 @@
Micro Accuracy: 1
LogLoss Average: 0.002345
LogLoss Reduction: 0.998302

BIN
Game1/Content/MLmodel Normal file

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -63,9 +63,7 @@ namespace Game1
cropTypesNames[10] = "Tobacco";
cropTypesNames[11] = "Wheat";
Engine.init();
@ -260,7 +258,7 @@ namespace Game1
if ((tractorUnit.getFarm().getCrop(i, j).getStatus() == 3))
{
spriteBatch.Draw(ProgressionBar, new Rectangle(i * (input.getSpacingTile()) + input.getTileSize() - input.getTileSize() / 3, j * (input.getSpacingTile()), input.getTileSize() / 3, input.getTileSize()), Color.White);
spriteBatch.Draw(ProgressionBarStatus, new Rectangle(i * (input.getSpacingTile()) + input.getTileSize() - input.getTileSize() / 4, j * (input.getSpacingTile()) + input.getTileSize() / 3, input.getTileSize() / 4, tractorUnit.getFarm().getCrop(i, j).getCropTimerBar((input.getTileSize())) + 1), Color.White);
spriteBatch.Draw(ProgressionBarStatus, new Rectangle(i * (input.getSpacingTile()) + input.getTileSize() - input.getTileSize() / 4, j * (input.getSpacingTile()) + input.getTileSize() / 3, input.getTileSize() / 4, tractorUnit.getFarm().getCrop(i, j).getCropTimerBar((input.getTileSize())) + 1), new Color(tractorUnit.getFarm().getCrop(i, j).getColour()));
}
spriteBatch.Draw(Crops[tractorUnit.getFarm().getCrop(i, j).getCropType()], new Rectangle((int)(i * (input.getSpacingTile()) + input.getTileSize() - input.getTileSize() / 2.5), j * (input.getSpacingTile()), (int)(input.getTileSize() / 2.5), input.getTileSize() / 3), Color.White);
}

View File

@ -88,8 +88,21 @@
<Compile Include="Sources\Crops\CropType.cs" />
<Compile Include="Sources\Crops\CropTypesHolder.cs" />
<Compile Include="Sources\Crops\SoilProperties.cs" />
<Compile Include="Sources\ML\Engine.cs" />
<Compile Include="Sources\Objects\DayNightCycle.cs" />
<Compile Include="Sources\Objects\Fertilizer.cs" />
<Compile Include="Sources\Objects\FertilizerHolder.cs" />
<Compile Include="Sources\Objects\HandleRotation.cs" />
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Sources\ML\InOut\BigModelInput.cs" />
<Compile Include="Sources\ML\InOut\BigModelOutput.cs" />
<Compile Include="Sources\ML\MLModel.cs" />
<Compile Include="Sources\ML\InOut\ModelOutput.cs" />
<Compile Include="Sources\ML\InOut\ModelInput.cs" />
<Compile Include="Sources\Objects\House.cs" />
<Compile Include="Sources\Crops\Crops.cs" />
<Compile Include="Sources\Crops\Farm.cs" />
@ -130,11 +143,58 @@
<Content Include="Content\tileunplantable.png" />
<Content Include="Content\Tractor.png" />
<Content Include="Icon.ico" />
<None Include="Resources\TextFile1.txt" />
<None Include="Sources\ML\Data\FertPredictDataset.csv" />
</ItemGroup>
<ItemGroup>
<MonoGameContentReference Include="Content\Content.mgcb" />
<None Include="app.config" />
<None Include="app.manifest" />
<None Include="Sources\ML\Data\Fertilizer Prediction.csv" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<PackageReference Include="LightGBM">
<Version>2.3.1</Version>
</PackageReference>
<PackageReference Include="Microsoft.ML">
<Version>1.4.0</Version>
</PackageReference>
<PackageReference Include="Microsoft.ML.CpuMath">
<Version>1.4.0</Version>
</PackageReference>
<PackageReference Include="Microsoft.ML.FastTree">
<Version>1.4.0</Version>
</PackageReference>
<PackageReference Include="Microsoft.ML.LightGbm">
<Version>1.4.0</Version>
</PackageReference>
<PackageReference Include="Newtonsoft.Json">
<Version>12.0.3</Version>
</PackageReference>
<PackageReference Include="System.CodeDom">
<Version>4.7.0</Version>
</PackageReference>
<PackageReference Include="System.Collections.Immutable">
<Version>1.7.0</Version>
</PackageReference>
<PackageReference Include="System.Memory">
<Version>4.5.4</Version>
</PackageReference>
<PackageReference Include="System.Reflection.Emit.Lightweight">
<Version>4.7.0</Version>
</PackageReference>
<PackageReference Include="System.Runtime.CompilerServices.Unsafe">
<Version>4.7.1</Version>
</PackageReference>
<PackageReference Include="System.Threading.Tasks.Dataflow">
<Version>4.11.0</Version>
</PackageReference>
</ItemGroup>
<ItemGroup>
<PackageReference Include="C5">

84
Game1/Properties/Resources.Designer.cs generated Normal file
View File

@ -0,0 +1,84 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Game1.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Game1.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized string similar to Temparature,Humidity ,Moisture,Soil Type,Crop Type,Nitrogen,Potassium,Phosphorous,Fertilizer Name
///26,52,38,Sandy,Maize,37,0,0,Urea
///29,52,45,Loamy,Sugarcane,12,0,36,DAP
///34,65,62,Black,Cotton,7,9,30,14-35-14
///32,62,34,Red,Tobacco,22,0,20,28-28
///28,54,46,Clayey,Paddy,35,0,0,Urea
///26,52,35,Sandy,Barley,12,10,13,17-17-17
///25,50,64,Red,Cotton,9,0,10,20-20
///33,64,50,Loamy,Wheat,41,0,0,Urea
///30,60,42,Sandy,Millets,21,0,18,28-28
///29,58,33,Black,Oil seeds,9,7,30,14-35-14
///27,54,28,Clayey,Pulses,13,0,40,DAP
///31,62, [rest of string was truncated]&quot;;.
/// </summary>
internal static string Fertilizer_Prediction {
get {
return ResourceManager.GetString("Fertilizer_Prediction", resourceCulture);
}
}
}
}

View File

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="Fertilizer_Prediction" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\sources\ml\data\fertilizer prediction.csv;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
</data>
</root>

View File

View File

@ -1,46 +0,0 @@
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
class Crops
{
public int Status;
private int Timer;
private Random r;
public int x;
public int y;
public void updateCrop()
{
if (Status != 0)
{
Timer--;
}
}
public int getCropTimer()
{
return Timer;
}
public int getStatus()
{
return Status;
}
public void setStatus(int newStatus)
{
Status = newStatus;
}
public void setPosition(int newx, int newy)
{
x = newx;
y = newy;
}
}

View File

@ -11,6 +11,7 @@ class CropTypes
public string[] soilType = new string[3];
public int[] Times = new int[3];
public string CropName;
public float Temparature;
public float Humidity;
public float Moisture;

View File

@ -16,6 +16,7 @@ class CropTypesHolder
cropTypes[0].soilType[0] = "None";
cropTypes[0].soilType[1] = null;
cropTypes[0].soilType[2] = null;
cropTypes[0].CropName = "None";
cropTypes[0].Temparature = 0f;
cropTypes[0].Humidity = 0f;
cropTypes[0].Moisture = 0f;
@ -28,12 +29,13 @@ class CropTypesHolder
cropTypes[1].soilType[0] = "Sandy";
cropTypes[1].soilType[1] = null;
cropTypes[1].soilType[2] = null;
cropTypes[1].CropName = "Barley";
cropTypes[1].Temparature = 30.1f;
cropTypes[1].Humidity = 59.0f;
cropTypes[1].Moisture = 41.7f;
cropTypes[1].Nitrogen = 25 + 12.6f;
cropTypes[1].Potassium = 14 + 5.3f;
cropTypes[1].Phosphorous = 30 + 26.0f;
cropTypes[1].Nitrogen = 21 + 12.6f;
cropTypes[1].Potassium = 10 + 5.3f;
cropTypes[1].Phosphorous = 20 + 26.0f;
// Cotton
@ -44,24 +46,26 @@ class CropTypesHolder
cropTypes[2].Times[1] = 4;
cropTypes[2].soilType[2] = "Loamy";
cropTypes[2].Times[2] = 3;
cropTypes[2].CropName = "Cotton";
cropTypes[2].Temparature = 30.4f;
cropTypes[2].Humidity = 59.6f;
cropTypes[2].Moisture = 63.2f;
cropTypes[2].Nitrogen = 25 + 16.4f;
cropTypes[2].Potassium = 14 + 3.3f;
cropTypes[2].Phosphorous = 30 + 23.8f;
cropTypes[2].Nitrogen = 21 + 16.4f;
cropTypes[2].Potassium = 10 + 3.3f;
cropTypes[2].Phosphorous = 20 + 23.8f;
// Ground Nuts
cropTypes[3] = new CropTypes();
cropTypes[3].soilType[0] = "Red";
cropTypes[3].soilType[1] = null;
cropTypes[3].soilType[2] = null;
cropTypes[3].CropName = "Ground Nuts";
cropTypes[3].Temparature = 30.1f;
cropTypes[3].Humidity = 59.1f;
cropTypes[3].Moisture = 33.1f;
cropTypes[3].Nitrogen = 25 + 23.3f;
cropTypes[3].Potassium = 14 + 2.0f;
cropTypes[3].Phosphorous = 30 + 21.6f;
cropTypes[3].Nitrogen = 21 + 23.3f;
cropTypes[3].Potassium = 10 + 2.0f;
cropTypes[3].Phosphorous = 20 + 21.6f;
// Maize
@ -69,12 +73,13 @@ class CropTypesHolder
cropTypes[4].soilType[0] = "Sandy";
cropTypes[4].soilType[1] = null;
cropTypes[4].soilType[2] = null;
cropTypes[4].CropName = "Maize";
cropTypes[4].Temparature = 29.0f;
cropTypes[4].Humidity = 57.3f;
cropTypes[4].Moisture = 42.2f;
cropTypes[4].Nitrogen = 25 + 18.3f;
cropTypes[4].Potassium = 14 + 5.7f;
cropTypes[4].Phosphorous = 30 + 18.7f;
cropTypes[4].Nitrogen = 21 + 18.3f;
cropTypes[4].Potassium = 10 + 5.7f;
cropTypes[4].Phosphorous = 20 + 18.7f;
// Millets
cropTypes[5] = new CropTypes();
@ -83,48 +88,52 @@ class CropTypesHolder
cropTypes[5].soilType[1] = "Black";
cropTypes[5].Times[0] = 4;
cropTypes[5].soilType[2] = null;
cropTypes[5].CropName = "Millets";
cropTypes[5].Temparature = 29.5f;
cropTypes[5].Humidity = 57.3f;
cropTypes[5].Moisture = 38.5f;
cropTypes[5].Nitrogen = 25 + 23.2f;
cropTypes[5].Potassium = 14 + 0.1f;
cropTypes[5].Phosphorous = 30 + 14.4f;
cropTypes[5].Nitrogen = 21 + 23.2f;
cropTypes[5].Potassium = 10 + 0.1f;
cropTypes[5].Phosphorous = 20 + 14.4f;
//Oil Seeds
cropTypes[6] = new CropTypes();
cropTypes[6].soilType[0] = "Black";
cropTypes[6].soilType[1] = null;
cropTypes[6].soilType[2] = null;
cropTypes[6].CropName = "Oil Seeds";
cropTypes[6].Temparature = 30.3f;
cropTypes[6].Humidity = 59.1f;
cropTypes[6].Moisture = 32.1f;
cropTypes[6].Nitrogen = 25 + 19.0f;
cropTypes[6].Potassium = 14 + 2.3f;
cropTypes[6].Phosphorous = 30 + 17.3f;
cropTypes[6].Nitrogen = 21 + 19.0f;
cropTypes[6].Potassium = 10 + 2.3f;
cropTypes[6].Phosphorous = 20 + 17.3f;
//Paddys
cropTypes[7] = new CropTypes();
cropTypes[7].soilType[0] = "Clayey";
cropTypes[7].soilType[1] = null;
cropTypes[7].soilType[2] = null;
cropTypes[7].CropName = "Paddys";
cropTypes[7].Temparature = 31.2f;
cropTypes[7].Humidity = 60.4f;
cropTypes[7].Moisture = 41.5f;
cropTypes[7].Nitrogen = 25 + 20.8f;
cropTypes[7].Potassium = 14 + 3.7f;
cropTypes[7].Phosphorous = 30 + 16.3f;
cropTypes[7].Nitrogen = 21 + 20.8f;
cropTypes[7].Potassium = 10 + 3.7f;
cropTypes[7].Phosphorous = 20 + 16.3f;
//Pulses
cropTypes[8] = new CropTypes();
cropTypes[8].soilType[0] = "Clayey";
cropTypes[8].soilType[1] = null;
cropTypes[8].soilType[2] = null;
cropTypes[8].CropName = "Pulses";
cropTypes[8].Temparature = 27.8f;
cropTypes[8].Humidity = 54.9f;
cropTypes[8].Moisture = 34.1f;
cropTypes[8].Nitrogen = 25 + 18.4f;
cropTypes[8].Potassium = 14 + 4.2f;
cropTypes[8].Phosphorous = 30 + 17.5f;
cropTypes[8].Nitrogen = 21 + 18.4f;
cropTypes[8].Potassium = 10 + 4.2f;
cropTypes[8].Phosphorous = 20 + 17.5f;
//Sugarcane
cropTypes[9] = new CropTypes();
@ -133,12 +142,13 @@ class CropTypesHolder
cropTypes[9].soilType[1] = "Black";
cropTypes[9].Times[0] = 4;
cropTypes[9].soilType[2] = null;
cropTypes[9].CropName = "Sugarcane";
cropTypes[9].Temparature = 30.0f;
cropTypes[9].Humidity = 58.6f;
cropTypes[9].Moisture = 51.2f;
cropTypes[9].Nitrogen = 25 + 14.6f;
cropTypes[9].Potassium = 14 + 4.2f;
cropTypes[9].Phosphorous = 30 + 17.6f;
cropTypes[9].Nitrogen = 21 + 14.6f;
cropTypes[9].Potassium = 10 + 4.2f;
cropTypes[9].Phosphorous = 20 + 17.6f;
//Tobacco
@ -146,12 +156,13 @@ class CropTypesHolder
cropTypes[10].soilType[0] = "Red";
cropTypes[10].soilType[1] = null;
cropTypes[10].soilType[2] = null;
cropTypes[10].CropName = "Tobacco";
cropTypes[10].Temparature = 31.9f;
cropTypes[10].Humidity = 62.4f;
cropTypes[10].Moisture = 31.6f;
cropTypes[10].Nitrogen = 25 + 19.1f;
cropTypes[10].Potassium = 14 + 4.9f;
cropTypes[10].Phosphorous = 30 + 19.3f;
cropTypes[10].Nitrogen = 21 + 19.1f;
cropTypes[10].Potassium = 10 + 4.9f;
cropTypes[10].Phosphorous = 20 + 19.3f;
//Wheat
@ -159,12 +170,13 @@ class CropTypesHolder
cropTypes[11].soilType[0] = "Loamy";
cropTypes[11].soilType[1] = null;
cropTypes[11].soilType[2] = null;
cropTypes[11].CropName = "Wheat";
cropTypes[11].Temparature = 33.1f;
cropTypes[11].Humidity = 63.8f;
cropTypes[11].Moisture = 50.0f;
cropTypes[11].Nitrogen = 25 + 23.3f;
cropTypes[11].Potassium = 14 + 2.9f;
cropTypes[11].Phosphorous = 30 + 14.4f;
cropTypes[11].Nitrogen = 21 + 23.3f;
cropTypes[11].Potassium = 10 + 2.9f;
cropTypes[11].Phosphorous = 20 + 14.4f;
}

View File

@ -45,11 +45,49 @@ class Crops
}
}
public float getSpeedFactor(float tractorSpeed)
{
return (1f * tractorSpeed) / getCostOnMovement();
}
public SoilProperties getSoilProperties()
{
return soilProperties;
}
public void Fertilize(Fertilizer fertilizer)
{
soilProperties.Nitrogen += fertilizer.Nitrogen;
soilProperties.Phosphorous += fertilizer.Phosphorus;
soilProperties.Potassium += fertilizer.Potassium;
if (soilProperties.Nitrogen > 42)
soilProperties.Nitrogen = 42;
if (soilProperties.Phosphorous > 42)
soilProperties.Phosphorous = 42;
if (soilProperties.Potassium > 19)
soilProperties.Potassium = 19;
}
public bool isSaturated()
{
if (soilProperties.Nitrogen > 40 && (soilProperties.Phosphorous > 40 || soilProperties.Potassium > 17))
return true;
if (soilProperties.Phosphorous > 40 && soilProperties.Potassium > 17)
return true;
return false;
}
public bool isSaturated(int threshold)
{
if (soilProperties.Nitrogen > 40 - threshold && (soilProperties.Phosphorous > 40 - threshold || soilProperties.Potassium > 17 - (threshold * 17/40)))
return true;
if (soilProperties.Phosphorous > 40 - threshold && soilProperties.Potassium > 17 - (threshold *17/40))
return true;
return false;
}
public float getCropTimer()
{
return Timer;
@ -70,7 +108,7 @@ class Crops
// Changes the time required for the crops to be harvestable
public void setCropTimer()
{
if (cropType == 0) // Carrots
if (cropType == 1) // Barley
{
Timer = 300;
fullTimer = Timer;
@ -106,19 +144,51 @@ class Crops
{
if (cropType == 0)
{
return 15; //Carrots
return 16; //Barley
}
else if (cropType == 1)
if (cropType == 1)
{
return 30; //Wheat
return 16; //Barley
}
else if (cropType == 2)
{
return 40; //Berries
return 16; //Cotton
}
else if (cropType == 3)
{
return 16; //Ground Nuts
}
else if (cropType == 4)
{
return 16; //Maize
}
else if (cropType == 5)
{
return 16; //Millets
}
else if (cropType == 6)
{
return 16; //Oil Seeds
}
else if (cropType == 7)
{
return 16; //Paddy
}
else if (cropType == 8)
{
return 16; //Pulses
}
else if (cropType == 9)
{
return 16; //Sugarcane
}
else if (cropType == 10)
{
return 16; //Wheat
}
else
{
return 50; //Fruit Trees
return 16; //Tobacco
}
}
}
@ -128,15 +198,15 @@ class Crops
if (soilProperties.Nitrogen > 4.0f)
{
soilProperties.Nitrogen = soilProperties.Nitrogen - soilProperties.NitrogenDegradeRate;
soilProperties.Nitrogen = soilProperties.Nitrogen - (soilProperties.NitrogenDegradeRate * (float)Math.Pow(ProductionRate, 2));
}
if (soilProperties.Phosphorous > 0.1f)
{
soilProperties.Phosphorous = soilProperties.Phosphorous - soilProperties.PhosphorousDegradeRate;
soilProperties.Phosphorous = soilProperties.Phosphorous - (soilProperties.PhosphorousDegradeRate * (float)Math.Pow(ProductionRate, 2));
}
if (soilProperties.Potassium > 0.1f)
{
soilProperties.Potassium = soilProperties.Potassium - soilProperties.PotassiumDegradeRate;
soilProperties.Potassium = soilProperties.Potassium - (soilProperties.PotassiumDegradeRate * (float)Math.Pow(ProductionRate, 2));
}
}
@ -194,26 +264,58 @@ class Crops
return housePos;
}
public bool belowCapacity()
{
return ((int)(soilProperties.Nitrogen + soilProperties.Potassium + soilProperties.Phosphorous)) < soilProperties.Capacity;
}
public Vector4 getColour()
{
float r, g, b, a;
float productionRate, overhead;
if (ProductionRate > 1.0f)
{
productionRate = 1.0f;
overhead = ProductionRate - 1.0f;
}
else
{
productionRate = ProductionRate;
overhead = 0.0f;
}
r = (1.0f - productionRate) * 4;
g = 0.0f + productionRate;
b = 0.0f + overhead * 3;
a = 255;
return new Vector4(r, g, b, a);
}
public float getProductionRate(CropTypes Sample)
{
ProductionRate = 1;
float min = 1.0f;
if (DataSet != null)
{
ProductionRate = ProductionRate + (ProductionRate * compareToDatset(soilProperties.Temperature, Sample.Temparature));
ProductionRate = ProductionRate + (ProductionRate * compareToDatset(soilProperties.Moisture, Sample.Moisture));
ProductionRate = ProductionRate + (ProductionRate * compareToDatset(soilProperties.Humidity, Sample.Humidity));
//ProductionRate = ProductionRate + (ProductionRate * compareToDatset(soilProperties.Temperature, Sample.Temparature));
//ProductionRate = ProductionRate + (ProductionRate * compareToDatset(soilProperties.Moisture, Sample.Moisture));
//ProductionRate = ProductionRate + (ProductionRate * compareToDatset(soilProperties.Humidity, Sample.Humidity));
min = Math.Min(compareToDatset(soilProperties.Phosphorous, Sample.Phosphorous), Math.Min(compareToDatset(soilProperties.Potassium, Sample.Potassium), compareToDatset(soilProperties.Nitrogen, Sample.Nitrogen)));
ProductionRate = ProductionRate + (ProductionRate * min);
//ProductionRate = ProductionRate + (ProductionRate * compareToDatset(soilProperties.Phosphorous, Sample.Phosphorous));
//ProductionRate = ProductionRate + (ProductionRate * compareToDatset(soilProperties.Potassium, Sample.Potassium));
//ProductionRate = ProductionRate + (ProductionRate * compareToDatset(soilProperties.Nitrogen, Sample.Nitrogen));
if (ProductionRate < 0)
{
ProductionRate = 0;
}
ProductionRate = ProductionRate / 10;
ProductionRate = ProductionRate / 1.5f;
}
ProductionRate = (float)Math.Pow(ProductionRate, 2.5f);
return ProductionRate;
}
public float getProductionRate()
{
return ProductionRate;
}

View File

@ -12,6 +12,7 @@ class Farm
private Random r;
private CropTypesHolder PresetCrops = new CropTypesHolder();
private int Update;
private Astar astar = new Astar();
//initializes the crops
@ -20,6 +21,7 @@ class Farm
PresetCrops.init();
r = new Random();
crops = new Crops[100, 100];
int dirtCount = 0;
for (int i = 0; i < 99; i++)
{
for (int j = 0; j < 99; j++)
@ -39,8 +41,29 @@ class Farm
x = r.Next(0, 12);
crops[i, j].setCropType(x, PresetCrops.getPresetCropTypes(x));
crops[i, j].init();
if (crops[i, j].getStatus() == 2)
{
dirtCount++;
}
}
}
for (int i = 0; i < 99; i++)
{
for (int j = 0; j < 99; j++)
{
if (crops[i, j].getStatus() == 2)
{
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)
@ -76,6 +99,7 @@ class Farm
}
else if (crops[x, y].getStatus() == 2)
{
crops[x, y].setStatus(3);
crops[x, y].setCropTimer();
}
@ -112,8 +136,11 @@ class Farm
{
for (int j = 0; j < Size.X; j++)
{
int x = getHighestProductionRate(i, j);
crops[i,j].setCropType(x, PresetCrops.getPresetCropTypes(x));
if (crops[i, j].getStatus() != 3)
{
int x = getHighestProductionRate(i, j);
crops[i, j].setCropType(x, PresetCrops.getPresetCropTypes(x));
}
}
}
}

View File

@ -20,6 +20,7 @@ class SoilProperties
public float NitrogenDegradeRate = 1.0f - (1.0f/55 * 40);
public float PotassiumDegradeRate = 1.0f - (1.0f/28 * 23);
public float PhosphorousDegradeRate = 1.0f - (1.0f/60 * 37);
public int Capacity = 80;
public void setSoilProperties()
{
@ -47,9 +48,9 @@ class SoilProperties
Temperature = GetRandomNumber(22, 30);
Humidity = Temperature * GetRandomNumber(1.9, 2.1);
Moisture = GetRandomNumber(20, 70);
Nitrogen = GetRandomNumber(4 , 55);
Potassium = GetRandomNumber(0.01f, 28);
Phosphorous = GetRandomNumber(0.01f, 60);
Nitrogen = GetRandomNumber(4 , 42); //was 4, 60
Potassium = GetRandomNumber(0.01f, 19); // was 0, 28
Phosphorous = GetRandomNumber(0.01f, 42); // was 0, 60
}
public float GetRandomNumber(double minimum, double maximum)

View File

@ -1,91 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
class Farm
{
private Crops[,] crops;
private Random r;
public void init(Vector2 Size)
{
r = new Random();
crops = new Crops[100, (GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height / 56) - 125 / 56];
for (int i = 0; i < Size.X; i++)
{
for (int j = 0; j < Size.Y; j++)
{
int x = r.Next(0, 2);
crops[i, j] = new Crops();
crops[i, j].Status = x;
}
}
}
public void updateFarm(Vector2 Size)
{
for (int i = 0; i > Size.X; i++)
{
for (int j = 0; j > Size.Y; j++)
{
crops[i, j].updateCrop();
}
}
}
public void setCropStatus(float xfloat, float yfloat, int Spacing)
{
int x = (int)xfloat / Spacing;
int y = (int)yfloat / Spacing;
if (crops[x, y].Status == 3)
{
crops[x, y].Status = 1;
}
else if(crops[x, y].Status == 0)
{
//do nothing
}
else if (crops[x, y].Status == 1)
{
crops[x, y].Status = 2;
}
else if (crops[x, y].Status == 2)
{
crops[x, y].Status = 3;
}
}
public Crops getCrop(int x, int y)
{
return crops[x,y];
}
public Crops[,] getCrops()
{
return crops;
}
public void updateSize(Vector2 Size, int tileSize, int Spacing)
{
for (int i = 0; i < (int)Size.X; i++)
{
for (int j = 0; j < (int)Size.Y; j++)
{
crops[i, j].x = (tileSize + Spacing) * i;
crops[i, j].y = (tileSize + Spacing) * j;
}
}
}
public string getSize()
{
return crops[1, 1].x.ToString();
}
}

View File

@ -1,47 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Xna.Framework;
class House
{
private Rectangle housePos;
private Vector2 pos;
private Random r = new Random();
public void init(int tileSize, int Spacing)
{
int x = r.Next(0, 8);
int y = r.Next(0, 8);
pos = new Vector2(x, y);
housePos = new Rectangle((x * tileSize + Spacing), y * (tileSize + Spacing), tileSize, tileSize);
}
public void updateRectangle(Vector2 Size, int tileSize)
{
if (pos.X + 1 > Size.X)
{
pos = new Vector2(pos.X - 1, pos.Y);
}
if (pos.Y + 1 > Size.Y)
{
pos = new Vector2(pos.X, pos.Y - 1);
}
housePos = new Rectangle((int)pos.X * (tileSize + 1), (int)pos.Y * (tileSize + 1), tileSize, tileSize);
}
public Rectangle GetRectangle()
{
return housePos;
}
public Vector2 getVector()
{
return new Vector2(housePos.X, housePos.Y);
}
}

View File

@ -1,100 +0,0 @@
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Graphics;
class Input
{
private KeyboardState state = Keyboard.GetState();
private GraphicsDeviceManager graphics;
private Vector2 Size;
private int tileSize;
private int Spacing;
public void init(GraphicsDeviceManager Graphics, Vector2 size, int TileSize, int SPacing)
{
graphics = Graphics;
tileSize = TileSize;
Spacing = SPacing;
Size = size;
}
public int changeSpeed(int speed)
{
KeyboardState state = Keyboard.GetState();
if (state.IsKeyDown(Keys.Right))
{
speed++;
}
if (state.IsKeyDown(Keys.Left) && speed > 0)
{
speed--;
}
return speed;
}
private Vector2 changeSize()
{
KeyboardState state = Keyboard.GetState();
if (state.IsKeyDown(Keys.D) && Size.X < 100)
{
Size.X++;
graphics.PreferredBackBufferWidth = (tileSize + Spacing) * (int)Size.X - Spacing;
}
if (state.IsKeyDown(Keys.A) && Size.X > 2)
{
Size.X--;
graphics.PreferredBackBufferWidth = (tileSize + Spacing) * (int)Size.X - Spacing;
}
if (state.IsKeyDown(Keys.W) && Size.Y < (GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height / tileSize) - 125 / tileSize)
{
Size.Y++;
graphics.PreferredBackBufferHeight = (tileSize + Spacing) * (int)Size.Y - Spacing + 100;
}
if (state.IsKeyDown(Keys.S) && Size.Y > 2)
{
Size.Y--;
graphics.PreferredBackBufferHeight = (tileSize + Spacing) * (int)Size.Y - Spacing + 100;
}
return Size;
}
public void controlWindowSize()
{
if (Size.X * tileSize + 5 > GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width)
{
tileSize--;
}
if (Size.X * tileSize - 5 < GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width && tileSize < 56)
{
tileSize++;
}
changeSize();
graphics.ApplyChanges();
}
public int getTileSize()
{
return tileSize;
}
public int getSpacing()
{
return Spacing;
}
public Vector2 getSize()
{
return Size;
}
public void setTileSize(int newTileSize)
{
tileSize = newTileSize;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,100 @@
Temparature,Humidity ,Moisture,Soil Type,Crop Type,Nitrogen,Potassium,Phosphorous,Fertilizer Name
26,52,38,Sandy,Maize,37,0,0,Urea
29,52,45,Loamy,Sugarcane,12,0,36,DAP
34,65,62,Black,Cotton,7,9,30,14-35-14
32,62,34,Red,Tobacco,22,0,20,28-28
28,54,46,Clayey,Paddy,35,0,0,Urea
26,52,35,Sandy,Barley,12,10,13,17-17-17
25,50,64,Red,Cotton,9,0,10,20-20
33,64,50,Loamy,Wheat,41,0,0,Urea
30,60,42,Sandy,Millets,21,0,18,28-28
29,58,33,Black,Oil seeds,9,7,30,14-35-14
27,54,28,Clayey,Pulses,13,0,40,DAP
31,62,48,Sandy,Maize,14,15,12,17-17-17
25,50,65,Loamy,Cotton,36,0,0,Urea
32,62,41,Clayey,Paddy,24,0,22,28-28
26,52,31,Red,Ground Nuts,14,0,41,DAP
31,62,49,Black,Sugarcane,10,13,14,17-17-17
33,64,34,Clayey,Pulses,38,0,0,Urea
25,50,39,Sandy,Barley,21,0,19,28-28
28,54,65,Black,Cotton,39,0,0,Urea
29,58,52,Loamy,Wheat,13,0,36,DAP
30,60,44,Sandy,Millets,10,0,9,20-20
34,65,53,Loamy,Sugarcane,12,14,12,17-17-17
35,68,33,Red,Tobacco,11,0,37,DAP
28,54,37,Black,Millets,36,0,0,Urea
33,64,39,Clayey,Paddy,13,0,10,20-20
26,52,44,Sandy,Maize,23,0,20,28-28
30,60,63,Red,Cotton,9,9,29,14-35-14
32,62,30,Loamy,Sugarcane,38,0,0,Urea
37,70,32,Black,Oil seeds,12,0,39,DAP
26,52,36,Clayey,Pulses,14,0,13,20-20
29,58,40,Red,Ground Nuts,24,0,23,28-28
30,60,27,Loamy,Sugarcane,12,0,40,DAP
34,65,38,Clayey,Paddy,39,0,0,Urea
36,68,38,Sandy,Barley,7,9,30,14-35-14
26,52,48,Loamy,Wheat,23,0,19,28-28
28,54,35,Black,Millets,41,0,0,Urea
30,60,61,Loamy,Cotton,8,10,31,14-35-14
37,70,37,Clayey,Paddy,12,0,41,DAP
25,50,26,Red,Ground Nuts,15,14,11,17-17-17
29,58,34,Sandy,Millets,15,0,37,DAP
27,54,30,Clayey,Pulses,13,0,13,20-20
30,60,58,Loamy,Sugarcane,10,7,32,14-35-14
32,62,34,Red,Tobacco,22,0,24,28-28
34,65,60,Black,Sugarcane,35,0,0,Urea
35,67,42,Sandy,Barley,10,0,35,DAP
38,70,48,Loamy,Wheat,8,8,28,14-35-14
26,52,32,Black,Oil seeds,12,0,8,20-20
29,58,43,Clayey,Paddy,24,0,18,28-28
30,60,29,Red,Ground Nuts,41,0,0,Urea
33,64,51,Sandy,Maize,5,9,29,14-35-14
34,65,31,Red,Tobacco,23,0,21,28-28
36,68,33,Black,Oil seeds,13,0,14,20-20
28,54,38,Clayey,Pulses,40,0,0,Urea
30,60,47,Sandy,Barley,12,0,42,DAP
31,62,63,Red,Cotton,11,12,15,17-17-17
27,53,43,Black,Millets,23,0,24,28-28
34,65,54,Loamy,Wheat,38,0,0,Urea
29,58,37,Sandy,Millets,8,0,15,20-20
25,50,56,Loamy,Sugarcane,11,13,15,17-17-17
32,62,34,Red,Ground Nuts,15,0,37,DAP
28,54,41,Clayey,Paddy,36,0,0,Urea
30,60,49,Loamy,Wheat,13,0,9,20-20
34,65,64,Black,Cotton,24,0,20,28-28
28,54,47,Sandy,Barley,5,18,15,10-26-26
27,53,35,Black,Oil seeds,37,0,0,Urea
36,68,62,Red,Cotton,15,0,40,DAP
34,65,57,Black,Sugarcane,9,0,13,20-20
29,58,55,Loamy,Sugarcane,8,8,33,14-35-14
25,50,40,Clayey,Pulses,6,19,16,10-26-26
30,60,38,Sandy,Millets,10,0,14,20-20
26,52,39,Clayey,Pulses,21,0,23,28-28
31,62,32,Red,Tobacco,39,0,0,Urea
34,65,48,Loamy,Wheat,23,0,19,28-28
27,53,34,Black,Oil seeds,42,0,0,Urea
33,64,31,Red,Ground Nuts,13,0,39,DAP
29,58,42,Clayey,Paddy,9,10,22,14-35-14
30,60,47,Sandy,Maize,22,0,21,28-28
27,53,59,Loamy,Sugarcane,10,0,15,20-20
26,52,36,Clayey,Pulses,7,16,20,10-26-26
34,65,63,Red,Cotton,14,0,38,DAP
28,54,43,Clayey,Paddy,10,8,29,14-35-14
30,60,40,Sandy,Millets,41,0,0,Urea
29,58,65,Black,Cotton,14,0,35,DAP
26,52,59,Loamy,Sugarcane,11,0,9,20-20
31,62,44,Sandy,Barley,21,0,28,28-28
35,67,28,Clayey,Pulses,8,7,31,14-35-14
29,58,30,Red,Tobacco,13,17,16,10-26-26
27,53,30,Black,Millets,35,0,0,Urea
36,68,50,Loamy,Wheat,12,18,19,10-26-26
29,58,61,Loamy,Cotton,11,0,38,DAP
30,60,26,Black,Oil seeds,8,9,30,14-35-14
34,65,45,Clayey,Paddy,6,19,21,10-26-26
36,68,41,Red,Ground Nuts,41,0,0,Urea
28,54,25,Sandy,Maize,9,10,30,14-35-14
25,50,32,Clayey,Pulses,24,0,19,28-28
30,60,27,Red,Tobacco,4,17,17,10-26-26
38,72,51,Loamy,Wheat,39,0,0,Urea
36,60,43,Sandy,Millets,15,0,41,DAP
29,58,57,Black,Sugarcane,12,0,10,20-20
1 Temparature Humidity Moisture Soil Type Crop Type Nitrogen Potassium Phosphorous Fertilizer Name
2 26 52 38 Sandy Maize 37 0 0 Urea
3 29 52 45 Loamy Sugarcane 12 0 36 DAP
4 34 65 62 Black Cotton 7 9 30 14-35-14
5 32 62 34 Red Tobacco 22 0 20 28-28
6 28 54 46 Clayey Paddy 35 0 0 Urea
7 26 52 35 Sandy Barley 12 10 13 17-17-17
8 25 50 64 Red Cotton 9 0 10 20-20
9 33 64 50 Loamy Wheat 41 0 0 Urea
10 30 60 42 Sandy Millets 21 0 18 28-28
11 29 58 33 Black Oil seeds 9 7 30 14-35-14
12 27 54 28 Clayey Pulses 13 0 40 DAP
13 31 62 48 Sandy Maize 14 15 12 17-17-17
14 25 50 65 Loamy Cotton 36 0 0 Urea
15 32 62 41 Clayey Paddy 24 0 22 28-28
16 26 52 31 Red Ground Nuts 14 0 41 DAP
17 31 62 49 Black Sugarcane 10 13 14 17-17-17
18 33 64 34 Clayey Pulses 38 0 0 Urea
19 25 50 39 Sandy Barley 21 0 19 28-28
20 28 54 65 Black Cotton 39 0 0 Urea
21 29 58 52 Loamy Wheat 13 0 36 DAP
22 30 60 44 Sandy Millets 10 0 9 20-20
23 34 65 53 Loamy Sugarcane 12 14 12 17-17-17
24 35 68 33 Red Tobacco 11 0 37 DAP
25 28 54 37 Black Millets 36 0 0 Urea
26 33 64 39 Clayey Paddy 13 0 10 20-20
27 26 52 44 Sandy Maize 23 0 20 28-28
28 30 60 63 Red Cotton 9 9 29 14-35-14
29 32 62 30 Loamy Sugarcane 38 0 0 Urea
30 37 70 32 Black Oil seeds 12 0 39 DAP
31 26 52 36 Clayey Pulses 14 0 13 20-20
32 29 58 40 Red Ground Nuts 24 0 23 28-28
33 30 60 27 Loamy Sugarcane 12 0 40 DAP
34 34 65 38 Clayey Paddy 39 0 0 Urea
35 36 68 38 Sandy Barley 7 9 30 14-35-14
36 26 52 48 Loamy Wheat 23 0 19 28-28
37 28 54 35 Black Millets 41 0 0 Urea
38 30 60 61 Loamy Cotton 8 10 31 14-35-14
39 37 70 37 Clayey Paddy 12 0 41 DAP
40 25 50 26 Red Ground Nuts 15 14 11 17-17-17
41 29 58 34 Sandy Millets 15 0 37 DAP
42 27 54 30 Clayey Pulses 13 0 13 20-20
43 30 60 58 Loamy Sugarcane 10 7 32 14-35-14
44 32 62 34 Red Tobacco 22 0 24 28-28
45 34 65 60 Black Sugarcane 35 0 0 Urea
46 35 67 42 Sandy Barley 10 0 35 DAP
47 38 70 48 Loamy Wheat 8 8 28 14-35-14
48 26 52 32 Black Oil seeds 12 0 8 20-20
49 29 58 43 Clayey Paddy 24 0 18 28-28
50 30 60 29 Red Ground Nuts 41 0 0 Urea
51 33 64 51 Sandy Maize 5 9 29 14-35-14
52 34 65 31 Red Tobacco 23 0 21 28-28
53 36 68 33 Black Oil seeds 13 0 14 20-20
54 28 54 38 Clayey Pulses 40 0 0 Urea
55 30 60 47 Sandy Barley 12 0 42 DAP
56 31 62 63 Red Cotton 11 12 15 17-17-17
57 27 53 43 Black Millets 23 0 24 28-28
58 34 65 54 Loamy Wheat 38 0 0 Urea
59 29 58 37 Sandy Millets 8 0 15 20-20
60 25 50 56 Loamy Sugarcane 11 13 15 17-17-17
61 32 62 34 Red Ground Nuts 15 0 37 DAP
62 28 54 41 Clayey Paddy 36 0 0 Urea
63 30 60 49 Loamy Wheat 13 0 9 20-20
64 34 65 64 Black Cotton 24 0 20 28-28
65 28 54 47 Sandy Barley 5 18 15 10-26-26
66 27 53 35 Black Oil seeds 37 0 0 Urea
67 36 68 62 Red Cotton 15 0 40 DAP
68 34 65 57 Black Sugarcane 9 0 13 20-20
69 29 58 55 Loamy Sugarcane 8 8 33 14-35-14
70 25 50 40 Clayey Pulses 6 19 16 10-26-26
71 30 60 38 Sandy Millets 10 0 14 20-20
72 26 52 39 Clayey Pulses 21 0 23 28-28
73 31 62 32 Red Tobacco 39 0 0 Urea
74 34 65 48 Loamy Wheat 23 0 19 28-28
75 27 53 34 Black Oil seeds 42 0 0 Urea
76 33 64 31 Red Ground Nuts 13 0 39 DAP
77 29 58 42 Clayey Paddy 9 10 22 14-35-14
78 30 60 47 Sandy Maize 22 0 21 28-28
79 27 53 59 Loamy Sugarcane 10 0 15 20-20
80 26 52 36 Clayey Pulses 7 16 20 10-26-26
81 34 65 63 Red Cotton 14 0 38 DAP
82 28 54 43 Clayey Paddy 10 8 29 14-35-14
83 30 60 40 Sandy Millets 41 0 0 Urea
84 29 58 65 Black Cotton 14 0 35 DAP
85 26 52 59 Loamy Sugarcane 11 0 9 20-20
86 31 62 44 Sandy Barley 21 0 28 28-28
87 35 67 28 Clayey Pulses 8 7 31 14-35-14
88 29 58 30 Red Tobacco 13 17 16 10-26-26
89 27 53 30 Black Millets 35 0 0 Urea
90 36 68 50 Loamy Wheat 12 18 19 10-26-26
91 29 58 61 Loamy Cotton 11 0 38 DAP
92 30 60 26 Black Oil seeds 8 9 30 14-35-14
93 34 65 45 Clayey Paddy 6 19 21 10-26-26
94 36 68 41 Red Ground Nuts 41 0 0 Urea
95 28 54 25 Sandy Maize 9 10 30 14-35-14
96 25 50 32 Clayey Pulses 24 0 19 28-28
97 30 60 27 Red Tobacco 4 17 17 10-26-26
98 38 72 51 Loamy Wheat 39 0 0 Urea
99 36 60 43 Sandy Millets 15 0 41 DAP
100 29 58 57 Black Sugarcane 12 0 10 20-20

View File

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.ML;
static class Engine
{
private static MLContext mlContext = new MLContext(seed: 1);
private static PredictionEngine<ModelInput, ModelOutput> PredictionEngine;
public static void init()
{
PredictionEngine = MLModel.CreateEngine();
}
public static string PredictFertilizer(Crops crop, CropTypes cropTypes)
{
ModelInput modelInput = new ModelInput
{
Temperature = crop.getSoilProperties().Temperature,
Humidity = crop.getSoilProperties().Humidity,
Moisture = crop.getSoilProperties().Moisture,
Soil_Type = crop.getSoilProperties().soilType,
Crop_Type = cropTypes.CropName,
Nitrogen = crop.getSoilProperties().Nitrogen,
Potassium = crop.getSoilProperties().Potassium,
Phosporous = crop.getSoilProperties().Phosphorous
};
return PredictionEngine.Predict(modelInput).Prediction;
}
}

View File

@ -0,0 +1,42 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.ML.Data;
class BigModelInput
{
[ColumnName("Ca"), LoadColumn(0)]
public float Ca { get; set; }
[ColumnName("Mg"), LoadColumn(1)]
public float Mg { get; set; }
[ColumnName("K"), LoadColumn(2)]
public float K { get; set; }
[ColumnName("S"), LoadColumn(3)]
public float S { get; set; }
[ColumnName("N"), LoadColumn(4)]
public float N { get; set; }
[ColumnName("Lime"), LoadColumn(5)]
public float Lime { get; set; }
[ColumnName("C"), LoadColumn(6)]
public float C { get; set; }
[ColumnName("P"), LoadColumn(7)]
public float P { get; set; }
[ColumnName("Moisture"), LoadColumn(8)]
public float Moisture { get; set; }
[ColumnName("Class"), LoadColumn(9)]
public float Class { get; set; }
}

View File

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.ML.Data;
class BigModelOutput
{
[ColumnName("PredictedLabel")]
public float Prediction { get; set; }
}

View File

@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.ML;
using Microsoft.ML.Data;
class ModelInput
{
[ColumnName("Temperature"), LoadColumn(0)]
public float Temperature { get; set; }
[ColumnName("Humidity"), LoadColumn(1)]
public float Humidity { get; set; }
[ColumnName("Moisture"), LoadColumn(2)]
public float Moisture { get; set; }
[ColumnName("Soil_Type"), LoadColumn(3)]
public String Soil_Type { get; set; }
[ColumnName("Crop_Type"), LoadColumn(4)]
public String Crop_Type { get; set; }
[ColumnName("Nitrogen"), LoadColumn(5)]
public float Nitrogen { get; set; }
[ColumnName("Potassium"), LoadColumn(6)]
public float Potassium { get; set; }
[ColumnName("Phosphorous"), LoadColumn(7)]
public float Phosporous { get; set; }
[ColumnName("Fertilizer_Name"), LoadColumn(8)]
public String Fertilizer_Name { get; set; }
}

View File

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.ML.Data;
class ModelOutput
{
[ColumnName("PredictedLabel")]
public String Prediction { get; set; }
//public float[] Score { get; set; }
}

167
Game1/Sources/ML/MLModel.cs Normal file
View File

@ -0,0 +1,167 @@
using System;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.ML;
using Microsoft.ML.Data;
using Microsoft.ML.Trainers.LightGbm;
class MLModel
{
private static MLContext mlContext = new MLContext(seed: 1);
private static string path = "C:/Users/Oskar/source/repos/PotatoPlanFinal/Game1/Content/ML/Fertilizer_Prediction.csv";
private static string modelpath = "C:/Users/Oskar/source/repos/PotatoPlanFinal/Game1/Content/ML/MLmodel";
private static string report = "C:/Users/Oskar/source/repos/PotatoPlanFinal/Game1/Content/ML/report";
private static string pathBig = "C:/Users/Oskar/source/repos/PotatoPlanFinal/Game1/Content/ML/BigFertPredict.csv";
private static string modelpathBig = "C:/Users/Oskar/source/repos/PotatoPlanFinal/Game1/Content/ML/MLmodelBig";
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)
public static void CreateModel()
{
IDataView trainingDataView = mlContext.Data.LoadFromTextFile<ModelInput>(
path: path,
hasHeader: true,
separatorChar: ',',
allowQuoting: true,
allowSparse: false);
ModelInput sample = mlContext.Data.CreateEnumerable<ModelInput>(trainingDataView, false).ElementAt(0);
ITransformer MLModel = BuildAndTrain(mlContext, trainingDataView, sample, report);
SaveModel(mlContext, MLModel, modelpath, trainingDataView.Schema);
}
// ... for bigger dataset (1600)
public static void CreateBigModel()
{
IDataView trainingDataView = mlContext.Data.LoadFromTextFile<BigModelInput>(
path: pathBig,
hasHeader: true,
separatorChar: ',',
allowQuoting: true,
allowSparse: false);
BigModelInput sample = mlContext.Data.CreateEnumerable<BigModelInput>(trainingDataView, false).ElementAt(0);
ITransformer MLModel = BuildAndTrain(mlContext, trainingDataView, sample, reportBig);
SaveModel(mlContext, MLModel, modelpathBig, trainingDataView.Schema);
}
// Building and training ML model, very small dataset (100 entries)
public static ITransformer BuildAndTrain(MLContext mLContext, IDataView trainingDataView, ModelInput sample, string reportPath)
{
var options = new LightGbmMulticlassTrainer.Options
{
MaximumBinCountPerFeature = 8,
LearningRate = 0.00025,
NumberOfIterations = 40000,
NumberOfLeaves = 10,
LabelColumnName = "Fertilizer_NameF",
FeatureColumnName = "Features",
Booster = new DartBooster.Options()
{
MaximumTreeDepth = 10
}
};
var pipeline = mlContext.Transforms
.Text.FeaturizeText("Soil_TypeF", "Soil_Type")
.Append(mlContext.Transforms.Text.FeaturizeText("Crop_TypeF", "Crop_Type"))
.Append(mlContext.Transforms.Concatenate("Features", "Temperature", "Humidity", "Moisture", "Soil_TypeF", "Crop_TypeF", "Nitrogen", "Potassium", "Phosphorous"))
.Append(mlContext.Transforms.Conversion.MapValueToKey("Fertilizer_NameF", "Fertilizer_Name"), TransformerScope.TrainTest)
.AppendCacheCheckpoint(mLContext)
.Append(mLContext.MulticlassClassification.Trainers.LightGbm(options))
.Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel", "PredictedLabel"));
Evaluate(mlContext, trainingDataView, pipeline, 10, reportPath, "Fertilizer_NameF");
ITransformer MLModel = pipeline.Fit(trainingDataView);
return MLModel;
}
//Building and training ML model, moderate size dataset (1600 entries)
public static ITransformer BuildAndTrain(MLContext mLContext, IDataView trainingDataView, BigModelInput sample, string reportPath)
{
var options = new LightGbmMulticlassTrainer.Options
{
MaximumBinCountPerFeature = 10,
LearningRate = 0.001,
NumberOfIterations = 10000,
NumberOfLeaves = 12,
LabelColumnName = "ClassF",
FeatureColumnName = "Features",
Booster = new DartBooster.Options()
{
MaximumTreeDepth = 12
}
};
var pipeline = mlContext.Transforms
.Concatenate("Features", "Ca", "Mg", "K", "S", "N", "Lime", "C", "P", "Moisture")
.Append(mLContext.Transforms.NormalizeMinMax("Features"))
.Append(mlContext.Transforms.Conversion.MapValueToKey("ClassF", "Class"), TransformerScope.TrainTest)
.AppendCacheCheckpoint(mLContext)
.Append(mLContext.MulticlassClassification.Trainers.LightGbm(options))
.Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel", "PredictedLabel"));
Evaluate(mlContext, trainingDataView, pipeline, 8, reportPath, "ClassF");
ITransformer MLModel = pipeline.Fit(trainingDataView);
return MLModel;
}
public static ITransformer TrainModel(MLContext mlContext, IDataView trainingDataView, IEstimator<ITransformer> trainingPipeline)
{
ITransformer model = trainingPipeline.Fit(trainingDataView);
return model;
}
// Evaluate and save results to a text file
public static void Evaluate(MLContext mlContext, IDataView trainingDataView, IEstimator<ITransformer> trainingPipeline, int folds, string reportPath, string labelColumnName)
{
var crossVal = mlContext.MulticlassClassification.CrossValidate(trainingDataView, trainingPipeline, numberOfFolds: folds, labelColumnName: labelColumnName);
var metricsInMultipleFolds = crossVal.Select(r => r.Metrics);
var MicroAccuracyValues = metricsInMultipleFolds.Select(m => m.MicroAccuracy);
var LogLossValues = metricsInMultipleFolds.Select(m => m.LogLoss);
var LogLossReductionValues = metricsInMultipleFolds.Select(m => m.LogLossReduction);
string MicroAccuracyAverage = MicroAccuracyValues.Average().ToString("0.######");
string LogLossAvg = LogLossValues.Average().ToString("0.######");
string LogLossReductionAvg = LogLossReductionValues.Average().ToString("0.######");
var report = File.CreateText(reportPath);
report.Write("Micro Accuracy: " + MicroAccuracyAverage +'\n'+ "LogLoss Average: " + LogLossAvg +'\n'+ "LogLoss Reduction: " + LogLossReductionAvg, 0, 0);
report.Flush();
report.Close();
}
public static void SaveModel(MLContext mlContext, ITransformer Model, string modelPath, DataViewSchema modelInputSchema)
{
mlContext.Model.Save(Model, modelInputSchema, modelPath);
}
public static ITransformer LoadModel(bool isBig)
{
if (isBig)
return mlContext.Model.Load(modelpathBig, out DataViewSchema inputSchema);
else
return mlContext.Model.Load(modelpath, out DataViewSchema inputSchema);
}
public static Microsoft.ML.PredictionEngine<ModelInput, ModelOutput> CreateEngine()
{
ITransformer mlModel = LoadModel(false);
return mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(mlModel);
}
}

View File

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
class Fertilizer
{
public int ID { get; set; }
public string Name { get; set; }
public float Nitrogen { get; set; }
public float Phosphorus { get; set; }
public float Potassium { get; set; }
}

View File

@ -0,0 +1,181 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
class FertilizerHolder
{
private Fertilizer[] FertilizerType = new Fertilizer[8];
public void init()
{
/*
FertilizerType[0] = new Fertilizer
{
ID = 999,
Name = "None",
Nitrogen = 0.0f / 5,
Phosphorus = 0 * 0.436f / 5,
Potassium = 0 * 0.83f / 5
};
FertilizerType[1] = new Fertilizer
{
ID = 0,
Name = "10-26-26",
Nitrogen = 10.0f / 5,
Phosphorus = 26 * 0.436f / 5,
Potassium = 26 * 0.83f / 5
};
FertilizerType[2] = new Fertilizer
{
ID = 1,
Name = "14-35-14",
Nitrogen = 14.0f / 5,
Phosphorus = 35 * 0.436f / 5,
Potassium = 14 * 0.83f / 5
};
FertilizerType[3] = new Fertilizer
{
ID = 2,
Name = "17-17-17",
Nitrogen = 17.0f / 5,
Phosphorus = 17 * 0.436f / 5,
Potassium = 17 * 0.83f / 5
};
FertilizerType[4] = new Fertilizer
{
ID = 3,
Name = "20-20",
Nitrogen = 20.0f / 5,
Phosphorus = 20 * 0.436f / 5,
Potassium = 0 * 0.83f / 5
};
FertilizerType[5] = new Fertilizer
{
ID = 4,
Name = "28-28",
Nitrogen = 28.0f / 5,
Phosphorus = 28 * 0.436f / 5,
Potassium = 0 * 0.83f / 5
};
FertilizerType[6] = new Fertilizer
{
ID = 5,
Name = "DAP",
Nitrogen = 18.0f / 5,
Phosphorus = 46 * 0.436f / 5,
Potassium = 0 * 0.83f / 5
};
FertilizerType[7] = new Fertilizer
{
ID = 6,
Name = "Urea",
Nitrogen = 46.0f / 5,
Phosphorus = 0 * 0.436f / 5,
Potassium = 0 * 0.83f / 5
};
}
*/
FertilizerType[0] = new Fertilizer
{
ID = 999,
Name = "None",
Nitrogen = 0.0f / 5,
Phosphorus = 0 * 0.436f / 5,
Potassium = 0 * 0.83f / 5
};
FertilizerType[1] = new Fertilizer
{
ID = 0,
Name = "10-26-26",
Nitrogen = 17.21f / 5,
Phosphorus = 12.14f / 5,
Potassium = 0.64f / 5
};
FertilizerType[2] = new Fertilizer
{
ID = 1,
Name = "14-35-14",
Nitrogen = 16.89f / 5,
Phosphorus = 6.21f / 5,
Potassium = 5.21f / 5
};
FertilizerType[3] = new Fertilizer
{
ID = 2,
Name = "17-17-17",
Nitrogen = 14.92f / 5,
Phosphorus = 14.42f / 5,
Potassium = 3.0f / 5
};
FertilizerType[4] = new Fertilizer
{
ID = 3,
Name = "20-20",
Nitrogen = 15.39f / 5,
Phosphorus = 15.21f / 5,
Potassium = 9.5f / 5
};
FertilizerType[5] = new Fertilizer
{
ID = 4,
Name = "28-28",
Nitrogen = 9.67f / 5,
Phosphorus = 10.47f / 5,
Potassium = 9.5f / 5
};
FertilizerType[6] = new Fertilizer
{
ID = 5,
Name = "DAP",
Nitrogen = 14.52f / 5,
Phosphorus = 1.77f / 5,
Potassium = 9.5f / 5
};
FertilizerType[7] = new Fertilizer
{
ID = 6,
Name = "Urea",
Nitrogen = 1.81f / 5,
Phosphorus = 21.0f / 5,
Potassium = 9.5f / 5
};
}
public int GetFertilizerID(string name)
{
foreach (Fertilizer fertilizer in FertilizerType)
{
if (fertilizer.Name == name)
return fertilizer.ID;
}
return 0;
}
public Fertilizer GetFertilizer(string name)
{
foreach (Fertilizer fertilizer in FertilizerType)
{
if (fertilizer.Name == name)
return fertilizer;
}
return FertilizerType[0];
}
}

View File

@ -1,17 +1,25 @@
using Microsoft.Xna.Framework;
using System;
class HandleRotation
{
int rotationSpeed = 5, Rotation = 180;
private float oldSpeed, movementSpeed;
private Vector2 oldTile, oldPosition, oldMovementSpeed;
private Vector2 Direction;
public Vector2 UpdatePosition(int Destination, float tractorSpeed, Vector2 Position)
public Vector2 UpdatePosition(int Destination, float tractorSpeed, Vector2 Position, Crops crops, Vector2 oldDeltaPosition, Vector2 Target)
{
Vector2 Direction;
if (Destination == 0)
if (oldSpeed != crops.getSpeedFactor(tractorSpeed))
{
Position = new Vector2((int)Math.Round(Position.X), (int)Math.Round(Position.Y));
}
if (Destination == 0) // down
{
if (Rotation == 0)
{
Direction = new Vector2(0, 1) * tractorSpeed;
Direction = new Vector2(0, 1) * movementSpeed;
Position = Position + Direction;
}
else
@ -30,11 +38,11 @@ class HandleRotation
}
}
}
else if (Destination == 1)
else if (Destination == 1) // up
{
if (Rotation == 180)
{
Direction = new Vector2(0, -1) * tractorSpeed;
Direction = new Vector2(0, -1) * movementSpeed;
Position = Position + Direction;
}
else
@ -50,11 +58,11 @@ class HandleRotation
}
}
else if (Destination == 2)
else if (Destination == 2) // right
{
if (Rotation == 270)
{
Direction = new Vector2(1, 0) * tractorSpeed;
Direction = new Vector2(1, 0) * movementSpeed;
Position = Position + Direction;
}
else
@ -73,11 +81,11 @@ class HandleRotation
}
}
}
else if (Destination == 3)
else if (Destination == 3) // left
{
if (Rotation == 90)
{
Direction = new Vector2(-1, 0) * tractorSpeed;
Direction = new Vector2(-1, 0) * movementSpeed;
Position = Position + Direction;
}
else
@ -97,6 +105,12 @@ class HandleRotation
}
}
oldSpeed = crops.getSpeedFactor(tractorSpeed);
if (oldDeltaPosition.X < 1 && oldDeltaPosition.X > -1 && oldDeltaPosition.Y < 1 && oldDeltaPosition.Y > -1)
{
Position = Target;
}
oldMovementSpeed = Direction;
return Position;
}
@ -104,4 +118,19 @@ class HandleRotation
{
return Rotation;
}
public bool checkTile(Vector2 Position, int tileSize, int Spacing, float tractorSpeed, Crops crop)
{
Vector2 newTile = new Vector2((float)Math.Round(Position.X / (tileSize + Spacing)), (float)Math.Round(Position.Y / (tileSize + Spacing)));
if (oldTile != newTile)
{
oldTile = newTile;
movementSpeed = crop.getSpeedFactor(tractorSpeed);
return true;
}
else
{
return false;
}
}
}

View File

@ -7,7 +7,7 @@ using System.Threading.Tasks;
class Cargo
{
private Items[,] items = new Items[2, 30];
private Items[,] items = new Items[2, 351];
private int[] Count = new int[2];
@ -25,17 +25,17 @@ class Cargo
items[0, 6] = new Items("Urea", 1, 6);
//Crop Seed Storage
items[1, 0] = new Items("Barley", 1, 0);
items[1, 0] = new Items("Barley", 2, 0);
items[1, 1] = new Items("Cotton", 1, 1);
items[1, 2] = new Items("Ground Nuts", 1, 2);
items[1, 3] = new Items("Maize", 1, 3);
items[1, 4] = new Items("Millets", 1, 4);
items[1, 5] = new Items("Oil Seeds", 1, 5);
items[1, 6] = new Items("Paddy", 1, 6);
items[1, 7] = new Items("Pulses", 1, 7);
items[1, 8] = new Items("Sugarcane", 1, 8);
items[1, 9] = new Items("Tobacco", 1, 9);
items[1, 10] = new Items("Wheat", 1, 10);
items[1, 2] = new Items("Ground Nuts", 5, 2);
items[1, 3] = new Items("Maize", 3, 3);
items[1, 4] = new Items("Millets", 4, 4);
items[1, 5] = new Items("Oil Seeds", 4, 5);
items[1, 6] = new Items("Paddy", 5, 6);
items[1, 7] = new Items("Pulses", 5, 7);
items[1, 8] = new Items("Sugarcane", 3, 8);
items[1, 9] = new Items("Tobacco", 2, 9);
items[1, 10] = new Items("Wheat", 2, 10);
}
public void addItem(Items item, int Type)

View File

@ -11,7 +11,7 @@ using Microsoft.Xna.Framework.Input;
class Inventory
{
private int Weight = 0;
private int maxWeight = 25;
private int maxWeight = 350;
private Cargo cargo = new Cargo();
private Cargo itemStorage = new Cargo();
@ -101,6 +101,7 @@ class Inventory
public void removeItem(int Index, int Type)
{
Weight = Weight - itemStorage.getItemByIndex(Index, Type).getWeight();
cargo.removeItem(Index, Type);
}
@ -109,6 +110,37 @@ class Inventory
return itemStorage;
}
public void clearInventory()
{
for (int i = 0; i <= 6; i++)
while (useItem(i, 0)) ;
for (int i = 0; i <= 10; i++)
while (useItem(i, 1)) ;
}
public void fillWithFertilizer()
{
int i = 0;
while (getWeight() < getMaxWeight())
{
if (i > 6)
i = 0;
addItem(i, 0);
i++;
}
}
public bool isMissingFertilizer()
{
for (int i = 0; i <= 6; i++)
{
if (!itemExists(i, 0))
return true;
}
return false;
}
public void printItems(Input input, SpriteBatch spriteBatch, SpriteFont Bold)
{

View File

@ -1,14 +1,19 @@
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System;
class Tractor
{
private int Spacing, sizeTile, Speed = 1;
private float tractorSpeed = 1;
private Vector2 Position, TargetPosition, Size, housePos;
private Vector2 Position, TargetPosition, Size, housePos, oldDeltaPosition, DeltaPosition;
private Path path = new Path();
private SmartTractor smartTractor = new SmartTractor();
private HandleRotation handleRotation = new HandleRotation();
private int WaitFrame = 30;
private int j;
public void updateSizing(Input input, int Status, Vector2 newHousePos, DayNightCycle Time)
{
@ -18,6 +23,7 @@ class Tractor
updatePosition(input.getSize(), Status);
housePos = newHousePos;
smartTractor.UpdateCrops(Speed);
}
public void init(Rectangle house, Input input)
@ -26,13 +32,14 @@ class Tractor
Spacing = input.getSpacing();
Position = housePos;
TargetPosition = new Vector2(house.X, house.Y);
smartTractor.init();
smartTractor.init(new Vector2(house.X, house.Y));
}
// Runs when the tractor reaches a tile
private void updateDirection(Vector2 Size, Vector2 newPosition)
{
Vector2 DeltaPosition = TargetPosition - Position;
DeltaPosition = TargetPosition - Position;
handleRotation.checkTile(Position, sizeTile, Spacing, tractorSpeed, smartTractor.getFarm().getCrop((int)Math.Round(Position.X / (sizeTile + Spacing)), (int)Math.Round(Position.Y / (sizeTile + Spacing))));
if (DeltaPosition.X == 0)
{
@ -42,30 +49,49 @@ class Tractor
}
else if (DeltaPosition.Y > 0)
{
Position = handleRotation.UpdatePosition(0, tractorSpeed, Position);
Position = handleRotation.UpdatePosition(0, tractorSpeed, Position, smartTractor.getFarm().getCrop((int)Math.Round(Position.X / (sizeTile + Spacing)), (int)Math.Round(Position.Y / (sizeTile + Spacing))), DeltaPosition, TargetPosition);
}
else if (DeltaPosition.Y < 0)
{
Position = handleRotation.UpdatePosition(1, tractorSpeed, Position);
Position = handleRotation.UpdatePosition(1, tractorSpeed, Position, smartTractor.getFarm().getCrop((int)Math.Round(Position.X / (sizeTile + Spacing)), (int)Math.Round(Position.Y / (sizeTile + Spacing))), DeltaPosition, TargetPosition);
}
}
else if (DeltaPosition.X > 0)
{
Position = handleRotation.UpdatePosition(2, tractorSpeed, Position);
Position = handleRotation.UpdatePosition(2, tractorSpeed, Position, smartTractor.getFarm().getCrop((int)Math.Round(Position.X / (sizeTile + Spacing)), (int)Math.Round(Position.Y / (sizeTile + Spacing))), DeltaPosition, TargetPosition);
}
else if (DeltaPosition.X < 0)
{
Position = handleRotation.UpdatePosition(3, tractorSpeed, Position);
Position = handleRotation.UpdatePosition(3, tractorSpeed, Position, smartTractor.getFarm().getCrop((int)Math.Round(Position.X / (sizeTile + Spacing)), (int)Math.Round(Position.Y / (sizeTile + Spacing))), DeltaPosition, TargetPosition);
}
}
public void updatePosition(Vector2 Size, int Status) // updates the position
{
//farm.updateSize(Size, sizeTile, Spacing);
for (int i = 0; i < Speed; i++)
{
updateDirection(Size, Position);
/*
if (!smartTractor.getWaitTwoFrames())
{
updateDirection(Size, Position);
j = WaitFrame;
}
else if (j != 0)
{
j--;
}
else
{
smartTractor.setWaitTwoFrames(false);
}*/
}
}

View File

@ -42,9 +42,9 @@ class Astar
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, currentPos.Y - 1), 2),
new Nodes(new Vector2(currentPos.X, currentPos.Y + 1), 2),
new Nodes(new Vector2(currentPos.X - 1, currentPos.Y), -1),
};
@ -75,9 +75,9 @@ class Astar
if (currDir == newDir)
return 0;
else if (Math.Abs(currDir - newDir) == 1 || Math.Abs(currDir - newDir) == 3)
return 20;
return 3;
else if (Math.Abs(currDir - newDir) == 0 || Math.Abs(currDir - newDir) == 2)
return 900;
return 9;
return 0;
}
@ -163,4 +163,71 @@ class Astar
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);
}
}
}
}
while (current != null)
{
path.AddNode(current);
current = current.getParent();
}
openList.deleteHeap();
closedList.deleteHeap();
if (path.getByIndex(0).getCords() != targetPos)
return false;
else
return true;
}
}

View File

@ -46,4 +46,9 @@ class PriorityQueueC5
queue.AddAll(entryList);
}
public int getCount()
{
return queue.Count();
}
}

View File

@ -1,18 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Game1.Sources
{
class Queue
{
private Task[] task;
public void Sort()
{
}
}
}

View File

@ -15,8 +15,10 @@ class AI
private Vector2 Size;
private Vector2 targetPos;
private Inventory inventory = new Inventory();
private FertilizerHolder fertilizerHolder = new FertilizerHolder();
private int Rotation;
private Astar astar = new Astar();
public bool WaitTwoFrames { get; set; }
private Random r = new Random();
@ -44,14 +46,26 @@ class AI
inventory.printItems(input, spriteBatch, Bold);
}
public Vector2 newTarget()
public Path newTarget()
{
PriorityQueueC5 queue = new PriorityQueueC5();
int score = 0;
int count = 0;
int testsize = 2;
Vector2 newTarget;
Path newTarget;
Nodes nodes;
if (astar.GetAdjacentNodes(tractorPos).Count == 0)
nodes = new Nodes(housePos);
else
nodes = astar.GetAdjacentNodes(tractorPos)[0];
if (tractorPos != housePos)
if (inventory.getWeight() == inventory.getMaxWeight() || inventory.isMissingFertilizer())
{
astar.update(farm.getCrops(), Size, tractorPos, housePos, housePos, Rotation);
return astar.FindPath(true);
}
while (true)
{
for (int x = 0; x < Size.X; x++)
@ -59,38 +73,57 @@ class AI
{
if (farm.getCrop(x, y).getStatus() >= 2 && tractorPos != new Vector2(x, y))
{
score = calculateSoilScore(x, y);
queue.AddToQueue(x, y, score);
if (farm.getCrop(x, y).getCropTimer() == 1 || farm.getCrop(x, y).getStatus() == 2)
count++;
if (farm.getCrop(x, y).getStatus() != 2 && (farm.getCrop(x, y).getProductionRate() > 0.99f || !farm.getCrop(x, y).belowCapacity()))
{
//skip growing fields with high production rate
}
else
{
score = calculateSoilScore(x, y);
queue.AddToQueue(x, y, score);
if (farm.getCrop(x, y).getCropTimer() == 1 || farm.getCrop(x, y).getStatus() == 2)
count++;
}
}
}
if (count > 0)
break;
else if (tractorPos != housePos)
return newTarget = GetMaxFNode(testsize, queue);
/*
else if (tractorPos == housePos)
{
List<Nodes> temp = astar.GetAdjacentNodes(tractorPos);
return temp[0].getCords();
}
*/
}
newTarget = GetMinFNode(Math.Min(testsize, count), queue);
if (queue.getCount() == 0)
{
astar.update(farm.getCrops(), Size, tractorPos, housePos, nodes.getCords(), Rotation);
return newTarget = astar.FindPath(true);
}
newTarget = GetMinFNode(Math.Min(testsize, queue.getCount()), queue);
queue = null;
return newTarget;
}
public Farm changeCropStatus()
{
if (farm.getCrop((int)tractorPos.X, (int)tractorPos.Y).getCropTimer() == 1)
int x = (int)tractorPos.X;
int y = (int)tractorPos.Y;
Fertilizer fertilizer = new Fertilizer();
fertilizerHolder.init();
WaitTwoFrames = false;
if (farm.getCrop(x, y).getStatus() >= 2)
{
fertilizer = fertilizerHolder.GetFertilizer(Engine.PredictFertilizer(farm.getCrop(x, y), farm.getPresetCropTypes(farm.getCrop(x, y).getCropType())));
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);
fertilizer = fertilizerHolder.GetFertilizer(Engine.PredictFertilizer(farm.getCrop(x, y), farm.getPresetCropTypes(farm.getCrop(x, y).getCropType())));
WaitTwoFrames = true;
}
}
if (farm.getCrop(x, y).getCropTimer() == 1)
{
farm.setCropStatus(tractorPos.X, tractorPos.Y);
if (farm.getCrop((int)tractorPos.X, (int)tractorPos.Y).getStatus() == 2)
if (farm.getCrop(x, y).getStatus() == 2)
{
inventory.addItem(farm.getCrop((int)tractorPos.X, (int)tractorPos.Y).getCropType() - 1, 1);
inventory.addItem(farm.getCrop(x, y).getCropType() - 1, 1);
}
}
@ -104,33 +137,38 @@ class AI
private int calculateSoilScore(int x, int y)
{
int score = 0;
int statusScore = 0;
int timerScore = 0;
int score = 1;
int statusScore = 1;
int timerScore = 1;
int saturationScore = 1;
int productionRateScore = 1;
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);
SoilProperties soilP = crop.getSoilProperties();
int cropType = crop.getCropType();
CropTypes avgHold = holder.getPresetCropTypes(cropType);
if (crop.getStatus() == 2)
statusScore = 25;
else if (crop.getStatus() == 3)
statusScore = -100;
else
statusScore = 1;
if (crop.getCropTimer() == 1)
timerScore = 999;
timerScore = 100;
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))
saturationScore = 5;
else
statusScore = 0;
{
saturationScore = -100;
}
score = (int)(crop.getProductionRate(avgHold) * 10);
return score + (-aproxDistance * 5) + statusScore + timerScore;
return score + (-aproxDistance * 5) + statusScore + timerScore + saturationScore;
}
private float norm(float min, float max, float val)
@ -138,12 +176,13 @@ class AI
return ((val - min) / (max - min));
}
public Vector2 GetMinFNode(int testSize, PriorityQueueC5 queue)
public Path GetMinFNode(int testSize, PriorityQueueC5 queue)
{
int index = 0;
int min = 9999;
Path path = new Path();
List<PQEntry> entryList = new List<PQEntry>();
Path[] pathList = new Path[testSize];
for (int i = 0; i < testSize; i++)
{
entryList.Add(queue.DeleteMax());
@ -152,7 +191,9 @@ class AI
for (int i = 0; i < testSize; i++)
{
Nodes temp = new Nodes(entryList[i].Coordinates);
astar.update(farm.getCrops(), Size, tractorPos, housePos, temp.getCords(), Rotation);
path = astar.FindPath(false);
pathList[i] = path;
Nodes tempF = new Nodes(path.getByIndex(0));
if (min > tempF.getF())
{
@ -160,21 +201,17 @@ class AI
index = i;
}
}
PQEntry minEntry = entryList[index];
entryList.RemoveAt(index);
//add the non-minimum entries back to the queue.
queue.AddAll(entryList);
return minEntry.Coordinates;
return pathList[index].FlipArray();
}
public Vector2 GetMaxFNode(int testSize, PriorityQueueC5 queue)
public Path GetMaxFNode(int testSize, PriorityQueueC5 queue)
{
int index = 0;
int max = -9999;
Path path = new Path();
List<PQEntry> entryList = new List<PQEntry>();
Path[] pathList = new Path[testSize];
for (int i = 0; i < testSize; i++)
{
entryList.Add(queue.DeleteMax());
@ -183,7 +220,9 @@ class AI
for (int i = 0; i < testSize; i++)
{
Nodes temp = new Nodes(entryList[i].Coordinates);
astar.update(farm.getCrops(), Size, tractorPos, housePos, temp.getCords(), Rotation);
path = astar.FindPath(false);
pathList[i] = path;
Nodes tempF = new Nodes(path.getByIndex(0));
if (max < tempF.getF())
{
@ -191,13 +230,16 @@ class AI
index = i;
}
}
PQEntry minEntry = entryList[index];
entryList.RemoveAt(index);
//add the non-minimum entries back to the queue.
queue.AddAll(entryList);
return pathList[index].FlipArray();
}
public void reloadCargo()
{
inventory.clearInventory();
inventory.fillWithFertilizer();
return minEntry.Coordinates;
}

View File

@ -20,10 +20,13 @@ class SmartTractor
farm.UpdatePreferedCrops(Size);
farm = ai.changeCropStatus();
astar.update(farm.getCrops(), Size, tractorPos / (tileSize + Spacing), housePos / (tileSize + Spacing), Rotation);
getTargetPosition(ai.newTarget());
astar.update(farm.getCrops(), Size, tractorPos / (tileSize + Spacing), housePos / (tileSize + Spacing), Target / (tileSize + Spacing), Rotation);
//getTargetPosition(ai.newTarget());
//astar.update(farm.getCrops(), Size, tractorPos / (tileSize + Spacing), housePos / (tileSize + Spacing), Target / (tileSize + Spacing), Rotation);
if (tractorPos == housePos)
ai.reloadCargo();
return astar.FindPath(true);
return ai.newTarget();
//return astar.FindPath(true);
}
@ -43,9 +46,10 @@ class SmartTractor
}
public void init()
public void init(Vector2 nHousePos)
{
ai.init();
housePos = nHousePos;
farm.init(new Vector2(100, (GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height / tileSize) - 125 / tileSize), housePos / (tileSize + Spacing));
}
@ -81,4 +85,14 @@ class SmartTractor
{
return ai.getInventory();
}
public bool getWaitTwoFrames()
{
return ai.WaitTwoFrames;
}
public void setWaitTwoFrames(bool input)
{
ai.WaitTwoFrames = input;
}
}

View File

@ -1,23 +0,0 @@
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
namespace Game1.Sources
{
class Task
{
private Vector2 Position;
private int Objective;
private float timer;
public void setTimer(float newTimer)
{
timer = newTimer;
}
public void updateTimer()
{
timer = timer - 1 / 60;
}
}
}

View File

@ -1,220 +0,0 @@
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using System;
class Tractor
{
static private Vector2 Position;
private Vector2 TargetPosition;
private Vector2 Direction;
private int Spacing, sizeTile;
private int Speed = 1;
private Vector2 Size;
private Random r = new Random();
private Farm farm = new Farm();
private Vector2 housePos;
private String currentTask;
private SmartTractor smartTractor = new SmartTractor();
private int Score;
private int previousTask;
public void updateSizing(Input input, int Status, Vector2 newHousePos)
{
Spacing = input.getSpacing();
sizeTile = input.getTileSize();
Size = input.getSize();
updatePosition(input.getSize(), Status);
housePos = newHousePos;
}
public void init(Rectangle house)
{
sizeTile = 56;
Spacing = 1;
farm.init(new Vector2(100, (GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height / sizeTile) - 125 / sizeTile));
Position = housePos;
}
private int updateDirection(Vector2 Size, Vector2 newPosition) /// Runs when the tractor reaches a tile
{
Vector2 DeltaPosition = TargetPosition - Position;
if (DeltaPosition.X == 0)
{
if (DeltaPosition.Y == 0)
{
if (housePos != Position)
{
int x = (int)Position.X / (sizeTile + Spacing);
int y = (int)Position.Y / (sizeTile + Spacing);
currentTask = currentTaskDecider(farm.getCrop(x, y).Status, 0);
farm.setCropStatus(x, y, Spacing);
setTargetPosition(housePos); //Returns to the farm
}
else
{
setTargetPosition(smartTractor.returnChoice()); //Sets a random Target
int xTarget = (int)TargetPosition.X / (sizeTile + Spacing);
int yTarget = (int)TargetPosition.Y / (sizeTile + Spacing);
currentTask = currentTaskDecider(farm.getCrop(xTarget, yTarget).Status, 1);
}
return 1;
}
else if (DeltaPosition.Y > 0)
{
Direction = new Vector2(0, 1);
return 0;
}
else if (DeltaPosition.Y < 0)
{
Direction = new Vector2(0, -1);
return 0;
}
return 0;
}
else if (DeltaPosition.X > 0)
{
Direction = new Vector2(1, 0);
return 0;
}
else if (DeltaPosition.X < 0)
{
Direction = new Vector2(-1, 0);
return 0;
}
return 0;
}
public void updatePosition(Vector2 Size, int Status) /// updates the position
{
farm.updateSize(Size, sizeTile, Spacing);
for (int i = 0; i < Speed; i++) //Where all the choices the tractor does comes from
{
smartTractor.updateMap(Position, housePos, farm.getCrops(), Size, sizeTile, Spacing, Score);
Position = Position + Direction;
updateDirection(Size, Position);
}
}
public Vector2 getPos()
{
return Position;
}
public void increaseSpeed()
{
Speed++;
}
public void decreaseSpeed()
{
if (Speed > 0)
{
Speed--;
}
}
private void setTargetPosition(Vector2 newPosition) /// sets the TargetPosition once it reaches its destination
{
TargetPosition = newPosition;
}
public void setSpeed(int newSpeed)
{
Speed = newSpeed;
}
public int getSpeed()
{
return Speed;
}
public void setPos(Vector2 newPos)
{
Position = newPos;
}
public Farm getFarm()
{
return farm;
}
public Vector2 getTargetPosition()
{
return TargetPosition;
}
public String getCurrentTask()
{
return currentTask;
}
public int getScore()
{
return Score;
}
private String currentTaskDecider(int Status, int Stage)
{
previousTask = Status;
if (previousTask == 3 && Stage != 1)
{
Score++;
}
if (Stage == 0)
{
if (Status == 0)
{
return "Returning with nothing after going out for a stroll";
}
else if (Status == 1)
{
return "Returning with nothing after planting seeds";
}
else if (Status == 2)
{
return "Returning with nothing after adding fertilizer";
}
else if (Status == 3)
{
return "Returning with Crops";
}
}
else
{
if (Status == 0)
{
return "Going for a stroll";
}
else if (Status == 1)
{
return "Planting seeds";
}
else if (Status == 2)
{
return "Adding fertilizer";
}
else if (Status == 3)
{
return "Going for Crops";
}
}
return null;
}
}

View File

@ -1,46 +0,0 @@
using System;
using Microsoft.Xna.Framework;
using System;
class SmartTractor
{
private Crops[,] crops;
private Vector2 housePos;
private Vector2 tractorPos;
private Vector2 Size;
private int tileSize;
private int Score;
private int Spacing;
private Random r = new Random();
public Vector2 returnChoice()
{
return new Vector2(r.Next(0, (int)Size.X), r.Next(0, (int)Size.Y)) * (tileSize + Spacing);
}
public void updateMap(Vector2 newTractorPos, Vector2 newHousePos, Crops[,] newCropsStatus, Vector2 newSize, int newTileSize, int newSpacing, int newScore)
{
crops = newCropsStatus;
housePos = newHousePos;
tractorPos = newTractorPos;
Size = newSize;
tileSize = newTileSize;
Spacing = newSpacing;
Score = newScore;
}
}

View File

@ -7,14 +7,14 @@
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.2.5.0" newVersion="1.2.5.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.2.5.0" newVersion="1.2.5.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks.Dataflow" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.6.5.0" newVersion="4.6.5.0" />

View File

@ -0,0 +1,210 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\LightGBM.2.3.1\build\LightGBM.props" Condition="Exists('..\packages\LightGBM.2.3.1\build\LightGBM.props')" />
<Import Project="..\packages\Microsoft.ML.FastTree.1.4.0\build\netstandard2.0\Microsoft.ML.FastTree.props" Condition="Exists('..\packages\Microsoft.ML.FastTree.1.4.0\build\netstandard2.0\Microsoft.ML.FastTree.props')" />
<Import Project="..\packages\Microsoft.ML.1.4.0\build\netstandard2.0\Microsoft.ML.props" Condition="Exists('..\packages\Microsoft.ML.1.4.0\build\netstandard2.0\Microsoft.ML.props')" />
<Import Project="..\packages\Microsoft.ML.CpuMath.1.4.0\build\netstandard2.0\Microsoft.ML.CpuMath.props" Condition="Exists('..\packages\Microsoft.ML.CpuMath.1.4.0\build\netstandard2.0\Microsoft.ML.CpuMath.props')" />
<Import Project="$(MSBuildExtensionsPath)\MonoGame\v3.0\MonoGame.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\MonoGame\v3.0\MonoGame.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{650E4519-2DEF-496F-AC3B-3C794DC7CF0D}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Game1</RootNamespace>
<AssemblyName>Game1</AssemblyName>
<FileAlignment>512</FileAlignment>
<MonoGamePlatform>Windows</MonoGamePlatform>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<TargetFrameworkProfile />
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\</OutputPath>
<DefineConstants>DEBUG;TRACE;WINDOWS</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\</OutputPath>
<DefineConstants>TRACE;WINDOWS</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>Icon.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup>
<ApplicationManifest>app.manifest</ApplicationManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;WINDOWS</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE;WINDOWS</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Compile Include="Game1.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Sources\ML\MLModel.cs" />
<Compile Include="Sources\ML\ModelOutput.cs" />
<Compile Include="Sources\ML\ModelInput.cs" />
<Compile Include="Sources\Objects\House.cs" />
<Compile Include="Sources\Crops\Crops.cs" />
<Compile Include="Sources\Crops\Farm.cs" />
<Compile Include="Sources\Controlls\Input.cs" />
<Compile Include="Sources\Objects\Inventory.cs" />
<Compile Include="Sources\Objects\tractorPositionCorrector.cs" />
<Compile Include="Sources\Pathing\A-Star\Astar.cs" />
<Compile Include="Sources\Pathing\A-Star\PathSaver\MinHeap.cs" />
<Compile Include="Sources\Pathing\A-Star\PathSaver\Nodes.cs" />
<Compile Include="Sources\Pathing\A-Star\PathSaver\Path.cs" />
<Compile Include="Sources\Pathing\A-Star\PathSaver\PriorityQueue.cs" />
<Compile Include="Sources\Controlls\Controller.cs" />
<Compile Include="Sources\Smart\AI.cs" />
<Compile Include="Sources\Smart\ScoreSystem.cs" />
<Compile Include="Sources\Smart\SmartTractor.cs" />
<Compile Include="Sources\Objects\Tractor.cs" />
</ItemGroup>
<ItemGroup>
<Reference Include="Microsoft.ML.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.ML.1.4.0\lib\netstandard2.0\Microsoft.ML.Core.dll</HintPath>
</Reference>
<Reference Include="Microsoft.ML.CpuMath, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.ML.CpuMath.1.4.0\lib\netstandard2.0\Microsoft.ML.CpuMath.dll</HintPath>
</Reference>
<Reference Include="Microsoft.ML.Data, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.ML.1.4.0\lib\netstandard2.0\Microsoft.ML.Data.dll</HintPath>
</Reference>
<Reference Include="Microsoft.ML.DataView, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.ML.DataView.1.4.0\lib\netstandard2.0\Microsoft.ML.DataView.dll</HintPath>
</Reference>
<Reference Include="Microsoft.ML.FastTree, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.ML.FastTree.1.4.0\lib\netstandard2.0\Microsoft.ML.FastTree.dll</HintPath>
</Reference>
<Reference Include="Microsoft.ML.KMeansClustering, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.ML.1.4.0\lib\netstandard2.0\Microsoft.ML.KMeansClustering.dll</HintPath>
</Reference>
<Reference Include="Microsoft.ML.LightGbm, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.ML.LightGbm.1.4.0\lib\netstandard2.0\Microsoft.ML.LightGbm.dll</HintPath>
</Reference>
<Reference Include="Microsoft.ML.PCA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.ML.1.4.0\lib\netstandard2.0\Microsoft.ML.PCA.dll</HintPath>
</Reference>
<Reference Include="Microsoft.ML.StandardTrainers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.ML.1.4.0\lib\netstandard2.0\Microsoft.ML.StandardTrainers.dll</HintPath>
</Reference>
<Reference Include="Microsoft.ML.Transforms, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.ML.1.4.0\lib\netstandard2.0\Microsoft.ML.Transforms.dll</HintPath>
</Reference>
<Reference Include="MonoGame.Framework">
<HintPath>$(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\Windows\MonoGame.Framework.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.CodeDom, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.CodeDom.4.7.0\lib\net461\System.CodeDom.dll</HintPath>
</Reference>
<Reference Include="System.Collections.Immutable, Version=1.2.5.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Collections.Immutable.1.7.0\lib\netstandard2.0\System.Collections.Immutable.dll</HintPath>
</Reference>
<Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.7.1\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Tasks.Dataflow, Version=4.6.5.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Threading.Tasks.Dataflow.4.11.0\lib\netstandard2.0\System.Threading.Tasks.Dataflow.dll</HintPath>
</Reference>
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Content Include="Content\Crop.png" />
<Content Include="Content\house.png" />
<Content Include="Content\ProgressionBarStatus.png" />
<Content Include="Content\ProgressionBar.png" />
<Content Include="Content\Markers.png" />
<Content Include="Content\Mountain.png" />
<Content Include="Content\Planted.png" />
<Content Include="Content\Tile.png" />
<Content Include="Content\tileunplantable.png" />
<Content Include="Content\Tractor.png" />
<Content Include="Icon.ico" />
<None Include="Resources\TextFile1.txt" />
</ItemGroup>
<ItemGroup>
<MonoGameContentReference Include="Content\Content.mgcb" />
<None Include="app.config" />
<None Include="app.manifest" />
<None Include="packages.config" />
<None Include="Sources\ML\Data\Fertilizer Prediction.csv" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath)\MonoGame\v3.0\MonoGame.Content.Builder.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Microsoft.ML.CpuMath.1.4.0\build\netstandard2.0\Microsoft.ML.CpuMath.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.ML.CpuMath.1.4.0\build\netstandard2.0\Microsoft.ML.CpuMath.props'))" />
<Error Condition="!Exists('..\packages\Microsoft.ML.1.4.0\build\netstandard2.0\Microsoft.ML.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.ML.1.4.0\build\netstandard2.0\Microsoft.ML.props'))" />
<Error Condition="!Exists('..\packages\Microsoft.ML.1.4.0\build\netstandard2.0\Microsoft.ML.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.ML.1.4.0\build\netstandard2.0\Microsoft.ML.targets'))" />
<Error Condition="!Exists('..\packages\Microsoft.ML.FastTree.1.4.0\build\netstandard2.0\Microsoft.ML.FastTree.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.ML.FastTree.1.4.0\build\netstandard2.0\Microsoft.ML.FastTree.props'))" />
<Error Condition="!Exists('..\packages\LightGBM.2.3.1\build\LightGBM.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\LightGBM.2.3.1\build\LightGBM.props'))" />
<Error Condition="!Exists('..\packages\LightGBM.2.3.1\build\LightGBM.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\LightGBM.2.3.1\build\LightGBM.targets'))" />
</Target>
<Import Project="..\packages\Microsoft.ML.1.4.0\build\netstandard2.0\Microsoft.ML.targets" Condition="Exists('..\packages\Microsoft.ML.1.4.0\build\netstandard2.0\Microsoft.ML.targets')" />
<Import Project="..\packages\LightGBM.2.3.1\build\LightGBM.targets" Condition="Exists('..\packages\LightGBM.2.3.1\build\LightGBM.targets')" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@ -0,0 +1,174 @@
<!DOCTYPE html>
<!-- saved from url=(0014)about:internet -->
<html xmlns:msxsl="urn:schemas-microsoft-com:xslt"><head><meta content="en-us" http-equiv="Content-Language" /><meta content="text/html; charset=utf-16" http-equiv="Content-Type" /><title _locID="NuGetUpgradeReportTitle">
NuGetMigrationLog
</title><style>
/* Body style, for the entire document */
body
{
background: #F3F3F4;
color: #1E1E1F;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
font-size: 12pt;
padding: 0;
margin: 0;
}
/* Header1 style, used for the main title */
h1
{
padding: 10px 0px 10px 10px;
font-size: 21pt;
background-color: #E2E2E2;
border-bottom: 1px #C1C1C2 solid;
color: #201F20;
margin: 0;
font-weight: normal;
}
/* Header2 style, used for "Overview" and other sections */
h2
{
font-size: 18pt;
font-weight: normal;
padding: 15px 0 5px 0;
margin: 0;
}
/* Header3 style, used for sub-sections, such as project name */
h3
{
font-weight: normal;
font-size: 15pt;
margin: 0;
padding: 15px 0 5px 0;
background-color: transparent;
}
.info-text
{
margin: 0px 0 0.75em 0;
}
/* Color all hyperlinks one color */
a
{
color: #1382CE;
}
/* Table styles */
table
{
border-spacing: 0 0;
border-collapse: collapse;
font-size: 11pt;
}
table th
{
background: #E7E7E8;
text-align: left;
text-decoration: none;
font-weight: normal;
padding: 3px 6px 3px 6px;
}
table td
{
vertical-align: top;
padding: 3px 6px 5px 5px;
margin: 0px;
border: 1px solid #E7E7E8;
background: #F7F7F8;
}
/* Local link is a style for hyperlinks that link to file:/// content, there are lots so color them as 'normal' text until the user mouse overs */
.localLink
{
color: #1E1E1F;
background: #EEEEED;
text-decoration: none;
}
.localLink:hover
{
color: #1382CE;
background: #FFFF99;
text-decoration: none;
}
.issueCell
{
width: 100%;
}
.packageIssue
{
margin-left: 25px;
}
/* Padding around the content after the h1 */
#content
{
padding: 0px 20px 20px 20px;
}
.issues table
{
width: 97%;
}
/* All Icons */
.IconSuccessEncoded, .IconInfoEncoded, .IconWarningEncoded, .IconErrorEncoded
{
min-width:18px;
min-height:18px;
background-repeat:no-repeat;
background-position:center;
}
.IconSuccessEncoded
{
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABcElEQVR4Xq2TsUsCURzHv15g8ZJcBWlyiYYgCIWcb9DFRRwMW5TA2c0/QEFwFkxxUQdxVlBwCYWOi6IhWgQhBLHJUCkhLr/BW8S7gvrAg+N+v8/v+x68Z8MGy+XSCyABQAXgBgHGALoASkIIDWSLeLBetdHryMjd5IxQPWT4rn1c/P7+xxp72Cs9m5SZ0Bq2vPnbPFafK2zDvmNHypdC0BPkLlQhxJsCAhQoZwdZU5mwxh720qGo8MzTxTTKZDPCx2HoVzp6lz0Q9tKhyx0kGs8Ny+TkWRKk8lCROwEduhyg9l/6lunOPSfmH3NUH6uQ0KHLAe7JYvJjevm+DAMGJHToKtigE+vwvIidxLamb8IBY9e+C5LiXREkfho3TSd06HJA13/oh6T51MTsfQbHrsMynQ5dDihFjiK8JJAU9AKIWTp76dCVN7HWHrajmUEGvyF9nkbAE6gLIS7kTUyuf2gscLoJrElZo/Mvj+nPz/kLTmfnEwP3tB0AAAAASUVORK5CYII=);
}
.IconInfoEncoded
{
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHElEQVR4Xs2TsUoDQRRF7wwoziokjZUKadInhdhukR9YP8DMX1hYW+QvdsXa/QHBbcXC7W0CamWTQnclFutceIQJwwaWNLlwm5k5d94M76mmaeCrrmsLYOocY12FcxZFUeozCqKqqgYA8uevv1H6VuPxcwlfk5N92KHBxfFeCSAxxswlYAW/Xr989x/mv9gkhtyMDhcAxgzRsp7flj8B/HF1RsMXq+NZMkopaHe7lbKxQUEIGbKsYNoGn969060hZBkQex/W8oRQwsQaW2o3Ago2SVcJUzAgY3N0lTCZZm+zPS8HB51gMmS1DEYyOz9acKO1D8JWTlafKIMxdhvlfdyT94Vv5h7P8Ky7nQzACmhvKq3zk3PjW9asz9D/1oigecsioooAAAAASUVORK5CYII=);
}
.IconWarningEncoded
{
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAx0lEQVR4XpWSMQ7CMAxFf4xAyBMLCxMrO8dhaBcuwdCJS3RJBw7SA/QGTCxdWJgiQYWKXJWKIXHIlyw5lqr34tQgEOdcBsCOx5yZK3hCCKdYXneQkh4pEfqzLfu+wVDSyyzFoJjfz9NB+pAF+eizx2Vruts0k15mPgvS6GYvpVtQhB61IB/dk6AF6fS4Ben0uIX5odtFe8Q/eW1KvFeH4e8khT6+gm5B+t3juyDt7n0jpe+CANTd+oTUjN/U3yVaABnSUjFz/gFq44JaVSCXeQAAAABJRU5ErkJggg==);
}
.IconErrorEncoded
{
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABQElEQVR4XqWTvUoEQRCE6wYPZUA80AfwAQz23uCMjA7MDRQEIzPBVEyNTQUFIw00vcQTTMzuAh/AxEQQT8HF/3G/oGGnEUGuoNnd6qoZuqltyKEsyzVJq5I6rnUp6SjGeGhESikzzlc1eL7opfuVbrqbU1Zw9NCgtQMaZpY0eNnaaL2fHusvTK5vKu7sjSS1Y4y3QUA6K3e3Mau5UFDyMP7tYF9o8cAHZv68vipoIJg971PZIZ5HiwdvYGGvFVFHmGmZ2MxwmQYPXubPl9Up0tfoMQGetXd6mRbvhBw+boZ6WF7Mbv1+GsHRk0fQmPAH1GfmZirbCfDJ61tw3Px8/8pZsPAG4jlVhcPgZ7adwNWBB68lkRQWFiTgFlbnLY3DGGM7izIJIyT/jjIvEJw6fdJTc6krDzh6aMwMP9bvDH4ADSsa9uSWVJkAAAAASUVORK5CYII=);
}
</style></head><body><h1>
NuGet Migration Report - Game1</h1><div id="content"><h2 _locID="OverviewTitle">Overview</h2><div class="info-text">Migration to PackageReference was completed successfully. Please build and run your solution to verify that all packages are available.</div><div class="info-text">
If you run into any problems, have feedback, questions, or concerns, please
<a href="https://github.com/NuGet/Home/issues/">file an issue on the NuGet GitHub repository.</a></div><div class="info-text">
Changed files and this report have been backed up here:
<a href="C:\Users\Oskar\source\repos\PotatoPlanFinal\MigrationBackup\7a07b01e\Game1">C:\Users\Oskar\source\repos\PotatoPlanFinal\MigrationBackup\7a07b01e\Game1</a></div><div class="info-text"><a href="https://aka.ms/nuget-pc2pr-migrator-rollback">Help me rollback to packages.config</a></div><h2 _locID="PackagesTitle">Packages processed</h2><h3 _locID="IncludePackagesTitle">Top-level dependencies:</h3><div class="issues"><table><tr><th class="issueCell">Package Id</th><th>Version</th></tr><tr><td class="issueCell"><span>LightGBM</span></td><td><span>
v2.3.1</span></td></tr><tr><td class="issueCell"><span>Microsoft.ML</span></td><td><span>
v1.4.0</span></td></tr><tr><td class="issueCell"><span>Microsoft.ML.CpuMath</span></td><td><span>
v1.4.0</span></td></tr><tr><td class="issueCell"><span>Microsoft.ML.FastTree</span></td><td><span>
v1.4.0</span></td></tr><tr><td class="issueCell"><span>Microsoft.ML.LightGbm</span></td><td><span>
v1.4.0</span></td></tr><tr><td class="issueCell"><span>Newtonsoft.Json</span></td><td><span>
v12.0.3</span></td></tr><tr><td class="issueCell"><span>System.CodeDom</span></td><td><span>
v4.7.0</span></td></tr><tr><td class="issueCell"><span>System.Collections.Immutable</span></td><td><span>
v1.7.0</span></td></tr><tr><td class="issueCell"><span>System.Memory</span></td><td><span>
v4.5.4</span></td></tr><tr><td class="issueCell"><span>System.Reflection.Emit.Lightweight</span></td><td><span>
v4.7.0</span></td></tr><tr><td class="issueCell"><span>System.Runtime.CompilerServices.Unsafe</span></td><td><span>
v4.7.1</span></td></tr><tr><td class="issueCell"><span>System.Threading.Tasks.Dataflow</span></td><td><span>
v4.11.0</span></td></tr></table></div><p /><h3 _locID="IncludePackagesTitle">Transitive dependencies:</h3><div class="issues"><table><tr><th class="issueCell">Package Id</th><th>Version</th></tr><tr><td class="issueCell"><span>Microsoft.ML.DataView</span></td><td><span>
v1.4.0</span></td></tr><tr><td class="issueCell"><span>System.Buffers</span></td><td><span>
v4.5.1</span></td></tr><tr><td class="issueCell"><span>System.Numerics.Vectors</span></td><td><span>
v4.5.0</span></td></tr></table></div><h2 _locID="IssuesTitle">Package compatibility issues</h2><div class="issues"><table><tr><th /><th class="issueCell" _locID="DescriptionTableHeader">Description</th></tr><tr><td class="IconInfoEncoded" /><td class="issueCell">
No issues were found.
</td></tr></table></div></div></body></html>

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="LightGBM" version="2.3.1" targetFramework="net461" />
<package id="Microsoft.ML" version="1.4.0" targetFramework="net461" />
<package id="Microsoft.ML.CpuMath" version="1.4.0" targetFramework="net461" />
<package id="Microsoft.ML.DataView" version="1.4.0" targetFramework="net461" />
<package id="Microsoft.ML.FastTree" version="1.4.0" targetFramework="net461" />
<package id="Microsoft.ML.LightGbm" version="1.4.0" targetFramework="net461" />
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net461" />
<package id="System.Buffers" version="4.5.1" targetFramework="net461" />
<package id="System.CodeDom" version="4.7.0" targetFramework="net461" />
<package id="System.Collections.Immutable" version="1.7.0" targetFramework="net461" />
<package id="System.Memory" version="4.5.4" targetFramework="net461" />
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net461" />
<package id="System.Reflection.Emit.Lightweight" version="4.7.0" targetFramework="net461" />
<package id="System.Runtime.CompilerServices.Unsafe" version="4.7.1" targetFramework="net461" />
<package id="System.Threading.Tasks.Dataflow" version="4.11.0" targetFramework="net461" />
</packages>

120
Oskar_Nastaly_ML_Report.md Normal file
View File

@ -0,0 +1,120 @@
# Machine Learning implementation report
## Introduction
Purpose of my ML implementation is for the agent (tractor) to decide what fertilizer it should use.
It's decision is mostly based on nutrients in soil, but also on few other properties.
Dataset is very small, it contains only 100 entries.
There are 7 types of fertilizers, each of them adding a specific amount of nutrients to the soil.
Example:
FertilizerType[6] = new Fertilizer
{
ID = 5,
Name = "DAP",
Nitrogen = 14.52f / 5,
Phosphorus = 1.77f / 5,
Potassium = 9.5f / 5
};
Unfortunately values of nutrients are not based on real values.
That is because even though dataset intention (by it's creator) was to be used to classify fertilizers, it looks like instead it says what fertilizer WAS used and what will be the results of using that fertilizer on some field.
E.g: Urea has 46% of Nitrogen in it and nothing else. In dataset it was classified as best fertilizer to be used on fields with already really high Nitrogen levels. That would lead to oversaturation with Nitrogen and lack of other nutrients.
So i did some calculations and Urea now looks like this:
FertilizerType[7] = new Fertilizer
{
ID = 6,
Name = "Urea",
Nitrogen = 1.81f / 5,
Phosphorus = 21.0f / 5,
Potassium = 9.5f / 5
};
// an "inversed" and little modified counterpart of real-world version of this fertilizer.
## Implementation
I used Gradient Boosting Decision Tree Algorithm for this task due to many features it has.
First a csv file is loaded:
IDataView trainingDataView = mlContext.Data.LoadFromTextFile<ModelInput>(
path: path,
hasHeader: true,
separatorChar: ',',
allowQuoting: true,
allowSparse: false);
Then it is passed to next function which will train, evaluate and build a model.
Also trainer parameters will be fine-tuned here to prevent overfitting as much as possible by:
- limiting number of leaves,
- limiting maximum tree depth,
- limiting the amount of bins per feature,
while maintaining high accuracy by:
- low learning rate combine with
- high number of iterations.
var options = new LightGbmMulticlassTrainer.Options
{
MaximumBinCountPerFeature = 8,
LearningRate = 0.00025,
NumberOfIterations = 40000,
NumberOfLeaves = 10,
LabelColumnName = "Fertilizer_NameF",
FeatureColumnName = "Features",
Booster = new DartBooster.Options()
{
MaximumTreeDepth = 10
}
};
Creating pipeline for the model:
var pipeline = mlContext.Transforms
.Text.FeaturizeText("Soil_TypeF", "Soil_Type")
.Append(mlContext.Transforms.Text.FeaturizeText("Crop_TypeF", "Crop_Type"))
.Append(mlContext.Transforms.Concatenate("Features", "Temperature", "Humidity", "Moisture", "Soil_TypeF", "Crop_TypeF", "Nitrogen", "Potassium", "Phosphorous"))
.Append(mlContext.Transforms.Conversion.MapValueToKey("Fertilizer_NameF", "Fertilizer_Name"), TransformerScope.TrainTest)
.AppendCacheCheckpoint(mLContext)
.Append(mLContext.MulticlassClassification.Trainers.LightGbm(options))
.Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel", "PredictedLabel"));
Evaluation of the pipeline is done with cross-validation method with 10 folds.
Results are as follow:
Micro Accuracy: 0.95829
LogLoss Average: 0.100171
LogLoss Reduction: 0.933795
Model is created and saved for later use, to skip long trainig and evaluation times.
Later that model is loaded and prediction engine is created when program is started.
## Integration Details
Agent (tractor) navigates trough the grid looking for tiles where it can plant some plants.
Upon planting and visitin already growing plants agent decides if any fertilizer is needed (rule based decision), and what fertilizer to use (using ML prediction engine).
if (farm.getCrop(x, y).getStatus() >= 2)
{
fertilizer = fertilizerHolder.GetFertilizer(Engine.PredictFertilizer(farm.getCrop(x, y), farm.getPresetCropTypes(farm.getCrop(x, y).getCropType())));
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);
fertilizer = fertilizerHolder.GetFertilizer(Engine.PredictFertilizer(farm.getCrop(x, y), farm.getPresetCropTypes(farm.getCrop(x, y).getCropType())));
WaitTwoFrames = true;
}
If field is properly fertilized it will have higher production rate, resulting in faster growth of a plant.
Production rate value is shown in the UI as well as it is represented by the colour of progression bar (right side of every tile).
At 100% bar will pure **Green**. Any value below will make bar more **Red**, while any value above will add **Blue**, eventually turning bar colour into cyan.
Example:
![Progression Bar](https://git.wmi.amu.edu.pl/s425077/PotatoPlan/raw/Oskar-ML/example_img.jpg)

BIN
example_img.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB