最大化AMPL利润

问题描述 投票:0回答:1

我在AMPL中需要解决以下问题,我尝试过,但是遇到了一些错误消息:SunTech Electronics在其城市工厂生产DVD刻录机。在接下来的四个时期中,对该产品的估计需求为3,000、8,000、5,000和2,000。在第一阶段初期,SunTech有50名工人。 SunTech花费1,500美元雇用一名工人,并花费5,000美元解雇一名工人。每个时期的工人工资为12,000美元。一个新雇用的工人每个时期最多可以记录50个记录器,而一个以前雇用的工人每个时期最多可以记录80个记录器。每台DVD刻录机的售价为295美元。将DVD刻录机存货一段时间需要15美元。假设在每个时期的开始雇用和解雇工人,并且在任何时期生产的产品都可以满足那个时期的需求。第1阶段开始时的库存为500。假定如果无法通过当前期间的当前库存或生产来满足需求,则损失需求。建立一个数学模型来确定每个时期的工人水平,以最大化SunTech的利润。

我的mod文件看起来像:

 set PERIODS;

param demand{PERIODS};

var w{PERIODS}>=0;  \\worker level at period j
var h{PERIODS}>=0;   \\hiring level at period j
var l{PERIODS}>=0;    \\lay-off level at period j
var s{PERIODS}>=0;     \\amount we store at period j
var n{PERIODS}>=0;    \\total recorders produced in period j
var x{PERIODS}>=0;    \\recorders produced by new workers in period j
var y{PERIODS}>=0;     \\recorders produced by old workers in period j

maximize profit: sum{j in PERIODS}(295*demand[j]-5000*l[j]-1500*h[j]-15*s[j]-12000*w[j]);
subject to w1: w[1]=50;
subject to s1: s[1]=500;
subject to h1: h[1]=0;
subject to l1: l[1]=0;
subject to storage{ j in PERIODS : j > 1 }:x[j]+y[j]- s[j-1] = demand[j]+ s[j];
subject to new_workers{j in PERIODS}: x[j] <= 50*h[j];
subject to old_workers{j in PERIODS : j> 1}: y[j] <= 80*(w[j-1] -l[j]);
subject to season1: x[1] <= 50*50;
subject to season1y : y[1] = 0;
subject to demands{j in PERIODS: j>1} :w[j-1] = w[j]- h[j]+l[j];

和我的.dat文件看起来像:

set PERIODS  := 1 2 3 4;
param demand:= 
1 3000
2 8000 
3 5000 
4 2000;

和我的.run文件看起来像:

 model opthw.mod;
data opthw.dat;
option solver gurobi;
solve;

display profit;
display w;

这是我收到的错误消息:

    (file opthw.run, line 4, offset 55):
error processing param demand:
    2 invalid subscripts discarded:
    demand[3000]
    demand[5000]
Error at _cmdno 2 executing "solve" command
(file opthw.run, line 4, offset 55):
error processing objective profit:
    no value for demand[1]

请协助,我看不到哪里出了问题

optimization ampl
1个回答
0
投票

您的代码对我来说运行正常(将// s更改为#后,给出了利润= 1262500的最佳解决方案。

您可能会尝试的几件事:

  • 先运行reset;,以防以前的运行遗留任何东西干扰运行(尽管从错误消息中,我认为这不是问题)
  • 仔细检查您的代码正在访问正确的.dat文件而不是较旧版本
  • 将您的.dat复制到纯文本编辑器,例如记事本,然后再返回
  • display demand;以检查其按需读取的内容。
© www.soinside.com 2019 - 2024. All rights reserved.