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