Solved

Linear Decrease Algorithm

Posted on 2008-06-19
19
409 Views
Last Modified: 2011-10-19
Hello,

Could someone please provide a PHP Algorithm which will result in a smaller value being returned when a larger value is provided.

E.g.

x(25); //returns say 50
x(50); //returns say 49.3
x(100000); //returns say 1 etc

function x($value) {
code..
return($value) {
}

Also i would like it where negative values will not be returned.

Regards Shinji.
0
Comment
Question by:nerotech
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 7
  • 5
  • 4
  • +2
19 Comments
 
LVL 2

Expert Comment

by:kszurek
ID: 21822699
Maybe this:
function x($a)
{
	return rand(0, $a-1);
}
echo x(25);

Open in new window

0
 

Author Comment

by:nerotech
ID: 21822767
Thanks for the response, but this is not what i'm after.

I need it so that the return value is constant, not randomized.
0
 

Author Comment

by:nerotech
ID: 21822861
Note: i should have named the topic "nonlinear decrease algorithm", as i wish to cause the decrease to become more significant as the provided value increases.
0
PeopleSoft Has Never Been Easier

PeopleSoft Adoption Made Smooth & Simple!

On-The-Job Training Is made Intuitive & Easy With WalkMe's On-Screen Guidance Tool.  Claim Your Free WalkMe Account Now

 
LVL 110

Expert Comment

by:Ray Paseur
ID: 21822867
Nerotech: What rules would you apply to determine how much smaller the return value should be?
0
 
LVL 2

Expert Comment

by:kszurek
ID: 21822937
Strange solution:
<?PHP
function x($a)
{
	$b = substr(abs(crc32($a)), 0, 1);
	return ($a-$b > 0 ? $a-$b : 1);
}
echo x(46);
?>

Open in new window

0
 

Author Comment

by:nerotech
ID: 21823038
Well initially I would prefer the returned value to be ~10% less of the provided value, as the value increments I would like the percentage to decrease more rapidly and Eventually the returned value would be 99.9% less than the original.

The point at which 99.9% less should be >=10,000

To summarize:

Start value >=0 && <=25 (-10%)
End value >=10,000 (-99.9%)

Percentage removed per increment will initially start slow, but will become more apparent at ~1,000.
0
 
LVL 49

Expert Comment

by:Roonaan
ID: 21823130
What kind of calculations are you doing? Something like showing an animation in x seconds with a varying start/end or something?
0
 
LVL 20

Expert Comment

by:virmaior
ID: 21823204

function non_linear_decrease($input)
{
  if ($input < 0 ) { return 0; }
  
  $input_temp = $input;
  $multiplier = 1;
  while (($input_temp / 10) )  > 10) {
    $multiplier = $multiplier * .9;
    $input_temp = $input_temp / 10; 
  }
 
  return $input * $multiplier;
}

Open in new window

0
 
LVL 110

Expert Comment

by:Ray Paseur
ID: 21823250
Still not sure I understand the function.  Could you sketch a curve that would show what you're seeking?
nerotech-function.gif
0
 

Author Comment

by:nerotech
ID: 21823363
Yes Ray, thats exactly what i'm after.
0
 
LVL 20

Expert Comment

by:virmaior
ID: 21823398
shinji,
how do the results of the function i supplied compare to what you want?
0
 

Author Comment

by:nerotech
ID: 21823538
Virmaior: its not what i'm after.

Test values:
25-100 (0% difference)
101 (9.1% difference)
10,000 (19% difference)
0
 
LVL 110

Expert Comment

by:Ray Paseur
ID: 21823571
Shinji: I have to leave and can't work on this, but it looks like you need a parabola with a horizontal axis.

http://www.intmath.com/Plane-analytic-geometry/4_Parabola.php

Good luck! ~Ray
0
 
LVL 20

Expert Comment

