📄 hnn.h
字号:
#ifndef HNN_H
#define HNN_H
#define NULL 0
#include <fstream>
#include "Gantt.h"
/*-------------------------------------------------------------------*/
// //
// HNN 类 //
// 说明:Hopfield神经网络类(同时也是其它多种神经网络类的基类) //
// 作用:用连续型Hopfield网络求解JSP问题 //
// //
/*-------------------------------------------------------------------*/
class HNN
{
public:
/*--------------------设置所要解决的调度问题--------------------------*/
//各参数依次为:调度问题的作业数、机器数、机器分配、时间分配
//注:机器分配和时间分配可以在以后单独设置
HNN(int, int, int** = NULL, int** = NULL);
~HNN();
//设置调度问题的机器分配
void setMachine(int**);
//设置调度问题的时间分配
void setTime(int**);
/*--------------------运行网络解决优化调度问题-----------------------*/
//设置神经运动方程的相关参数
void setPara(double, double, double, double, double, double, double = 0.00001, double = 1, double = 1, double = 0.2);
//运行Hopfield网络并达到稳定状态
bool run();
/*------------------------处理调度结果-------------------------------*/
//输出调度结果矩阵
void drawNeroOutputs(GanttHis*);
//绘制调度结果的甘特图
void drawGantt(GanttHis*,int = 0);
//得到调度结果的最大时间成本
int getCost();
//得到运行时间
CString getRunTime();
protected:
/*------------------------算法内部实现------------------------------*/
//初始化偏置电流
void initI();
//初始化神经元输入输出矩阵
void initNeros();
//解神经元运动方程 c*du/dt = -u/r+M
void solveMotionEqu();
//计算神经元输出
void neroOutputs();
//计算神经网络能量函数
void countE();
//累计w*v,得神经运动方程项M
void countM();
//用4阶Runge-Kutta法求解神经网络运动方程
void rungeKutta4();
//用1阶Runge-Kutta法求解神经网络运动方程
void rungeKutta1();
//转换运行时间格式
void formatTime(double);
/*------------------------调试内部状态用-------------------------------*/
//输出调度结果矩阵
void printNeroOutputs();
//输出神经元输入矩阵
void printNeroInputs();
//输出初始化偏置电流
void printI();
//调度问题描述相关信息
int n; //作业总数
int m; //机器总数
int **machine; //作业的机器分配
int **protime; //作业的加工时间分配
//换位矩阵及其所对应神经网络相关信息
int N; //换位矩阵行数
double **u; //神经元输入矩阵
double **v; //神经元输出矩阵
double **th; //δ数组
double **I; //偏置电流
double **M; //神经网络运动方程(c*du/dt = -u/r+M)中M数组
double E; //神经网络能量函数值
//神经运动方程的相关参数
double A, B, C, D1, D2, D3;
double c, R;
double u0;
double dt;//时间步长
//调度结果相关信息
GanttChart *chart; //换位矩阵所对应的甘特图对象
int cost; //调度完成后的最大时间成本
int runMin; //运行时间的分钟部分
int runSec; //运行时间的秒部分
int runMSec; //运行时间的微秒部分
ofstream cout; //文本输出流
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -