Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 需要关于如何实现遗传算法类型应用程序的建议吗_Java_Algorithm - Fatal编程技术网

Java 需要关于如何实现遗传算法类型应用程序的建议吗

Java 需要关于如何实现遗传算法类型应用程序的建议吗,java,algorithm,Java,Algorithm,我对java还不熟悉,似乎无法对一个问题保持清醒的头脑。我试图获取两个股票信息数组,并将它们相互比较(只保留两个数组中出现的那些)。我读了一些关于通用算法的知识,如果匹配,我希望能够创建类来为每个数组集分配适应度分数。我的代码实际上不起作用(我可以让它分析数组的每个单独组件,但不能分析我想要的范围)。为了澄清问题,以下是我的数据示例: ID date Ticker Shares 1 2011-06-19 goog 0 1 2011-06-19 ibm

我对java还不熟悉,似乎无法对一个问题保持清醒的头脑。我试图获取两个股票信息数组,并将它们相互比较(只保留两个数组中出现的那些)。我读了一些关于通用算法的知识,如果匹配,我希望能够创建类来为每个数组集分配适应度分数。我的代码实际上不起作用(我可以让它分析数组的每个单独组件,但不能分析我想要的范围)。为了澄清问题,以下是我的数据示例:

ID   date   Ticker  Shares
    1   2011-06-19  goog    0
    1   2011-06-19  ibm 0
    1   2011-06-19  gs  0
    1   2011-06-19  msft    0
    1   2011-06-19  c   5
    2   2011-06-19  goog    0
    2   2011-06-19  ibm 0
    2   2011-06-19  gs  0
    2   2011-06-19  msft    1
    2   2011-06-19  c   4
    3   2011-06-19  goog    0
    3   2011-06-19  ibm 0
    3   2011-06-19  gs  0
    3   2011-06-19  msft    2
    3   2011-06-19  c   3
    4   2011-06-19  goog    0
    4   2011-06-19  ibm 0
    4   2011-06-19  gs  0
    4   2011-06-19  msft    3
    4   2011-06-19  c   2
    5   2011-06-19  goog    0
    5   2011-06-19  ibm 0
    5   2011-06-19  gs  0
    5   2011-06-19  msft    4
    5   2011-06-19  c   1 
依此类推,我有一个数组,其中一个是前一个日期的数组。我希望能够比较(按id分组)这两者,并找到完整的匹配项。但稍后,我希望能够获得成功的匹配,并通过其他类对它们执行分析。我认为第一步是确定匹配项。这是我的代码(它只标识股票代码/股票代码的匹配项,我不确定如何使其匹配整个ID集):

