Optimal dispatch of power generators - matlab
I want to write a matlab code that can optimally dispatch power generators to satisfy electric demand by considering profit too. I used below code that is in matlab website. https://ww2.mathworks.cn/help/optim/examples/optimal-dispatch-of-power-generators.html?requestedDomain=en
But in this code they are not considering the demand.
My target is , there are 20 power plants and I want to schedule this plants to satisfy demand. And the running power level can be any value in between the max and minimum power value of each power plant. High cost power plants should dispatch too.
name = 'generationcost.xlsx';
poolPrice = xlsread(name,'AD3:AD50'); % Revenue in dollars per MWh in interval
demand = xlsread(name,'AC3:AC52');
month = numel(demand);
e = xlsread(name,'W2:W4')'; %Cost for a unit of fuel
fuelPrice = repmat(e,1,1,2);
nPeriods = length(poolPrice);
nGens = 3;
genhigh = xlsread(name,'F2:F4');
genlow = xlsread(name,'Q2:Q4');
gen = [genlow(:),genhigh(:),]; %MW
fuel = [50,330;45,325;55,750]; % Fuel consumption for generator
startCost = [10000;10000;10000]; %Cost in dollars to start a generator after it has been off
y = optimvar('y',nPeriods,nGens,{'Low','High'},'Type','integer','LowerBound',0,'UpperBound',1);
z = optimvar('z',nPeriods,nGens,'Type','integer','LowerBound',0,'UpperBound',1);
powercons = y(:,:,'Low') + y(:,:,'High') <= 1;
yFuel = zeros(nPeriods,nGens,2);
yFuel(:,1,1) = fuel(1,1);
yFuel(:,1,2) = fuel(1,2);
yFuel(:,2,1) = fuel(2,1);
yFuel(:,2,2) = fuel(2,2);
yFuel(:,3,1) = fuel(3,1);
yFuel(:,3,2) = fuel(3,2);
fuelUsed = sum(reshape((sum(y.*yFuel)),[3 2])');
%fuelcons = fuelUsed <= totalFuel;
w = optimexpr(nPeriods,nGens);
idx = 1:(nPeriods-1);
w(idx,:) = y(idx+1,:,'Low') - y(idx,:,'Low') + y(idx+1,:,'High') -
y(idx,:,'High');
w(nPeriods,:) = y(1,:,'Low') - y(nPeriods,:,'Low') + y(1,:,'High') -
y(nPeriods,:,'High');
switchcons = w - z <= 0;
generatorlevel = zeros(size(yFuel));
generatorlevel(:,1,1) = gen(1,1);
generatorlevel(:,1,2) = gen(1,2);
generatorlevel(:,2,1) = gen(2,1);
generatorlevel(:,2,2) = gen(2,2);
generatorlevel(:,3,1) = gen(3,1);
generatorlevel(:,3,2) = gen(3,2);
revenue = optimexpr(size(y));
for ii = 1:nPeriods
revenue(ii,:,:) = poolPrice(ii)*y(ii,:,:).*generatorlevel(ii,:,:);
end
val = optimexpr(size(y));
demands = optimexpr(nPeriods,1);
id = 1:nPeriods;
val(id,:,:)= y(id,:,:).*generatorlevel(id,:,:);
demands(id,:)= sum(sum(val,3),2);
demandcons = demands-demand ;
fuelCost = sum(sum(fuelPrice.*sum(y.*yFuel)));
startingCost = z*startCost;
profit = sum(sum(sum(revenue))) - fuelCost - sum(startingCost);
dispatch = optimproblem('ObjectiveSense','maximize');
dispatch.Objective = profit;
dispatch.Constraints.powercons = powercons;
dispatch.Constraints.demandcons = demands - demand <= 0 ;
options = optimoptions('intlinprog','Display','final');
[dispatchsol,fval,exitflag,output] = solve(dispatch,'options',options);
subplot(5,1,1)
bar(dispatchsol.y(:,1,1)*gen(1,1)+dispatchsol.y(:,1,2)*gen(1,2),.5,'g')
xlim([.5,48.5])
ylabel('MW')
title('Generator 1 Optimal Schedule','FontWeight','bold')
subplot(5,1,2)
bar(dispatchsol.y(:,2,1)*gen(2,1)+dispatchsol.y(:,2,2)*gen(2,2),.5,'c')
title('Generator 2 Optimal Schedule','FontWeight','bold')
xlim([.5,48.5])
ylabel('MW')
subplot(5,1,3)
bar(dispatchsol.y(:,3,1)*gen(3,1)+dispatchsol.y(:,3,2)*gen(3,2),.5,'c')
title('Generator 3 Optimal Schedule','FontWeight','bold')
xlim([.5,48.5])
ylabel('MW')
subplot(5,1,4)
bar(demand,.5)
xlim([.5,48.5])
title('Daily Demand','FontWeight','bold')
xlabel('Period')
ylabel('MW')
starttimes = find(round(dispatchsol.z) == 1);
[theperiod,thegenerator] = ind2sub(size(dispatchsol.z),starttimes)
This code is not satisfying Demand. The output demand value is more lesser than the actual demand value. And also here only use 'High' or 'Low' power levels only. In between power values not using.
Related
Condition only run ONCE (instead on all bars)
On checking for condition gap(high-low) > 0.1%(which is met multiple times), the label only gets rendered ONCE (instead of on relevant bars within 25 bar lookback). Plz provide a solution. CODE : Historical Bars //#version=5 indicator("PriceMomemtum",overlay = true,max_bars_back = 25) gap = (math.abs(high - low)/low ) * 100 //var gap = (math.abs(high - low)/low ) * 100 if gap > 0.1 var lbl = label.new(x = bar_index,y = na , text = na ,text_font_family = font.family_default ,xloc = xloc.bar_index,yloc =yloc.abovebar,style = label.style_arrowdown ,textcolor = color.white,size =size.small,textalign = text.align_left,tooltip = na) label.set_text(lbl,str.tostring(gap,"#.00")+"%") label.set_xy(lbl,bar_index,high ) Realtime Bars //#version=5 indicator("PriceMomemtum",overlay = true,max_bars_back = 25) if barstate.isrealtime gap = (math.abs(high - low)/low ) * 100 //var gap = (math.abs(high - low)/low ) * 100 if gap > 0.1 var lbl = label.new(x = bar_index,y = na , text = na ,text_font_family = font.family_default ,xloc = xloc.bar_index,yloc =yloc.abovebar,style = label.style_arrowdown ,textcolor = color.white,size =size.small,textalign = text.align_left,tooltip = na) label.set_text(lbl,str.tostring(gap,"#.00")+"%") label.set_xy(lbl,bar_index,high ) alert(str.tostring(time(syminfo.timezone)) + "(PriceMomentum)", alert.freq_once_per_bar)
Have you tried defining "lbl" variable without "var"? result
Code not plotting - Function should be called on each calculation for consistency. It is recommended to extract the call from this scope"
I am getting this as an orange error - not sure what I have done wrong or whether this error is the reason that the code doesn't plot. I am brand new to Pine-script and any assistance would be invaluable. Many thanks in advance Alastair //#version=5 indicator("PCY TEST4") //Get User Inputs fast_length = input(title="Fast Length", defval=12) slow_length = input(title="Slow Length", defval=26) src = input(title="Source", defval=close) signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 50, defval = 9) sma_source = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA", "EMA"]) sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"]) //Variables a = 0.33 PCY = 0.0 PCYi = 0.0 // Calculating fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length) slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length) macd = fast_ma - slow_ma minMacd=0.0 for i = 0 to (signal_length[1]) minMacd := ta.min(macd) maxMacd=0.0 for i = 0 to (signal_length[1]) maxMacd := ta.max(macd) //maxMacd = ta.min(macd) //minMacd = ta.max(macd) //signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length) //hist = macd - signal delta = maxMacd-(fast_ma - slow_ma)/(maxMacd -minMacd) for i = 0 to (signal_length) PCYi := a*((delta - PCYi[1])+PCYi[1]) PCYi //Plotting plot(PCYi)
I think it's because you're calculating the min/max in a for loop Those functions should (not mandatory but strongly recommended) be calculated at every candle instead for i = 0 to (signal_length[1]) minMacd := ta.min(macd) maxMacd=0.0 for i = 0 to (signal_length[1]) maxMacd := ta.max(macd) If you want to calculate the min/max over a X period of time, maybe use the ta.highest/ta.lowest functions instead :) And of course, those 2 should be called at every candle (i.e. not in a if, for,... statement)
Using zero_grad() after loss.backward(), but still receives RuntimeError: "Trying to backward through the graph a second time..."
Below is my implementation of a2c using PyTorch. Upon learning about backpropagation in PyTorch, I have known to zero_grad() the optimizer after each update iteration. However, there is still a RunTime error on second-time backpropagation. def torchworker(number, model): worker_env = gym.make("Taxi-v3").env max_steps_per_episode = 2000 worker_opt = optim.Adam(lr=5e-4, params=model.parameters()) p_history = [] val_history = [] r_history = [] running_reward = 0 episode_count = 0 under = 0 start = time.time() for i in range(2): state = worker_env.reset() episode_reward = 0 penalties = 0 drop = 0 print("Episode {} begins ({})".format(episode_count, number)) worker_env.render() criterion = nn.SmoothL1Loss() time_solve = 0 for _ in range(1, max_steps_per_episode): #worker_env.render() state = torch.tensor(state, dtype=torch.long) action_probs = model.forward(state)[0] critic_value = model.forward(state)[1] val_history.append((state, critic_value[0])) # Choose action action = np.random.choice(6, p=action_probs.detach().numpy()) p_history.append(torch.log(action_probs[action])) # Apply chosen action state, reward, done, _ = worker_env.step(action) r_history.append(reward) episode_reward += reward time_solve += 1 if reward == -10: penalties += 1 elif reward == 20: drop += 1 if done: break # Update running reward to check condition for solving running_reward = (running_reward * (episode_count) + episode_reward) / (episode_count + 1) # Calculate discounted returns returns = deque(maxlen=3500) discounted_sum = 0 for r in r_history[::-1]: discounted_sum = r + gamma * discounted_sum returns.appendleft(discounted_sum) # Calculate actor losses and critic losses loss_actor_value = 0 loss_critic_value = 0 history = zip(p_history, val_history, returns) for log_prob, value, ret in history: diff = ret - value[1] loss_actor_value += -log_prob * diff ret_tensor = torch.tensor(ret, dtype=torch.float32) loss_critic_value += criterion(value[1], ret_tensor) loss = loss_actor_value + 0.1 * loss_critic_value print(loss) # Update params loss.backward() worker_opt.step() worker_opt.zero_grad() # Log details end = time.time() episode_count += 1 if episode_count % 1 == 0: worker_env.render() if running_reward > -50: # Condition to consider the task solved under += 1 if under > 5: print("Solved at episode {} !".format(episode_count)) break I believe there may be something to do with the architecture of my AC model, so I also include it here for reference. class ActorCriticNetwork(nn.Module): def __init__(self, num_inputs, num_hidden, num_actions): super(ActorCriticNetwork, self).__init__() self.embed = nn.Embedding(500, 10) self.fc1 = nn.Linear(10, num_hidden * 2) self.fc2 = nn.Linear(num_hidden * 2, num_hidden) self.c = nn.Linear(num_hidden, 1) self.fc3 = nn.Linear(num_hidden, num_hidden) self.a = nn.Linear(num_hidden, num_actions) def forward(self, x): out = F.relu(self.embed(x)) out = F.relu(self.fc1(out)) out = F.relu(self.fc2(out)) critic = self.c(out) out = F.relu(self.fc3(out.detach())) actor = F.softmax(self.a(out), dim=-1) return actor, critic Would you please tell me what the mistake here is? Thank you in advance.
SOLVED: I forgot to clear the history of probabilities, action-values and rewards after iterations. It is clear why that would cause the issue, as the older elements would cause propagating through old dcgs.
How can I measure Precision and Recall on Logistic Regression with PySpark?
I am using a Logistic Regression model on PySpark through databricks but i am not able to get my precision and recall. Everything works fine and I am able to get my ROC but there is not attribute or lib for Precision and Recall lrModel = LogisticRegression() predictions = bestModel.transform(testData) # Instantiate metrics object results = predictions.select(['probability', 'label']) results_collect = results.collect() results_list = [(float(i[0][0]), 1.0-float(i[1])) for i in results_collect] scoreAndLabels = sc.parallelize(results_list) metrics = MulticlassMetrics(scoreAndLabels) # Overall statistics precision = metrics.precision() recall = metrics.recall() f1Score = metrics.fMeasure() print("Summary Stats") print("Precision = %s" % precision) print("Recall = %s" % recall) print("F1 Score = %s" % f1Score) >>>Summary Stats >>>Precision = 0.0 >>>Recall = 0.0 >>>F1 Score = 0.0
I was able to create my own function to do so. It returns everything and more. I am using the "MulticlassMetrics()" from mllib package. Since its a multiclass it calculates metrics for each label so, you have to specify which label you want to retrieve. ### Model Evaluator User Defined Functions def udfModelEvaluator(dfPredictions, labelColumn='label'): colSelect = dfPredictions.select( [F.col('prediction').cast(DoubleType()) ,F.col(labelColumn).cast(DoubleType()).alias('label')]) metrics = MulticlassMetrics(colSelect.rdd) mAccuracy = metrics.accuracy mPrecision = metrics.precision(1) mRecall = metrics.recall(1) mF1 = metrics.fMeasure(1.0, 1.0) mMatrix = metrics.confusionMatrix().toArray().astype(int) mTP = metrics.confusionMatrix().toArray()[1][1] mTN = metrics.confusionMatrix().toArray()[0][0] mFP = metrics.confusionMatrix().toArray()[0][1] mFN = metrics.confusionMatrix().toArray()[1][0] mResults = [mAccuracy, mPrecision, mRecall, mF1, mMatrix, mTP, mTN, mFP, mFN, "Return [[0]=Accuracy, [1]=Precision, [2]=Recall, [3]=F1, [4]=ConfusionMatrix, [5]=TP, [6]=TN, [7]=FP, [8]=FN]"] return mResults To call the function: metricsList = udfModelEvaluator(predictionsData, "label") metricsList
MATLAB outputs are not updating after running
I've done a project in MATLAB. Outputs stay the same after each running and they are not refreshing. I change the code but outputs stay the same! I've also used clear in the beginning of my main.m. Sometimes there will be a change after restarting the system. This is part of main.m. %mainY.m ---- Codec for Single Video Sequence clear;clc; addpath('.\Videos'); . . . %---------------------Parameters Setting---------------------% yuvfilename = 'foreman_cif_30fps.yuv'; format = 'cif'; frame_rate = 30; GOP_len = 10; % Even ! PrSname = ['GOP',num2str(GOP_len),'_PrS1']; load([PrSname,'.mat']); % Prediction Structure GOP_num = 10; frame_num = GOP_len*GOP_num + 1; init2last = [0,frame_num-1]; blk_sz = 16; subrates = [0.7,0.1]; % Key Parameter of Controlling Bitrate bitdepths = [8,8]; % Key Parameter of Controlling Bitrate total=0; . . . %-----------------------Main Program-------------------------% ... . . . Here is output part: %------------------------Evaluation--------------------------% psnr = zeros(frame_num,1); SSIM = zeros(frame_num,1); for ii = 1:frame_num psnr(ii) = Psnr(Y(:,:,ii),Y_rec(:,:,ii)); SSIM(ii) = ssim(Y(:,:,ii),Y_rec(:,:,ii)); end mean_psnr = mean(psnr); mean_SSIM = mean(SSIM); encode_rate = frame_num/tte; decode_rate = frame_num/ttd; encode_time = tte/frame_num; decode_time = ttd/frame_num; bitrate = (tbs/frame_num)*frame_rate/1000; disp('%-----Evaluation Results-----%') disp(['Qua. Method --> ',Qmethod]) disp(['Rec. Method --> ',Rmethod]) disp(sprintf('Bit-rate = %-8.2f kbps',bitrate)) disp(sprintf('Mean PSNR = %-8.2f dB',mean_psnr)) disp(sprintf('Mean SSIM = %-8.4f ',mean_SSIM)) disp(sprintf('Encoding-rate = %-8.4f frame/s',encode_rate)) disp(sprintf('Decoding-rate = %-8.4f frame/s',decode_rate)) disp(sprintf('Encoding Time = %-8.4f s/frame',encode_time)) disp(sprintf('Decoding Time = %-8.4f s/frame',decode_time))