by:virmaior
ID: 21823627
K‰“Uc_hFg‚mSŒoiFgYK

function nonlinear_decrease($input)
{
   if (($input > 25) and ($input < 100)) { return $input; }
  return $input * (1 - log($input,1.62));
}

that gets the values you are looking for
(19% for 10000) and (9% for 100)
0
 
LVL 20

Expert Comment

by:virmaior
ID: 21823729
or rather return $input * (1 - ( log($input,1.62) / 100));

kore de ha nihon no kanji wo kaite dekimasen. shikashi, saisho no hoshikatta no kotae to ima no sagashiteru no kotae ha chigaimashita no?
0
 

Author Comment

by:nerotech
ID: 21823768
Sorry Virmaior, i should have been less ambiguous with my response (and original question).
Those were the test values & results i used on the function that you provided earlier.

The values i need are:

Start value >=0 && <=25 (-10%)
End value >=10,000 (-99.9%)

with nonlinear increase (see the graph Ray posted).

Ray is correct in pointing out that I require a parabolic function (Quadrant I).
0
 
LVL 110

Accepted Solution

by:
Ray Paseur earned 500 total points
ID: 21827656
nerotech, I looked at this again.  I think you may want an asymptotic curve - not truly a half-parabola, but it meets all the needs you expressed.  HTH, ~Ray
<?php
 
// CONSTRAINED ASYMPTOTE ALGORITHM
// http://en.wikipedia.org/wiki/Asymptote
 
 
define("MINMIN", 0.0);
define("MAXMIN", 25.0); // NOT USED, PRESENT FOR ILLUSTRATION
define("MAXMAX", 10000.0);
define("MINPCT", 0.1);
define("MAXPCT", 0.999);
 
 
function asymptote($value) {
 
// NO VALUES BELOW MINIMUM THRESHOLD
	if ($value <= MINMIN) {
		return FALSE;
	}
 
// COMPUTE A PERCENTAGE
	$percent = $value / MAXMAX;
 
// CONSTRAIN MINIMUM
	if ($percent < MINPCT) {
		return $value - ( $value * MINPCT );
	}
 
// CONSTRAIN MAXIMUM
	if ($percent > MAXPCT) {
		return $value - ( $value * MAXPCT );
	}
 
// WITHIN CONSTRAINTS RETURN DIMINISHED VALUE
	return $value - ( $value * $percent );
 
} // END function asymptote()
 
 
 
$kount = 1.0;
while ($kount < MAXMAX) {
	$asymptote = asymptote($kount);
	$pctg = 1.0 - $asymptote / $kount; // PERCENTAGE OF REDUCTION INCREASES AS VALUE INCREASES 
	echo "<br /> $kount $asymptote $pctg \n";
	$kount++;
}
 
?>

Open in new window

0
 

Author Comment

by:nerotech
ID: 21829081
Great, thanks alot Ray, works perfect! :)
0
 
LVL 110

Expert Comment

by:Ray Paseur
ID: 21830625
Glad to help!  BTW, that algorithm (when unconstrained) is the central element of single-server queueing theory.  Response Time = Service Time divided by (1 - Percent Busy).  I have used it for years to predict computer performance under increasing loads.  Nice to see it serves your needs, too.
0

Featured Post

On Demand Webinar - Networking for the Cloud Era

This webinar discusses:
-Common barriers companies experience when moving to the cloud
-How SD-WAN changes the way we look at networks
-Best practices customers should employ moving forward with cloud migration
-What happens behind the scenes of SteelConnect’s one-click button

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Developers of all skill levels should learn to use current best practices when developing websites. However many developers, new and old, fall into the trap of using deprecated features because this is what so many tutorials and books tell them to u…
Since pre-biblical times, humans have sought ways to keep secrets, and share the secrets selectively.  This article explores the ways PHP can be used to hide and encrypt information.
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…
The viewer will learn how to dynamically set the form action using jQuery.

707 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question