public void compare(int-firstindex、int-lastIndex、Object-date1、ArrayList-data1id、ArrayList-data1ticker、ArrayList-data1shares、ArrayList-data1price、Object-date2、ArrayList-data2id、ArrayList-data2shares、ArrayList-data2price)引发异常{
ArrayList ticker=新的ArrayList();
ArrayList shares=新的ArrayList();
ArrayList价格=新的ArrayList();
while(第一个索引<最后一个索引){
//系统输出打印(“日期为”+日期1);
ticker.add(data1ticker.get(firstindex));
shares.add(data1shares.get(firstindex));
add(data1price.get(firstindex));
firstindex++;
}
比较第二个数组(股票代码、股票、价格、日期2、数据2ID、数据2Ticker、数据2共享、数据2价格);
//System.out.println(“*************”);
}
public void comparewithsecondarray(ArrayList tickerarray、ArrayList sharesarray、ArrayList pricearray、对象日期2、ArrayList data2id、ArrayList data2ticker、ArrayList data2shares、ArrayList data2price)引发异常{
//获取数组中值的总数
int totalArrayList=tickerarray.size();
int计数器=0;
System.out.println(“已针对第二个数组检查了数组,我们在”+计数器上);
System.out.println(tickerarray);
System.out.println(sharesarray);
System.out.println(“+;
while(计数器计数器2){
布尔blnFound=data2id.contains(位置);
//System.out.println(“arrayList是否包含“+location+”?“+blnFound”);
如果(blnFound){
if(firstindex==-1){
//System.out.println(“ArrayList不包含”+位置);
}否则{
//System.out.println(“ArrayList在索引“+firstindex”处包含“+location+”);
int firstindex=data2id.indexOf(位置);
int lastIndex=data2id.lastIndexOf(位置);
//送去学习
while(第一个索引<最后一个索引){
//系统输出打印(“日期为”+日期1);
objectticker2=data2ticker.get(firstindex);
Object shares2=data2shares.get(firstindex);
对象price2=data2price.get(firstindex);
if(股票代码等于(股票代码2)和股票代码等于(股票代码2)){
System.out.println(“我们有一个匹配项!”);
系统输出打印项次(股票代码);
系统输出打印项次(ticker2);
系统输出打印号(股份);
System.out.println(shares2);
System.out.println(“*******”);
}
//添加到柜台
firstindex++;
}
位置++;
}
}否则{
打破
}
}
对于代码的质量,我先表示歉意,我还是个新手,还在学习中。我认为第一步是确定匹配项,然后有一种方法将这些匹配项(我想是ArrayList)传递给其他类进行分析

任何关于如何实现我这个项目目标的建议都是非常好的(我正在读一本关于遗传算法的书,但它有点难理解,所以我开始复习我在网上找到的所有代码,以了解它是如何实现的)


提前谢谢

我想你可能需要这样的东西:

import java.util.Calendar;

//class representing all your data
public class StockData implements Comparable<StockData>{
    private int id;
    private Calendar date;
    private List<ShareBean> shares;

//this will return whichever StockData that has more total shares as being greater
@Override
public int compareTo(StockData arg0) {
    int totalshares = 0;
    int totalshares2 = 0;
    for(ShareBean share: shares)
        totalshares+=share.getShares();
    for(ShareBean share: arg0.getShares())
        totalshares2+=share.getShares();
    return totalshares-totalshares2;
}
    //this method is used to see if another StockData object has the same id
    @Override
    public boolean equals(Object arg0) {
        try {
        StockData arg1 = (StockData) arg0;
        if (id == arg1.id)
            return true;
        } catch (Exception e) {
        return false;
    }
    return false;
    }

    public void setDate(Calendar date) {
        this.date = date;
    }
    public Calendar getDate() {
    return date;
    }
    public void setId(int id) {
    this.id = id;
        }
        public int getId() {
            return id;
    }


    public void setShares(List<ShareBean> shares) {
    this.shares = shares;
    }

    public List<ShareBean> getShares() {
    return shares;
    }

public String toString(){
    String toReturn = "";
    toReturn+="ID: "+id+"\n";
    toReturn+="Date: "+date.getTime()+"\n";
    for(ShareBean share: shares)
        toReturn+="Shares: "+share.toString()+"\n";
    return toReturn;
}
}
看起来你让这个问题变得比实际需要的复杂得多。如果你想转载你想做的事情,这会让回答你的问题更容易

编辑:我修改了我的StockData类,并添加了另一个类来跟踪股票:

公共类ShareBean{ 专用字符串自动售票机; 私人股份

public ShareBean(String ticker, int shares){
    this.ticker = ticker;
    this.shares = shares;
}

public void setTicker(String ticker) {
    this.ticker = ticker;
}
public String getTicker() {
    return ticker;
}
public void setShares(int shares) {
    this.shares = shares;
}
public int getShares() {
    return shares;
}


public String toString(){
    String toReturn = "";
    toReturn+="Ticker: "+ticker+", Shares: "+shares;
    return toReturn;
}
}
另一编辑:

把这个主要的方法放在某个地方……其实没关系

public static void main(String[] args) {
    List<StockData> listSD1 = new ArrayList<StockData>();
    List<StockData> listSD2 = new ArrayList<StockData>();

    StockData sd1 = new StockData();
    StockData sd2 = new StockData();
    List<ShareBean> listShares1 = new ArrayList<ShareBean>();
    List<ShareBean> listShares2 = new ArrayList<ShareBean>();

    //create the shares for sd1
    listShares1.add(new ShareBean("goog", 3));
    listShares1.add(new ShareBean("ibm", 5));
    listShares1.add(new ShareBean("gs", 0));
    listShares1.add(new ShareBean("msft", 0));
    listShares1.add(new ShareBean("c", 1));

    //create the shares for sd2
    listShares2.add(new ShareBean("goog", 0));
    listShares2.add(new ShareBean("ibm", 1));
    listShares2.add(new ShareBean("gs", 3));
    listShares2.add(new ShareBean("msft", 0));
    listShares2.add(new ShareBean("c", 5));

    //set their ids
    sd1.setId(1);
    sd2.setId(2);

    //set the dates (using calendars)
    sd1.setDate(Calendar.getInstance());
    sd2.setDate(Calendar.getInstance());

    //and finally set the shares
    sd1.setShares(listShares1);
    sd2.setShares(listShares2);

    //now add each object to each list.  the lists will be exacly the same
    listSD1.add(sd1);
    listSD1.add(sd2);
    listSD2.add(sd1);
    listSD2.add(sd2);

    //now the lists are ready, and we can compare them
    //I put the comparewithsecondarray method in the StockData class, but it could go anywhere
    //I also overrode the "toString" method to make the output more readable (in both StockData and ShareBean)
    System.out.println(Arrays.toString(sd1.comparewithsecondarray(listSD1, listSD2).toArray()));
}
publicstaticvoidmain(字符串[]args){
List listSD1=new ArrayList();
L
public ShareBean(String ticker, int shares){
    this.ticker = ticker;
    this.shares = shares;
}

public void setTicker(String ticker) {
    this.ticker = ticker;
}
public String getTicker() {
    return ticker;
}
public void setShares(int shares) {
    this.shares = shares;
}
public int getShares() {
    return shares;
}


public String toString(){
    String toReturn = "";
    toReturn+="Ticker: "+ticker+", Shares: "+shares;
    return toReturn;
}
}
public static void main(String[] args) {
    List<StockData> listSD1 = new ArrayList<StockData>();
    List<StockData> listSD2 = new ArrayList<StockData>();

    StockData sd1 = new StockData();
    StockData sd2 = new StockData();
    List<ShareBean> listShares1 = new ArrayList<ShareBean>();
    List<ShareBean> listShares2 = new ArrayList<ShareBean>();

    //create the shares for sd1
    listShares1.add(new ShareBean("goog", 3));
    listShares1.add(new ShareBean("ibm", 5));
    listShares1.add(new ShareBean("gs", 0));
    listShares1.add(new ShareBean("msft", 0));
    listShares1.add(new ShareBean("c", 1));

    //create the shares for sd2
    listShares2.add(new ShareBean("goog", 0));
    listShares2.add(new ShareBean("ibm", 1));
    listShares2.add(new ShareBean("gs", 3));
    listShares2.add(new ShareBean("msft", 0));
    listShares2.add(new ShareBean("c", 5));

    //set their ids
    sd1.setId(1);
    sd2.setId(2);

    //set the dates (using calendars)
    sd1.setDate(Calendar.getInstance());
    sd2.setDate(Calendar.getInstance());

    //and finally set the shares
    sd1.setShares(listShares1);
    sd2.setShares(listShares2);

    //now add each object to each list.  the lists will be exacly the same
    listSD1.add(sd1);
    listSD1.add(sd2);
    listSD2.add(sd1);
    listSD2.add(sd2);

    //now the lists are ready, and we can compare them
    //I put the comparewithsecondarray method in the StockData class, but it could go anywhere
    //I also overrode the "toString" method to make the output more readable (in both StockData and ShareBean)
    System.out.println(Arrays.toString(sd1.comparewithsecondarray(listSD1, listSD2).toArray()));
}