[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Help-glpk] Conversion of AMPL model defect #1
From: |
Harley Mackenzie |
Subject: |
Re: [Help-glpk] Conversion of AMPL model defect #1 |
Date: |
Tue, 07 Aug 2012 21:37:59 +1000 |
Thanks Andrew - I knew it was going to be simple but not that simple!
Regards,
Harley
On Tue, Aug 7, 2012, at 21:05, Andrew Makhorin wrote:
> > I am presently working on converting a large AMPL/CPLEX model so I can
> > learn how the model works and also to compare the execution times with
> > CPLEX. I have managed to fix most of the obvious problems but I have a
> > couple of issues that I need to ask for help from the GLPK experts.
> >
> > The first one is a syntactical one:
> >
> > Here is the AMPL code:
> >
> > var BP >= 0;
> > BP = sum {t in DAYS, Cid in BANKING_CONTRACTS} (DBQ[t,Cid] +
> > DWQ[t,Cid]) * 0.0001
> >
> > This code fails with "BP multiply declared" error.
> >
> > I thought it may have been an AMPL defined variable but I have tried a
> > number of different formulations using the WikiBook as a guide but
> > havent had any success.
> >
> > Any ideas?
> >
>
> In constraint statements the 's.t.' keyword may be omitted, so the
> second statement is recognized as a constraint whose name is 'BP' (that
> statement is syntactically incorrect, because a colon should follow a
> constraint name). To fix the error you need to declare 'BP' as a
> parameter rather than a variable:
>
> param BP >= 0, := sum {t in DAYS, Cid in BANKING_CONTRACTS}
> (DBQ[t,Cid] + DWQ[t,Cid]) * 0.0001 ;
>
>
> > This is a model data error and the AMPL code looks reasonable but I
> > keep
> > getting an empty result set.
> >
> > Here is the AMPL code:
> >
> > param effective_MDQ {t in DAYS, Cid in SUPPLY_CONTRACTS} =
> > max {(p,Cid) in DAILY_CONTRACT_PARAMETERS : P2[p] = 1}
> > daily_contract_data[t,Cid,p];
> >
> > I have cut the original problem down to the essentials in the GLPK
> > script below but it is still reasonably complex. The parameter
> > "effective_MDQ" is meant to be calculated as the maximum of the
> > selected
> > parameters for each day and each contract but returns empty content.
> >
> > The print statement:
> >
> > printf {t in DAYS, (p, Cid) in {(p,Cid) in
> > DAILY_CONTRACT_PARAMETERS :
> > P2[p] = 1}}
> > "%d %s %s %4d\n", t, Cid, p, daily_contract_data[t,Cid,p];
> >
> > does print out the expected result in the script, but the max()
> > function
> > in the calculation of the "effective_MDQ" parameter doesnt seem to
> > calculate the maximum and I cant work out how to write the statement
> > to
> > see what elements are being considered for the max() function.
> >
> > The test script prints out the important variables and the final value
> > of the "effective_MDQ" parameter that is empty.
> >
>
> If the declaration
>
> param foo = ...
>
> the expression that follows '=' is a condition, which the parameter
> value should satisfy to. If you want to assign a value to a parameter,
> you need to use ':=' rather than '=', i.e.
>
> param effective_MDQ {t in DAYS, Cid in SUPPLY_CONTRACTS} :=
> max {(p,Cid) in DAILY_CONTRACT_PARAMETERS : P2[p] = 1}
> daily_contract_data[t,Cid,p];
>
>
>
-----
Dr. Harley Mackenzie
HARD software
address@hidden
www.hardsoftware.com
+ 61 3 5222 3435