由于线程都涉及多循环,所以我不想通过互斥判断共享变量来实现,那样会极大降低效率。有没有其他什么办法能解决啊?
//循环向a函数每次发送200个字节长度(这个是固定的)的buffer,
//a函数中需要将循环传进来的buffer,组成240字节(也是固定的)的新buffer进行处理,
//在处理的时候每次从新buffer中取两个字节打印
#ifdef WIN32
#pragma warning(disable:4996)
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef WIN32
#include <windows.h>
#include <process.h>
#include <io.h>
#define MYVOID void
#define vsnprintf _vsnprintf
#else
#include <unistd.h>
#include <sys/time.h>
#include <pthread.h>
#define CRITICAL_SECTION pthread_mutex_t
#define MYVOID void *
#endif
//Log{
#define MAXLOGSIZE 20000000
#define MAXLINSIZE 16000
#include <time.h>
#include <sys/timeb.h>
#include <stdarg.h>
char logfilename1[]="MyLog1.log";
char logfilename2[]="MyLog2.log";
static char logstr[MAXLINSIZE+1];
char datestr[16];
char timestr[16];
char mss[4];
CRITICAL_SECTION cs_log;
FILE *flog;
#ifdef WIN32
void Lock(CRITICAL_SECTION *l) {
EnterCriticalSection(l);
}
void Unlock(CRITICAL_SECTION *l) {
LeaveCriticalSection(l);
}
void sleep_ms(int ms) {
Sleep(ms);
}
#else
void Lock(CRITICAL_SECTION *l) {
pthread_mutex_lock(l);
}
void Unlock(CRITICAL_SECTION *l) {
pthread_mutex_unlock(l);
}
void sleep_ms(int ms) {
usleep(ms*1000);
}
#endif
void LogV(const char *pszFmt,va_list argp) {
struct tm *now;
struct timeb tb;
if (NULL==pszFmt||0==pszFmt[0]) return;
vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);
ftime(&tb);
now=localtime(&tb.time);
sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
sprintf(timestr,"%02d:%02d:%02d",now->tm_hour ,now->tm_min ,now->tm_sec );
sprintf(mss,"%03d",tb.millitm);
printf("%s %s.%s %s",datestr,timestr,mss,logstr);
flog=fopen(logfilename1,"a");
if (NULL!=flog) {
fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);
if (ftell(flog)>MAXLOGSIZE) {
fclose(flog);
if (rename(logfilename1,logfilename2)) {
remove(logfilename2);
rename(logfilename1,logfilename2);
}
} else {
fclose(flog);
}
}
}
void Log(const char *pszFmt,...) {
va_list argp;
Lock(&cs_log);
va_start(argp,pszFmt);
LogV(pszFmt,argp);
va_end(argp);
Unlock(&cs_log);
}
//Log}
#define ASIZE 200
#define BSIZE 240
#define CSIZE 2
char Abuf[ASIZE];
char Cbuf[CSIZE];
CRITICAL_SECTION cs_HEX ;
CRITICAL_SECTION cs_BBB ;
struct FIFO_BUFFER {
int head;
int tail;
int size;
char data[BSIZE];
} BBB;
int No_Loop=0;
void HexDump(int cn,char *buf,int len) {
int i,j,k;
char binstr[80];
Lock(&cs_HEX);
for (i=0;i<len;i++) {
if (0==(i%16)) {
sprintf(binstr,"%03d %04x -",cn,i);
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
} else if (15==(i%16)) {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
sprintf(binstr,"%s ",binstr);
for (j=i-15;j<=i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
Log("%s\n",binstr);
} else {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
}
}
if (0!=(i%16)) {
k=16-(i%16);
for (j=0;j<k;j++) {
sprintf(binstr,"%s ",binstr);
}
sprintf(binstr,"%s ",binstr);
k=16-k;
for (j=i-k;j<i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
Log("%s\n",binstr);
}
Unlock(&cs_HEX);
}
int GetFromRBuf(int cn,CRITICAL_SECTION *cs,FIFO_BUFFER *fbuf,char *buf,int len) {
int lent,len1,len2;
lent=0;
Lock(cs);
if (fbuf->size>=len) {
lent=len;
if (fbuf->head+lent>BSIZE) {
len1=BSIZE-fbuf->head;
memcpy(buf ,fbuf->data+fbuf->head,len1);
len2=lent-len1;
memcpy(buf+len1,fbuf->data ,len2);
fbuf->head=len2;
} else {
memcpy(buf ,fbuf->data+fbuf->head,lent);
fbuf->head+=lent;
}
fbuf->size-=lent;
}
Unlock(cs);
return lent;
}
MYVOID thdB(void *pcn) {
char *recv_buf;
int recv_nbytes;
int cn;
int wc;
int pb;
cn=(int)pcn;
Log("%03d thdB thread begin...\n",cn);
while (1) {
sleep_ms(10);
recv_buf=(char *)Cbuf;
recv_nbytes=CSIZE;
wc=0;
while (1) {
pb=GetFromRBuf(cn,&cs_BBB,&BBB,recv_buf,recv_nbytes);
if (pb) {
Log("%03d recv %d bytes\n",cn,pb);
HexDump(cn,recv_buf,pb);
sleep_ms(1);
} else {
sleep_ms(1000);
}
if (No_Loop) break;//
wc++;
if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);
}
if (No_Loop) break;//
}
#ifndef WIN32
pthread_exit(NULL);
#endif
}
int PutToRBuf(int cn,CRITICAL_SECTION *cs,FIFO_BUFFER *fbuf,char *buf,int len) {
int lent,len1,len2;
Lock(cs);
lent=len;
if (fbuf->size+lent>BSIZE) {
lent=BSIZE-fbuf->size;
}
if (fbuf->tail+lent>BSIZE) {
len1=BSIZE-fbuf->tail;
memcpy(fbuf->data+fbuf->tail,buf ,len1);
len2=lent-len1;
memcpy(fbuf->data ,buf+len1,len2);
fbuf->tail=len2;
} else {
memcpy(fbuf->data+fbuf->tail,buf ,lent);
fbuf->tail+=lent;
}
fbuf->size+=lent;
Unlock(cs);
return lent;
}
MYVOID thdA(void *pcn) {
char *send_buf;
int send_nbytes;
int cn;
int wc;
int a;
int pa;
cn=(int)pcn;
Log("%03d thdA thread begin...\n",cn);
a=0;
while (1) {
sleep_ms(100);
memset(Abuf,a,ASIZE);
a=(a+1)%256;
if (16==a) {No_Loop=1;break;}//去掉这句可以让程序一直循环直到按Ctrl+C或Ctrl+Break或当前目录下存在文件No_Loop
send_buf=(char *)Abuf;
send_nbytes=ASIZE;
Log("%03d sending %d bytes\n",cn,send_nbytes);
HexDump(cn,send_buf,send_nbytes);
wc=0;
while (1) {
pa=PutToRBuf(cn,&cs_BBB,&BBB,send_buf,send_nbytes);
Log("%03d sent %d bytes\n",cn,pa);
HexDump(cn,send_buf,pa);
send_buf+=pa;
send_nbytes-=pa;
if (send_nbytes<=0) break;//
sleep_ms(1000);
if (No_Loop) break;//
wc++;
if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);
}
if (No_Loop) break;//
}
#ifndef WIN32
pthread_exit(NULL);
#endif
}
int main() {
#ifdef WIN32
InitializeCriticalSection(&cs_log);
InitializeCriticalSection(&cs_HEX );
InitializeCriticalSection(&cs_BBB );
#else
pthread_t threads[2];
int threadsN;
int rc;
pthread_mutex_init(&cs_log,NULL);
pthread_mutex_init(&cs_HEX,NULL);
pthread_mutex_init(&cs_BBB,NULL);
#endif
Log("Start===========================================================\n");
BBB.head=0;
BBB.tail=0;
BBB.size=0;
#ifdef WIN32
_beginthread((void(__cdecl *)(void *))thdA,0,(void *)1);
_beginthread((void(__cdecl *)(void *))thdB,0,(void *)2);
#else
threadsN=0;
rc=pthread_create(&(threads[threadsN++]),NULL,thdA,(void *)1);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1);
rc=pthread_create(&(threads[threadsN++]),NULL,thdB,(void *)2);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1);
#endif
if (!access("No_Loop",0)) {
remove("No_Loop");
if (!access("No_Loop",0)) {
No_Loop=1;
}
}
while (1) {
sleep_ms(1000);
if (No_Loop) break;//
if (!access("No_Loop",0)) {
No_Loop=1;
}
}
sleep_ms(3000);
Log("End=============================================================\n");
#ifdef WIN32
DeleteCriticalSection(&cs_BBB );
DeleteCriticalSection(&cs_HEX );
DeleteCriticalSection(&cs_log);
#else
pthread_mutex_destroy(&cs_BBB);
pthread_mutex_destroy(&cs_HEX);
pthread_mutex_destroy(&cs_log);
#endif
return 0;
}
lz难道是当1个线程退出后,就掉TerminateThread 强杀其他线程?这么做太危险了吧。
是啊,因为一个线程完成后,其他线程的工作已经没意义……所以直接Exit,在exit前得清内存
lz难道是当1个线程退出后,就掉TerminateThread 强杀其他线程?这么做太危险了吧。
是啊,因为一个线程完成后,其他线程的工作已经没意义……所以直接Exit,在exit前得清内存
另外,exit不是直接退出程序么?那就不能考虑清内存了,系统自动清。
第一个是教材上正确的代码,可以正常多线程运行的 主程序: package com.server; import java.io.*; import java.util.*; import java.net.*; import com.bean.*; import com.biz.ServerBiz; public class ...
接收、处理、发送,三个线程都是一直循环判断指针是否有更新,但这样导致界面切换太卡,请问该怎么处理这三个线程之间的关系才能使界面切换流畅呢,初学C#,如果能给出具体修改代码方法更佳,请大神帮帮忙啊~急!
为什么要使用多线程:单线程只能干一件事,而多线程可以同时干好多事(将任务放到线程里执行 效率高),而所谓同时干并不是真正意义上的同时,只是(这里就叫CPU)cpu在每个线程中随机切换来执行 线程中要干的活。多线程...
对Java多线程、线程池以及在spring中的具体实现的一些浅见一、理解多线程及并发问题需要的前置知识★什么是线程,与进程的区别是什么★JVM内存结构JVM内存结构可分为三大块:运行时数据区可分为五部分:上述各部分的...
使用多线程模拟这一过程 我用卖票和同步锁的方法尝试写出来,但是卡在猴子分去剩余桃子的一半,就是第一只猴子拿了50个,后面的50个是另外两只猴子分的,但是怎么写都写不出来,求教下大神们该如何写,我在这里先7说...
用c c++或者 html+ css+数据库+php 做一个 新人没有奖励 只求大神帮忙 教一下![图片说明]...
单线程只能干一件事 而多线程可以同时干好多事(将任务放到线程里执行 效率高)而所谓同时干并不是真正意义上的同时 只是(这里就叫CPU)cpu在每个线程中随机切换来执行 线程中要干的活多线程编写:1)第一种:...
CString fname[3000]; CString name[1024] ; int j1 ; int nIndex = 0;...void CDisposeXJXDlg::...文本读取或EXCEl处理一两个对话框就结束了或者内存泄露,完全达不到任务要求, 求大神们给指点,真心求教....谢谢了!
JAVA中如何在一个线程里面停掉另一个线程,是在一个线程里面哦 PS:新人第一次问问题,希望大神求教
多线程日志问题:windows 环境下,使用 log4j 记录日志正常,但是在 linux 环境下,多个并发的线程,新的日志会将旧的日志 覆盖掉; 多个线程同时运行,开辟一块内存,A 线程向内存中写日志,正在读取的时候,此时B...
这是创建线程运行的部分 ``` public class LockMapTest { private static SimpleDateFormat format=new SimpleDateFormat("HH:mm:ss:sss"); private static LockMap map=new LockMap(); public static void ...
为什么要使用多线程:单线程只能干一件事 而多线程可以同时干好多事(将任务放到线程里执行 效率高)而所谓同时干并不是真正意义上的同时 只是(这里就叫CPU)cpu在每个线程中随机切换来执行 线程中要干的活多线程编写:...
在flask框架下利用Python的threading或thread多线程库如何操作数据库?萌新在写网站的发送邮件验证,为了防止用户滥发,所以加了权限。前端简单地disable按钮一刷新就没了,纯粹视觉提示作用,所以在后端models里为...
在一个线程池里启动另一个线程池出现了问题 情况大概为 我有2个panel 继承了Runnable接口 在frame里用线程池启动了两个panel 在一个panel里初始化了一个类 这个类也继承了Runnable接口 ...求教大神怎么办
rt,我new一个Thread来获取网络数据,在我的主代码中执行完线程之后才执行UI更新,我的UI更新因为实际需要必须写在方法里,不能写在Hanlder中,所以求大神给解决方案,下面是我部分代码 这是代码 SyncThread st1 = ...
以前看大神的博客,都说没有碰到过内存泄漏或者OOM就不算真正的搞过Android…以前我觉得这事离我还好远…. 没想到,这次真的是遇上了!! 项目需求是这样的:app开机自启,启动之后app就一直在run,是一直run!...
录制音频后 播放速度变快录制音频文件创建实例录音存储遇见的问题 录制音频文件 我使用aduiorecord录制pcm文件 录制代码如下 创建实例 mAudioRecorder = new AudioRecord( mRecorderBuilder.mAudioSource, ...
前文分享了MSF利用MS17-010漏洞进行反弹Shell,再上传勒索病毒,复现了WannaCry勒索病毒。这篇文章作者将继续分析WannaCry勒索病毒,主要通过IDA和OD逆向分析蠕虫传播部分,详细讲解蠕虫是如何感染传播的。...
对你有帮助/启发,感谢资源贡献者:Mi~、appleMan、赖着、蒋哥、Rocky、群主、诚绅、思、其乐无穷、♚Demonァ浅唱 、김위청、回忆满满、风、zhu王源,精选在此,喜欢请收藏,给答题的各位大佬点赞! 我们是一...
这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您们喜欢,一起进步。前文分享了宏病毒相关知识,包括宏病毒基础原理、防御措施、自发邮件及APT28样本分析。...
文章目录[隐藏]关于mybatis中collection一对多关联查询分页出错问题总结 首页博客学院 下载论坛APP 问答商城活动VIP会员专题招聘ITeyeGitChat 图文课 写博客 消息 原 关于mybatis中collection一对多关联查询分页出错...
tensorflow模型推理,两个列表串行,输出结果是第一个列表的循环,新手求教 ``` from __future__ import print_function import argparse from datetime import datetime import os import sys import time...
终于在各种无语的论文作业中解脱了,所以马上抓紧时间来这里更新博客。博主本来计划在Unity3D游戏开发之从《魂斗罗》游戏说起(上)——目标追踪这篇文章后再写一篇《Unity3D游戏开发之从《魂斗罗》游戏说起(下)》,...
关于spring+quartz框架配置多线程调度任务,小弟有一事一直没搞明白 一、quartz.properties中配置: #=============================================================== #Configure Main Scheduler Properties #==...
来自知乎的一个问题引起了我的关注,问题地址是:https://www.zhihu.com/question/42779759在java doc 中 https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html However, this does not ...
public string IPAdress = "xx.xx.xx.xx"; public string ftpUser = "xxx"; public string ftpPassWord = "xxxxxxxx"; public string LocalAdress ... 求教大神!!!!!如何把这段异步上传修改成异步下载!!!
目录大纲前提屏保待机\唤醒\睡眠QApplicationQWSEvent过滤器线程QThreadQT多线程同步之QWaitconditionQt线程使用多线程之Sleep睡眠nanosleep出现异常QElapsedTimer播放器参考文章 前提 运行环境:Qt5.8.0+Linux...
使用webmagic采集博客类的网站示例
利用遗传算法解决矩形排样问题,具有可视化的界面,输入数据为含有矩形的长和宽的文本文件,输出的结果以可视化的形式显示出来
【目录】- MATLAB神经网络30个案例分析(开发实例系列图书) 第1章 BP神经网络的数据分类——语音特征信号分类1 本案例选取了民歌、古筝、摇滚和流行四类不同音乐,用BP神经网络实现对这四类音乐的有效分类。 第2章 BP神经网络的非线性系统建模——非线性函数拟合11 本章拟合的非线性函数为y=x21+x22。 第3章 遗传算法优化BP神经网络——非线性函数拟合21 根据遗传算法和BP神经网络理论,在MATLAB软件中编程实现基于遗传算法优化的BP神经网络非线性系统拟合算法。 第4章 神经网络遗传算法函数极值寻优——非线性函数极值寻优36 对于未知的非线性函数,仅通过函数的输入输出数据难以准确寻找函数极值。这类问题可以通过神经网络结合遗传算法求解,利用神经网络的非线性拟合能力和遗传算法的非线性寻优能力寻找函数极值。 第5章 基于BP_Adaboost的强分类器设计——公司财务预警建模45 BP_Adaboost模型即把BP神经网络作为弱分类器,反复训练BP神经网络预测样本输出,通过Adaboost算法得到多个BP神经网络弱分类器组成的强分类器。 第6章 PID神经元网络解耦控制算法——多变量系统控制54 根据PID神经元网络控制器原理,在MATLAB中编程实现PID神经元网络控制多变量耦合系统。 第7章 RBF网络的回归——非线性函数回归的实现65 本例用RBF网络拟合未知函数,预先设定一个非线性函数,如式y=20+x21-10cos(2πx1)+x22-10cos(2πx2)所示,假定函数解析式不清楚的情况下,随机产生x1,x2和由这两个变量按上式得出的y。将x1,x2作为RBF网络的输入数据,将y作为RBF网络的输出数据,分别建立近似和精确RBF网络进行回归分析,并评价网络拟合效果。 第8章 GRNN的数据预测——基于广义回归神经网络的货运量预测73 根据货运量影响因素的分析,分别取国内生产总值(GDP),工业总产值,铁路运输线路长度,复线里程比重,公路运输线路长度,等级公路比重,铁路货车数量和民用载货汽车数量8项指标因素作为网络输入,以货运总量,铁路货运量和公路货运量3项指标因素作为网络输出,构建GRNN,由于训练数据较少,采取交叉验证方法训练GRNN神经网络,并用循环找出最佳的SPREAD。 第9章 离散Hopfield神经网络的联想记忆——数字识别81 根据Hopfield神经网络相关知识,设计一个具有联想记忆功能的离散型Hopfield神经网络。要求该网络可以正确地识别0~9这10个数字,当数字被一定的噪声干扰后,仍具有较好的识别效果。 第10章 离散Hopfield神经网络的分类——高校科研能力评价90 某机构对20所高校的科研能力进行了调研和评价,试根据调研结果中较为重要的11个评价指标的数据,并结合离散Hopfield神经网络的联想记忆能力,建立离散Hopfield高校科研能力评价模型。 第11章 连续Hopfield神经网络的优化——旅行商问题优化计算100 现对于一个城市数量为10的TSP问题,要求设计一个可以对其进行组合优化的连续型Hopfield神经网络模型,利用该模型可以快速地找到最优(或近似最优)的一条路线。 第12章 SVM的数据分类预测——意大利葡萄酒种类识别112 将这178个样本的50%做为训练集,另50%做为测试集,用训练集对SVM进行训练可以得到分类模型,再用得到的模型对测试集进行类别标签预测。 第13章 SVM的参数优化——如何更好的提升分类器的性能122 本章要解决的问题就是仅仅利用训练集找到分类的最佳参数,不但能够高准确率的预测训练集而且要合理的预测测试集,使得测试集的分类准确率也维持在一个较高水平,即使得得到的SVM分类器的学习能力和推广能力保持一个平衡,避免过学习和欠学习状况发生。 第14章 SVM的回归预测分析——上证指数开盘指数预测133 对上证指数从1990.12.20-2009.08.19每日的开盘数进行回归分析。 第15章 SVM的信息粒化时序回归预测——上证指数开盘指数变化趋势和变化空间预测141 在这个案例里面我们将利用SVM对进行模糊信息粒化后的上证每日的开盘指数进行变化趋势和变化空间的预测。 若您对此书内容有任何疑问,可以凭在线交流卡登录中文论坛与作者交流。 第16章 自组织竞争网络在模式分类中的应用——患者癌症发病预测153 本案例中给出了一个含有60个个体基因表达水平的样本。每个样本中测量了114个基因特征,其中前20个样本是癌症病人的基因表达水平的样本(其中还可能有子类), 中间的20个样本是正常人的基因表达信息样本, 余下的20个样本是待检测的样本(未知它们是否正常)。以下将设法找出癌症与正常样本在基因表达水平上的区别,建立竞争网络模型去预测待检测样本是癌症还是正常样本。 第17章SOM神经网络的数据分类——柴油机故障诊断159 本案例中给出了一个含有8个故障样本的数据集。每个故障样本中有8个特征,分别是前面提及过的:最大压力(P1)、次最大压力(P2)、波形幅度(P3)、上升沿宽度(P4)、波形宽度(P5)、最大余波的宽度(P6)、波形的面积(P7)、起喷压力(P8),使用SOM网络进行故障诊断。 第18章Elman神经网络的数据预测——电力负荷预测模型研究170 根据负荷的历史数据,选定反馈神经网络的输入、输出节点,来反映电力系统负荷运行的内在规律,从而达到预测未来时段负荷的目的。 第19章 概率神经网络的分类预测——基于PNN的变压器故障诊断176 本案例在对油中溶解气体分析法进行深入分析后,以改良三比值法为基础,建立基于概率神经网络的故障诊断模型。 第20章 神经网络变量筛选——基于BP的神经网络变量筛选183 本例将结合BP神经网络应用平均影响值(MIV,Mean Impact Value)方法来说明如何使用神经网络来筛选变量,找到对结果有较大影响的输入项,继而实现使用神经网络进行变量筛选。 第21章 LVQ神经网络的分类——乳腺肿瘤诊断188 威斯康星大学医学院经过多年的收集和整理,建立了一个乳腺肿瘤病灶组织的细胞核显微图像数据库。数据库中包含了细胞核图像的10个量化特征(细胞核半径、质地、周长、面积、光滑性、紧密度、凹陷度、凹陷点数、对称度、断裂度),这些特征与肿瘤的性质有密切的关系。因此,需要建立一个确定的模型来描述数据库中各个量化特征与肿瘤性质的关系,从而可以根据细胞核显微图像的量化特征诊断乳腺肿瘤是良性还是恶性。 第22章 LVQ神经网络的预测——人脸朝向识别198 现采集到一组人脸朝向不同角度时的图像,图像来自不同的10个人,每人5幅图像,人脸的朝向分别为:左方、左前方、前方、右前方和右方。试创建一个LVQ神经网络,对任意给出的人脸图像进行朝向预测和识别。 第23章 小波神经网络的时间序列预测——短时交通流量预测208 根据小波神经网络原理在MATLAB环境中编程实现基于小波神经网络的短时交通流量预测。 第24章 模糊神经网络的预测算法——嘉陵江水质评价218 根据模糊神经网络原理,在MATLAB中编程实现基于模糊神经网络的水质评价算法。 第25章 广义神经网络的聚类算法——网络入侵聚类229 模糊聚类虽然能够对数据聚类挖掘,但是由于网络入侵特征数据维数较多,不同入侵类别间的数据差别较小,不少入侵模式不能被准确分类。本案例采用结合模糊聚类和广义神经网络回归的聚类算法对入侵数据进行分类。 第26章 粒子群优化算法的寻优算法——非线性函数极值寻优236 根据PSO算法原理,在MATLAB中编程实现基于PSO算法的函数极值寻优算法。 第27章 遗传算法优化计算——建模自变量降维243 在第21章中,建立模型时选用的每个样本(即病例)数据包括10个量化特征(细胞核半径、质地、周长、面积、光滑性、紧密度、凹陷度、凹陷点数、对称度、断裂度)的平均值、10个量化特征的标准差和10个量化特征的最坏值(各特征的3个最大数据的平均值)共30个数据。明显,这30个输入自变量相互之间存在一定的关系,并非相互独立的,因此,为了缩短建模时间、提高建模精度,有必要将30个输入自变量中起主要影响因素的自变量筛选出来参与最终的建模。 第28章 基于灰色神经网络的预测算法研究——订单需求预测258 根据灰色神经网络原理,在MATLAB中编程实现基于灰色神经网络的订单需求预测。 第29章 基于Kohonen网络的聚类算法——网络入侵聚类268 根据Kohonen网络原理,在MATLAB软件中编程实现基于Kohonen网络的网络入侵分类算法。 第30章 神经网络GUI的实现——基于GUI的神经网络拟合、模式识别、聚类277 为了便于使用MATLAB编程的新用户,快速地利用神经网络解决实际问题,MATLAB提供了一个基于神经网络工具箱的图形用户界面。考虑到图形用户界面带来的方便和神经网络在数据拟合、模式识别、聚类各个领域的应用,MATLAB R2009a提供了三种神经网络拟合工具箱(拟合工具箱/模式识别工具箱/聚类工具箱)。