如何在Pyomo中添加标志约束?

时间:2019-12-12 03:52:20

标签: optimization battery pyomo solar pv

我正在尝试模拟具有充电和放电约束的电池调度模型。 BESS正在通过太阳能光伏系统充电。当我当前运行模型时,在某些时候BESS同时充电和放电。我如何添加标志,以便当Charge>时,Discharge = 0,反之亦然。

def market_constraintx0(模型,t):

actions.js
export const updateArticleMode = data => {
  console.log(data.body);
  return {
    type: CONSTANTS.UPDATE_ARTICLE_MODE,
    data: data.body
  };
};

queryReducer.js
import * as CONSTANTS from "../constants/constants";
const initialState = {
  articleMode: ""
}
case CONSTANTS.UPDATE_ARTICLE_MODE: {
 return {
   ...state,
   articleMode: data.mode
    };
 }
export default queryReducer;
constants.js
export const UPDATE_ARTICLE_MODE = "UPDATE_ARTICLE_MODE";



Display.js

import React from "react";
import { connect } from "react-redux";
import Policy from "../policy";
import Score from "./../score";
import { updateArticleMode } from "../../../../actions/actions";

const articleMode = [
  { name: "Select", id: "-1" },
  { name: "Score", id: "Score" },
  { name: "Policy", id: "Policy" }
]
class Display extends React.PureComponent {
  constructor(props) {
    super(props);
    this.state = {
      articleMode: "-1"
    };
  }
  componentWillMount = () => {
    this.setState({ articleMode: this.props.queryData.articleMode || "-1" });
  };
 _getComponent = () => {
    const { articleMode } = this.state;
    if (articleMode === "Policy") {
      return <DisplayPolicy></DisplayPolicy>;
    }
    if (articleMode === "Score") {
      return <DisplayScore></DisplayScore>;
    }
  }

  render() {
    return (
      <React.Fragment>
 <select name="example"
                className="simpleSearchSelect1"
                value={this.state.articleMode}
                onChange={event => {
                  this.setState({ articleMode: event.target.value });
                  this.props.dispatch(
                    updateArticleMode({ body: { mode: event.target.value } })
                  );
                }}
                style={{ marginLeft: "2px" }}
              >
                {articleMode.length != 0 &&
                  articleMode.map((option, index) => {
                    const { name, id } = option;
                    return (
                      <option key={index} value={id}>
                        {name}
                      </option>
                    );
                  })}
              </select>
    {this.state.articleMode === "-1"
          ? this._renderNoData()
          : this._getComponent()}

     </React.Fragment>
   )}

const mapStateToProps = state => {
  return {
    queryData: state.queryData
  };
};

export default connect(mapStateToProps)(Display);
}

DisplayPolicy.js
import React from "react";

class DisplayPrivacyPolicy extends React.Component {
  constructor(props) {
    super(props);


}<Link
          to={{
            pathname: "/ui/privacy-policy/addNew",
            state: {
              language: "en"
            }
          }}
        >
          <button className="page-header-btn icon_btn display-inline">
            <img
              title="edit"
              className="tableImage"
              src={`${process.env.PUBLIC_URL}/assets/icons/ic_addstore.svg`}
            />
            {`Add New`}
          </button>
        </Link>

AddNew.js

<Link
          to =pathname: "/ui/display",
          className="btn btn-themes btn-rounded btn-sec link-sec-btn"
        >
          Cancel
        </Link>

2 个答案:

答案 0 :(得分:0)

约束

x >= 0 or y >= 0

有时称为互补条件。也可以写成:

x * y = 0   

(我假设x和y是非负变量)。有多种解决方法:

  • 互补性求解器。一些求解器直接支持这种约束。数学编程模型内的互补约束称为MPEC(具有平衡约束的数学编程)。因此,这些求解器有时也称为MPEC求解器。
  • 非线性公式。约束x * y = 0并不是很容易,但是全局求解器应该能够可靠地处理它。但是,这些求解器只能处理相对较小的模型(与本地求解器相比)。
  • 离散配方。使用二进制变量或SOS1构造来表达OR条件。如果模型的其余部分是线性的,则特别有用。

您可能需要查看 pyomo.mpec 。有关更多信息,请参见link

答案 1 :(得分:0)

如果您要坚持(混合整数)线性公式,也可以寻找指标约束,这些约束通常在in this question中进行讨论。诸如CPLEX和Gurobi之类的某些求解器似乎对指标约束具有特定的约束类型,但是我不熟悉如何在Pyomo中使用这些约束。

通常,您可以使用“ Big M”公式来获得类似的功能。就您而言,类似:

model.Indicator = Var(model.T, within=Binary)
model.M = Param(initialize=1000)

def charge_indicator_constraint(model, t):
    return model.M * model.Indicator[t] >= model.Charge[t]
...

def discharge_indicator_constraint(model, t):
    return (1 - model.M) * model.Indicator >= model.Discharge[t]
...

正如我所链接的问题中所讨论的那样,选择model.M的正确值对于保持模型公式“紧”很重要,在您的情况下,您可能会将其直接与的额定功率联系在一起。您的BESS。