7 Replies - 955 Views - Last Post: 05 December 2013 - 03:39 PM

#1 RuneChart  Icon User is offline

  • New D.I.C Head

Reputation: 2
  • View blog
  • Posts: 31
  • Joined: 13-July 11

Need help designing an algorithm

Posted 05 December 2013 - 01:52 PM

So, I'm working on a sort of economics game. I'm having trouble with a certain part of it.

In the game, players can buy shares of a company's stock. Every time 1000 shares are sold, the company levels up and the value of each share goes up 10%. (I know this seems strange, but there's a reason I want it to work this way.)

As soon as I coded this, I realized I left open a problematic exploit: If a player comes to the company at 999 shares, he could buy two shares, which would raise the price, and sell them back which would lower it again, and do this repeatedly for infinite money.

So, I concluded that in order for this to work, the program has to offer multiple prices for one large order. For instance, if the player buys 3000 shares, the system needs to charge him one price for the first thousand, 10% more of the second, and 10% more than that for the third.

The thing is, I'm not sure how to represent this mathematically. It's somewhat similar to an acceleration problem in physics, but it's complicated by the fact that acceleration is exponential rather than linear. Anyone with a strong mathematical background able to come up with a formula that will return the correct total for a bulk order, taking into account the changes in the company's "level" that may take place over its course? Thanks for your time, sorry if my explanation of the problem isn't too clear.

Is This A Good Question/Topic? 0
  • +

Replies To: Need help designing an algorithm

#2 macosxnerd101  Icon User is online

  • Self-Trained Economist
  • member icon




Reputation: 10438
  • View blog
  • Posts: 38,654
  • Joined: 27-December 08

Re: Need help designing an algorithm

Posted 05 December 2013 - 02:05 PM

It seems like a numerical approach. I would try something like this. A differential approach wouldn't break it up piecewise as you want.
initial_price := 10
share_amount := k
num_thresholds = ceil(log(k, 10)) //log_{10}(k)
total := 0

for i = 0 to num_thresholds
   price := initial_price + initial_price * 0.10 * i
   
   if(share_amount < 1000){
      total += price * share_amount
   }

   else{
      total += 1000 * share_amount
   }
end for


Was This Post Helpful? 0
  • +
  • -

#3 RuneChart  Icon User is offline

  • New D.I.C Head

Reputation: 2
  • View blog
  • Posts: 31
  • Joined: 13-July 11

Re: Need help designing an algorithm

Posted 05 December 2013 - 02:05 PM

Let's see... I suppose the first step would be to figure out if the purchase will push the company to the next level. Figure out this value, and charge the current price for it.

The next step would be to figure out how many levels it will increase. Maybe a while loop, subtracting 1000 and adjusting the price each time.

Finally, you'd have to figure out how much is left over, and the correct price for that.

I guess what I can do is subtract from the order and start counting backwards. That actually doesn't seem to hard when I write it that way.
Was This Post Helpful? 0
  • +
  • -

#4 modi123_1  Icon User is online

  • Suitor #2
  • member icon



Reputation: 9047
  • View blog
  • Posts: 33,967
  • Joined: 12-June 08

Re: Need help designing an algorithm

Posted 05 December 2013 - 02:12 PM

I am guessing if the stock sells off the company loses it's leveling?

As for the 3000 vs three 1000 stocks purchased you can add modifiers to push for better behavior.. like "fees" and such for a transaction. Push for a specific behavior and what not.
Was This Post Helpful? 0
  • +
  • -

#5 RuneChart  Icon User is offline

  • New D.I.C Head

Reputation: 2
  • View blog
  • Posts: 31
  • Joined: 13-July 11

Re: Need help designing an algorithm

Posted 05 December 2013 - 02:52 PM

@macosxnerd101 - Sorry, I made that last post before I saw yours. Studying your solution now, thanks.

"I am guessing if the stock sells off the company loses it's leveling?"

Yes, that's correct.

" As for the 3000 vs three 1000 stocks purchased you can add modifiers to push for better behavior.. like "fees" and such for a transaction. Push for a specific behavior and what not."

Even if I did that, I'd have to have a way to handle the cases where users decide to act otherwise.
Was This Post Helpful? 0
  • +
  • -

#6 RuneChart  Icon User is offline

  • New D.I.C Head

Reputation: 2
  • View blog
  • Posts: 31
  • Joined: 13-July 11

Re: Need help designing an algorithm

Posted 05 December 2013 - 03:02 PM

@macosxnerd - Ok, I think I understand, but I have two questions.

What is the role of log in calculating num_thresholds? (Showing an embarrassing lack of mathematical literacy here, I know.)

price := initial_price + initial_price * 0.10 * i

Wouldn't this be linear growth instead of the exponential growth the problem calls for?

Nevertheless, I think with some more study, I can create a solution based on what you gave me. Thanks.

EDIT: Maybe
initial_price * 1.10^i
would be better?

This post has been edited by RuneChart: 05 December 2013 - 03:03 PM

Was This Post Helpful? 0
  • +
  • -

#7 RuneChart  Icon User is offline

  • New D.I.C Head

Reputation: 2
  • View blog
  • Posts: 31
  • Joined: 13-July 11

Re: Need help designing an algorithm

Posted 05 December 2013 - 03:16 PM

Ok, what about this? (just assume the initial price is one)

existing_shares := s //bought prior to this transaction
share_amount := k
num_thresholds = ceil (k / 1000) -1
total := 0

for i = 0 to num_thresholds
   price := round(1.10^(i+(existing_shares/1000)))
   
   if(share_amount < 1000){
      total += price * share_amount
   }

   else{
      total += price * 1000
      share_amount -= 1000
   }
end for

Ok, this is still incomplete. It doesn't work if existing_shares is not a multiple of 1000. Let me try again.
Was This Post Helpful? 0
  • +
  • -

#8 RuneChart  Icon User is offline

  • New D.I.C Head

Reputation: 2
  • View blog
  • Posts: 31
  • Joined: 13-July 11

Re: Need help designing an algorithm

Posted 05 December 2013 - 03:39 PM

Ok, I think I got it. Thanks for the advice.

existing_shares := s //the number of shares bought in previous transactions
share_amount := k
num_thresholds = ceil (k / 1000) -1
total := 0

while (share_amount > 0)
   price := round(1.10^(floor(existing_shares/1000)))
   
   shares_to_nextk = nearestk(share_amount) - share_amount
	shares_sold = min(share_amount, shares_to_nextk)
		total += price * shares_sold
		share_amount -= shares_sold
		existing_shares += shares_sold
	
   
end while

Was This Post Helpful? 0
  • +
  • -

Page 1 of 1