【问题标题】:What AI/ML techniques should I apply to generate a recommended games list in Java? [closed]我应该应用哪些 AI/ML 技术来在 Java 中生成推荐游戏列表? [关闭]
【发布时间】:2018-07-02 17:25:07
【问题描述】:

我正在从事一个 AI 项目,并正在尝试构建一个视频游戏选择器。

用户将输入他们想要玩的游戏的类型、模式、评级和平台。然后程序将接受该输入,然后使用一些尚未确定的逻辑在 gameList 数组中选择符合该条件的游戏。然后,它会从 gameList 数组中随机选择一个符合条件的游戏,并将随机选择的游戏作为建议输出给用户玩。

我在尝试提出使用用户输入来确定哪些游戏符合该标准的最佳方法时遇到了问题。

我目前的方法没有利用任何特殊的人工学习或机器学习概念来解决问题。我对 Java 比较陌生,我只是想拼凑出如何最好地解决这个问题。

如果有人对更好的方法有任何想法,那么我目前有或更好和更简单的方法来做这将非常有帮助!

这是我目前拥有的代码(其中一些来自之前的作业,因此请忽略 printPeas() 和其他与数组无关的东西。不幸的是,该代码目前无法正常工作:

package Games;

import java.util.Scanner;

public class Games
{
    String _gameType;
    String _genreType;
    String _gameMode;
    String _gameRating;
    String _tType;

    public static Scanner input = new Scanner(System.in);

    public Games(String type)
    {
        _gameType = type;
        System.out.println("Suggested type of game is: " + _gameType);
    }
    public Games()
    {
        _gameType = "Sports";
        System.out.println("Suggested type of game is: " + _gameType);
    }
    public void typeInput(String tType)
    {
        _tType = tType;
        System.out.println("Type of Game selected: " + _tType);
    }
    public void genreInput(String gType)
    {
        _genreType = gType;
        System.out.println("Type of Genre selected: " + _genreType);
    }
    public void modeInput(String gMode)
    {
        _gameMode = gMode;
        System.out.println("Type of Game Mode selected: " + _gameMode);
    }
    public void ratingInput(String gRating)
    {
         _gameRating = gRating;
         System.out.println("Type of Rating selected: " + _gameRating);
    }
    public void printPeas()
    {
        String agent = "Agent = Video Game Seletor.";
        String perfmeasure = "P = If it meets the users information being input.";
        String environment = "E = All games within a certain location.";
        String actuators = "A = Library of games to select from, and the display of which game was selected.";
        String sensors = "S = Keyboard input.";
        System.out.println(agent);
        System.out.println(perfmeasure);
        System.out.println(environment);
        System.out.println(actuators);
        System.out.println(sensors);
    }
}


package Games;

import java.util.ArrayList;
import java.util.Random;

public class Game
{
    public static String _genreType;
    public static String _gameMode;
    public static String _gameRating;
    public static String _gameName;

    public void setGame(String genre, String mode, String rating)
    {
        _genreType = genre;
        _gameMode = mode;
        _gameRating = rating;
        _gameName = "";

        Random random = new Random();
        String gameList[] = {"NHL '18", "Madden '18", "Call of Duty: WW2", "GTA V", "Counter-Strike: Global Offsnsive",
            "World of Warcrat", "PUBG", "Assassin's Creed Origins", "Hearthstone", "Battlefield 4"};
        String genreList[] = {"Action", "Sports", "Racing", "MMORPG", "Strategy", "Fighting", "Fantasy"};
        String modeList[] = {"Multiplayer", "Online", "Campaign"};
        String ratingList[] = {"Everyone", "E10+", "Teen", "Mature"};
        String platformList[] = {"PC", "PS4", "Xbox"};
        for(int i=0; i<gameList.length; i++) //trying to have it pull a random game name matching type, genre, mode and rating
        {
            if(genre == genreList[i])
            {
                _genreType = genre;
            }
            if(mode == modeList[i])
            {
                _gameMode = mode;
            }
                System.out.println(gameList[random.nextInt(gameList.length)]);
        }
    }
}

package Games;

import java.util.Scanner;

public class StartSelector
{
    public static String _gameType;
    public static String _genreType;
    public static String _gameMode;
    public static String _gameRating;
    public static Scanner userInput = new Scanner(System.in);
    public static void main(String[] args)
    {
        String gameType = _gameType, genreType = _genreType, gameMode = _gameMode, gameRating = _gameRating;
        Games gameType1 = new Games();
        gameType1.printPeas();
        Games gameType2 = new Games("Action");
        gameType2.printPeas();
        Games gameSelect = new Games();
        System.out.println("Please enter the Genre Type: ");
        genreType = userInput.next();
        gameSelect.genreInput(genreType);
        System.out.println("Please enter the Game Type: ");
        gameType = userInput.next();
        gameSelect.typeInput(gameType);
        System.out.println("Please enter the Game Mode: ");
        gameMode = userInput.next();
        gameSelect.modeInput(gameMode);
        System.out.println("Please enter the Game Rating: ");
        gameRating = userInput.next();
        gameSelect.ratingInput(gameRating);
        userInput.close();
        System.out.println("You have selected a " + genreType + " " 
        + gameType + " " + gameMode + " " + gameRating 
        + " game to play.");
        gameType1.setGame("Action", "Online", "Mature", "GTA V");
    }
}

【问题讨论】:

  • "所以忽略 printPeas() 和其他不重要的东西" 你的工作是将代码减少到重现问题所需的代码。 “代码当前不工作” 您需要确切地解释它是如何不工作的。错误?例外?输出错误?最后,你应该问一个具体的问题,而不是一个笼统的“我应该怎么做?”
  • 你有什么问题?您在哪里需要帮助?
  • 这个网站确实接受模糊的问题,询问“关于更好方法的任何想法” 等。你可以尝试在softwareengineering.stackexchange.com 上提问,但即使在那里你也需要更准确地说明您的问题是什么,以便有意义地回答(而不是“像讨论一样”)。

标签: java arrays random machine-learning artificial-intelligence


【解决方案1】:

您所描述的内容听起来像是经典的机器学习分类器问题。鉴于您正在为 AI 课程执行此操作,编写分类器可能正是您的教授希望您做的!

用一种非常抽象的方式,你可以做的是:

  • 为您拥有的 gameList[] 中的每个游戏的流派类型、游戏模式、游戏评级、ttype 分配数值(和权重)。

  • 在 4d 空间中为每个游戏计算一个向量。

  • 为用户输入计算一个向量

  • 为您的用户输入的游戏向量找到“最近邻”游戏向量,将此最近邻游戏向量作为建议游戏输出给您的用户

比如PUBG向量是:

  • 动作(赋值为 1)
  • 多人游戏(赋值为 1)
  • 青少年(赋值为 3)
  • platformList(赋值1+2+3)

那么你的 PUBG 向量是 。 用户输入他们想要一款适用于青少年的多人游戏并且在所有三个平台上的动作游戏,然后会给您的分类器输入 (1,1,3,6)。然后,您计算的向量与您已经计算的 PUBG 的向量相同。建议的游戏是PUBG。

这是您正在做的一个非常巧妙的项目。我上面给出的示例值只是一个示例,您肯定会想要调整它们。但这样做的目的是说明机器学习/AI 分类器如何在高水平上工作。

这类东西是机器学习/人工智能的基础,并且已经在工业中广泛使用。例如,信用卡公司将使用分类器检测欺诈行为。

您可能不需要经历在训练数据上训练分类器,然后在测试数据上对其进行测试的艰巨过程……这完全是另一回事。但是您可以使用分类器方法 - 即使用输入向量来计算输出标签,以实现您的目标。

祝你好运!

【讨论】:

  • 所以我一直在研究这个项目,并从一个文本文件中读取 gameInfo 并存储在一个数组(名称、类型、平台)中,并且还有一个正在读取的文本文件用户输入(类型,输入)。我正在尝试将 userInput 中的类型和平台与 gameInfo 中的游戏进行比较,并返回与 userInput 文本文件中的 (type, platform) 匹配的所有值。我知道使用 .equals() 是要走的路,但我如何拥有它以便它只返回两个数组中匹配的值,这样我就可以随机选择一个作为用户的最终输出?
  • 有多种方法可以做到这一点。想到的一种方法是两通滤波器。过滤器的一般概念是,它将一个数组和一个布尔 lambda 函数作为输入,并吐出一个结果数组,其中包含传入数组中满足布尔 lambda 函数的所有数组元素(在您的情况下,第一个过滤器的 lambda 为 (x) -&gt; x.equals(gametype);。第二个过滤器将是一个带有 .equals(platform) 的 lambda,在第一个过滤器吐出的数组上调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
相关资源
最近更新 更多