#pragma once
#include "pandaAlgorithm.h"
#include <vector>
#include <map>
#include <string>

using namespace std;

class PANDAALGORITHM_API OptScheduling
{
public:
	explicit OptScheduling();
	virtual ~OptScheduling();

	/**
		水泵参数
	*/
	struct PumpStruct
	{
		double a; // 换算系数
		std::vector<double> mS1; // 第i泵站的基本电费
		std::vector<double> mS2; // 别第i泵站的电度电价
		std::vector<std::vector<int>> mNS; // 第i个泵站第j种泵的开机台数
		std::vector<std::vector<double>> mQS; // 第i个泵站第j中泵的供水量
		std::vector<std::vector<double>> mHS;// 第i泵站第j种水泵的计算扬
		std::vector<std::vector< double>> mY;// 第i泵站第j种水泵的计算效率，可由水泵Q～v曲线拟合其关系式
		std::vector<std::vector< double>> mX; // 第两i站第j水泵机组的传动效率
		std::vector<int> mK;  // 第i泵站中定速泵的台数
		std::vector<int> mP; //第i泵站中调速泵的台数
	};

	/**
	* @brief 目标函数，计算适应度值
	* @param [in] monitorVals
	*/
	virtual double objectiveFunction(float cost, const map<string,double>& monitorVals);

	/**
	* @brief 供需压差函数
	* @param [in] HC[i]: 测压点i预测压力值
	* @param [in] HF[I]: 测压点i要求的最低供水服务压力。
	* @return 
	*/
	virtual double pressureDifference(const vector<double>& HC,const vector<double>& HF);

	/**
	* @brief 水泵供水功耗
	* @param 
	* @param
	* @return 
	*/
	virtual double pumpPower(const PumpStruct& pumpParam);

	/**
	* @brief 制水成本
	* @param 
	* @param
	* @return 
	*/
	virtual double waterProductionCost(const vector<double>& Q,const vector<double>& S3);

	/**
	* @brief 供需水量
	* @param [vector<double>] Q[i] 第 i 个泵站调度供水量
	* @param [double] Qd 总需水量，预测
	* @return
	*/
	virtual double waterSupplyAndDemand(const vector<double>& Q, const double& Qd  );

	// 设置监测点的最大值
	void setMaxMonitorVals(const  map<string, double>& maxMonitors);

	// 设置监测点的最小值
	void setMinMonitorsVals(const map<string, double>& minMonitors);

protected:

	// 惩罚因子1
	double C1 = 0.01;

	// 惩罚因子2
	double C2 = 0.01; 

	// 设置的监测点的调度最大值
	map<string, double> mMaxMonitorVals;


	double mMaxVals; // 监测点最大值
	double mMinVals; // 监测点最小是

	// 设置的监测点的调度最小值
	map<string, double> mMinMonitorVals;
};